
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.