2021
HOME

Datenströme über die Stabantenne
Navtex & Co mit RP Pico
Raspberry Pi Pico als Rechteckgenerator hoher Frequenz

Pi Pico and LW RadioAn anderer Stelle auf dieser Seite wird gezeigt, wie mit einem Arduino selber oder mit einem DDS-Baustein AD9850 und Digispark hohe Frequenzen erzeugt werden können, um einfache Radioempfänger SSB-tauglich zu machen. Dies soll nun mit dem €4-Raspberry Pi Pico erfolgen.

Der Ende 2020 erschienene Raspberry Pi Pico ist ein Mikrocontroller, der einige alte Arduino-Zöpfe abschneidet und Neues in den Hobbybereich bringt. Der Pico hat zwei Kerne (Cores) und zusätzlich noch zwei PIO's mit jeweils vier State Machines. Mit diesen sehr schnellen State Machines - eigentlich eigene Mikrocontroller mit reduziertem Befehlssatz - lassen sich unabhängig von den Kernen Ein- und Ausgaben tätigen. Mit dieser Möglichkeit kann der Pico eine Trägerfrequenz erzeugen, so dass z. B. auf dem Retroradio auf Langewelle der Deutsche Wetterdienst mit seinem Fernschreibsignal gehört werden kann, Dazu wird eine Frequenz von 146,3 kHz benötigt, um dem RTTY-Signal mit einer Mittenfrequenz von 1 kHz zu lauschen. Auch höhere Frequenzen sind kein Problem.


Programmierung Beginners All-purpose Symbolic Instruction Code
Das BASIC der 2020er nennt sich Python und zeigt sogar ab und zu Ähnlichkeiten. Der Raspberry Pi Pico kann in C/C++ oder in MicroPython programmiert werden. Zur Zeit dieser Niederschrift gibt es erste Versuche auch die Arduino-IDE an den Pico zu ketten, wobei noch nicht alle Möglichkeiten implementiert sind. Man kann sich folgendes Szenario vorstellen:

An dieser Stelle wird zunächst der letzte Punkt in MicroPython realisiert. Das Begleitbuch zum Raspberry Pi Pico - kostenlos bzw. mit Spende - ist für jedes Einstiegsniveau geeignet, wenn Englisch verstanden wird. Auch ohne irgend welche Vorkenntnisse kann das erste Blinkprogramm in sehr kurzer Zeit erfolgreich nachgebaut werden. Hier zeigt MicoPython seine Stärke. Für das hier gesetzte Ziel greift das im Anhang erläuterte PIO-Beispiel, welches die LED in verschiedenen Helligkeiten zeigt. Das Prinzip PWM wird hier per PIO realisiert - also ein An- und Ausschalten eines Pins ohne Zutun eines der Kerne.

Die Programmierung erfolgte auf einem Windows 10 Tablet und der Software Thonny, wie im Pico-Buch beschrieben völlig problemfrei.


Software 146,3 kHz an Pin 0

Nach den ersten Schritten folgt die Abwandlung des PIO-Beispiels. Dabei werden nur geringe Änderungen vollzogen, so dass eine Minimalanwendung mit der Lösung des formulierten Ziels entsteht. Das folgende Listing erzeugt an Pin 0 die Frequenz 146300 Hertz als symmetrisches Rechteck. Wird das Python-Script als main.py von Thonny aus auf dem Raspberry Pi Pico gespeichert, so startet dieses Skript automatisch, wenn der Pico an Spannung gelegt wird!

from rp2 import PIO, StateMachine, asm_pio
from machine import Pin
import utime

@asm_pio(set_init=PIO.OUT_LOW)
def led_half_brightness():
    set(pins, 0)
    set(pins, 1)

f=146300
pin=0

sm2 = StateMachine(2, led_half_brightness, freq=f*2, set_base=Pin(pin))
sm2.active(1)

while(True):
    utime.sleep(1)

Dass die loop() hier - also while True - nur ein delay(1000) ausführt hat nur den Grund, dass ein pass dazu führt, dass Core 0 so beschäftigt ist, dass sich der Pico von Thonny aus nicht mehr anhalten lässt ohne ein Reset. Core 0 wartet immer nur eine Sekunde und tut sonst nichts. Core 1 schläft und die LED ist aus, nur State Machine 2 arbeitet im Maschinenraum vor sich hin, so dass die Stromaufnahme minimal ist.


Software Einstellbare Frequenz bis MHz - Input
Die Ein- und Ausgaben erfolgen beim Pico über die serielle Schnittstelle UART über TX0/RX0, also Serial auch über USB, wie beim Arduino. Auch Thonny benutzt diese Schnittstelle. Im Abschnitt Ein- und Ausgabe zeigt das Pico-Buch Beispiele wie in MicroPython der Input-Befehl funktioniert. Das Verfahren ist identisch zu ersten Basic-Varianten und darum leicht verständlich. Da der Kern bisher nichts zu tun hat, kann dieser auch auf eine Benutzereingabe warten, um eine neue Frequenz zu erhalten und einzustellen. Auch hier stützt das Script ab, wenn eine nicht-numerische Eingabe erfolgt. Fehler werden hier abgefangen mit try und except, vergleichbar mit on error goto. Falls ein Fehler auftritt, wird das Script bei except fortgeführt und dort erfolgt eine Frequenzerhöhung um 55 Hertz zur Feineinstellung bei niedrigen Frequenzen.

from rp2 import PIO, StateMachine, asm_pio
from machine import Pin
import utime
    
@asm_pio(set_init=PIO.OUT_LOW)
def led_half_brightness():
    set(pins, 0)
    set(pins, 1)

f=146300
pin=0

sm2 = StateMachine(2, led_half_brightness, freq=f*2, set_base=Pin(pin))
sm2.active(1)
while(True):
    a = input("Frequenz in kHz: ")
    try:
        x=float(a)
        f=int(x*1000)
        sm2.active(0)
        sm2 = StateMachine(2, led_half_brightness, freq=f*2, set_base=Pin(pin))
        sm2.active(1)
        print(str(f)+" Hz")
    except:
        print("A - Invalid Argument")
        f=f+55
        sm2.active(0)
        sm2 = StateMachine(2, led_half_brightness, freq=f*2, set_base=Pin(pin))
        sm2.active(1)
        print(str(f)+" Hz")
    utime.sleep(0.1)
  

Serial USB Terminal steuert PicoWird dieses Script als main.py gespeichert, so startet dies beim Einschalten des Pico. Ist der Pico über Host-Adapter per USB mit dem Smartphone verbunden, so kann mit der App Serial USB Terminal die Steuerung erfolgen. Ein Raspberry Pi Pico kann mit einem CDC-Treiber angesprochen werden (USB-Devices - Driver for unknown device: CDC). Ein Prompt fordert die Frequenz in kHz. Diese Eingabe wird in eine Fließpunktzahl gewandelt, wobei Fehler auftreten können, wenn der Anwender nicht-numerische Eingaben tätigt. Der Wert wird in Hertz umgerechnet, die State Maschine angehalten und neu initialisiert. Nach der Aktivierung mit neuer Frequenz gibt Core 0 noch die eingestellte Frequenz zurück. Bei ungültigen Eingaben erfolgt nach einer historischen Fehlermeldung eine Erhöhung um 55 Hz aus akustisch-musikalisch-ästhetischen Gründen.

Abbildung: Frequenz auf Tastendruck mit dem Smartphone


Navtex & Co Anwendung
Navtex & Co Software
Zeitsender mit Taschenradio

Arduino Morse-Decoder
Arduino RTTY-Decoder
Arduino RTTY-Recorder
Tondetekor XR2211
TA7642-LW/MW-Radio
DCF-Funkuhr mit dem Radio
Mit 200 mW um die Welt
Eigener Mittelwellensender

.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt