RPi-Pico Serielle Übertragung                  


Elektronik-Labor  Projekte  Mikrocontroller  Raspberry            




Der Pico verfügt über zwei serielle Schnittstellen, UART0 und UART1. Hier sollen Daten über UART1 gesendet und empfangen werden. Die Sendeleitung tx liegt an GP4, die Empfangsleitung rx an GP5. Beide Anschlüsse sind direkt verbunden. Die Infrarot-Sendediode ist vom letzten Versuch übrig geblieben und soll später verwendet werden, um die Signale über Infrarot zu senden.

#UART1.py 
from machine import Pin, Timer, PWM, UART
uart1 = UART(1, baudrate=1200, tx=Pin(4), rx=Pin(5))
import time

while (True):
    uart1.write("Hallo") 
    time.sleep(0.5)
    print (uart1.read())  




Das Programm sendet einen Text, der dann über rx wieder empfangen wird. Die Ausgabe b'Hallo' bedeutet, dass ein Byte-Objekt empfangen wurde. Im zweiten Versuch wurde mit einer Str-Umwandlung erreicht, dass ein normaler Text angezeigt wird. Außerdem gibt es nun die Möglichkeit, den zu sendenden Text selbst einzugeben.

#UART2.py
from machine import Pin, Timer, PWM, UART
uart1 = UART(1, baudrate=1200, tx=Pin(4), rx=Pin(5))
import time

while (True):
    nachricht = ""
    nachricht = input("Senden: ")         
    time.sleep(0.1)
    if nachricht > "":       
        uart1.write(nachricht) 
    time.sleep(0.1)
    print ("Empfangen: ",str(uart1.read(), 'utf-8'))        
      


Infrarot-Übertragung



Nun laufen die Daten über eine Infrarot-Strecke. Die IR-Sendediode wird wieder mit 38 kHz getaktet, und das gesamte Signal wird vom seriellen Ausgang gesteuert. Die IR-Diode ligt mit der Kathode an tx und mit der Anode an PWM0.  Der Empfänger auf der gleichen  Platine liefert die seriellen Empfangssignale an den UART-Eingang rx. Anfangs gab es Übertragungsprobleme, weil der IR-Empfänger kurze Störimpulse lieferte. Die String-Umwandlung führte dann zu Abstürzen. In der direkten Anzeige mit der auskommentierten Print-Zeile waren die Fehler direkt lesbar. Eine Verringerung der Baudrate brachte eine Besserung, aber die Fehler tauchten unregelmäßig wieder auf.

Das eigentliche Problem lag in Störungen auf der Betriebsspannung, die durch ein Smartphone am gleichen USB-Hub verursacht wurden. Eigentlich sollte der Empfänger ja mit den stabilisierten 3,3 V betrieben werden. Ich hatte jedoch nur ältere Typen für 5 V. Die entscheidende Verbesserung brachte eine Glättung der Betriebsspannung mit 1 k und 100 µF. Zusätzlich liegen noch 100 nF parallel.

#UART2IR.py
from machine import Pin, Timer, PWM, UART
p5 = Pin(5, Pin.IN, Pin.PULL_UP)
uart1 = UART(1, baudrate=300, tx=Pin(4), rx=Pin(5))
import time

pwm0 = PWM(Pin(0))
pwm0.freq(38000)
pwm0.duty_u16(16000)

while (True):
    nachricht = " " + input("Senden: ")   
    uart1.write(nachricht) 
    time.sleep(0.5)
    print ("Empfangen: ",str(uart1.read(), 'utf-8'))        
    #print ("Empfangen: ", uart1.read())

Bei der Einrichtung des UART wird der RX-Pin offensichtlich als Eingang geschaltet, aber der übliche Pulldown bleibt aktiv. Das führt zu einem geringen Signalpegel vom Empfänger-IC, das selbst nur einen recht hochohmigen Pullup hat und die Signale aktiv low zieht. Deshalb habe ich IO5 zuerst als Eingang mit Pullup initalisiert, was dann erhalten blieb.



Mit diesem Programm könnte man nun einen regelrechten Funkverkehr üben. Um eine Nachricht der Gegenseite zu empfangen, tippt man nur Enter und sendet damit eine leere Nachricht nur einem Leerzeichen. Auf dem Schirm erscheint dann die Nachricht einer Gegenstation. Die Sende-Empfangs-Umschaltung ist allerdings noch verbesserungswürdig. Im ersten Versuch sollte nur die die Übertragung selbst getestet werden.