Bildbox 1 (klick hier)

Lissajous Figuren auf
Raspberry Pi Pico mit Pimoroni-Display

Hardware

- Raspberry Pi Pico
- Pico Display
- Micro USB Kabel

Die Firma Pimorino bietet für unter 20 Euro ein Display (240x135 Pixel) speziell für den Raspberry Pi Pico an. Das Display kann ohne Experimentierboard direkt über die vorgelötete Buchsenleiste mit dem Pico verbunden werden (siehe Bild oben). Ich habe mir zum Schutz der Hardware, zur besseren Handhabung und zur externen Stromversorgung mit zwei AA bzw. AAA Batterien einige kleine Gehäuse gedruckt, aber dazu später mehr. Zur Programmierung des Micro-Controlers verbinde ich den Pico über das Micro-USB Kabel direkt mit einem Raspberry Pi 4B, der im Desktop Modus läuft oder mit einem Windows 10 Rechner, auf dem Thonny installiert ist. Die Benutzung des Raspberry hat den Vorteil, dass Thonny bereits vorinstalliert ist und der Zugriff auf den Pico auch direkt über die Konsole mittels rshell möglich ist. Und ganz ehrlich, schließe ich den Pico meist an den Raspberry an und verbinde mich per ssh vom Windowsdesktop damit. Da sollte aber jeder seine eigenen Vorlieben nutzen.

Grundlagen

Zum Verständnis, worum es bei den Lissajous-Figuren geht, sind ein paar Erklärungen aus der Physik erforderlich. Keine Angst, das wird jetzt keine Physik-Vorlesung!

Wikipedia sagt dazu: "Lissajous-Figuren sind Kurvengraphen, die durch die Überlagerung zweier harmonischer, rechtwinklig zueinander stehender Schwingungen verschiedener Frequenz entstehen." Wollte man die z.B. früher am Oszilloskop sichtbar machen, gab man zwei Wechselspannungen getrennt auf den X und den Y Eingang (ohne die Zeitablenkung). Je nach Differenz der Frequenz und der Phasenverschiebung, entstehen die nach dem französischen Physiker Lissajous benannten Figuren. Einen besonders schönen Anblick bieten die Kurven bei geringfügiger Abweichung zwischen den Schwingungsfrequenzen, weil durch die langsam rotierende Figur ein 3D-Eindruck entsteht. Bei unterschiedlichen Frequenzverhältnissen entstehen sehr unterschiedliche Figuren, wie wir später sehen werden. Vergleiche dazu unbedingt auch die Ausführungen bei Wikipedia.

Los gehts

1. Bevor Sie den Pico erstmalig an die Stromversorgung anschließen, muss zunächst die Firmware mit der Ansteuerung für das Pico Display von Pimoroni übertragen werden. Gehen Sie dazu auf der Seite von Pimoroni zum Abschnitt 'Getting started' und klicken auf custom MicroPython uf2. Das bringt Sie zu Github, von wo Sie immer die aktuelle uf2-Datei herunterladen (direkter Download Link).

2. Nach dem Download der uf2-Datei muss diese nun auf den Pico übertragen werden. Im ersten Schritt nehmen Sie den Pico im ausgeschalteten Zustand zur Hand und drücken die BootSel-Taste (siehe Beschriftung auf der Platinenrückseite). Die wird gehalten und der Pico erst dann (!!) über das USB-Kabel mit dem Rechner verbunden. Nach dem Verbinden des USB-Kabels kann die Taste BootSel losgelassen werden. Nun öffnet sich im Filesystem ein Explorer-Fenster mit einem neuen Massenspeicher RPI-RP2. Öffnen Sie jetzt auf dem Rechner den Download-Ordner und ziehen die uf2-Datei mit der Firmware auf den Massenspeicher RPI-RP2. Sobald die Firmware-Datei auf den Pico kopiert ist, wird die Firmware ausgeführt und der Massenspeicher wird nicht mehr im Explorerfenster angezeigt. Damit ist die Programmiersprache MicroPython für die Ansteuerung des Pico-Displays auf dem Raspberry Pi Pico installiert und die Programmierung kann über Thonny beginnen.

3. Falls bei der ersten Benutzung von Thonny kein Board erkannt wird, muss in den Interpreter-Einstellungen die Port-Auswahl überprüft werden und ggf. auf MicroPython (Raspberry Pi Pico) eingestellt werden. Klicken Sie dazu ganz unten rechts auf den 'Button'. Das Fenster sollte jetzt so aussehen:

In der unteren Kommandozeile wird der Controler z.B. mit "MicroPython v1.17 on 2021-12-09; Raspberry Pi Pico with RP2040" angezeigt.

So, jetzt geht's aber richtig los. Zunächst werden die Module time und math importiert, das Display initialisiert und einige Variable definiert. Das sehen Sie in den Programmzeilen 1 bis 19. Sie können diese jeweils mit Paste&Copy übernehmen und in Thonny einfügen oder am Ende der Erklärungen das komplette Programm herunterladen.

Achten Sie darauf, dass beim Paste&Copy in Zeile 1 keine Einrückung entsteht, da dies beim Programmstart einen Syntax Error ergibt.
In den Zeilen 3 bis 7 sehen Sie, wie das Display am Anfang eines jeden Programms initialisiert werden muss. Die Zeilen 9 bis 14 erklären sich durch die Kommentare. Wichtig ist, dass die Übertragung an das Display und damit die Darstellung immer erst nach dem 'update'-Befehl wie in Zeile 14 geschieht. In den Zeilen 16 bis 19 definiere ich einige Variable, die später benutzt werden.

Nun wird in den Zeilen 21 bis 45 unsere Funktion zum Zeichnen der Lissajous-Figur definiert. Der Name der Funktion ist bei uns 'draw()' und es werden die Werte der Variable a, f1 und f2 übergeben. Hinweis: Falls Sie die Seite am Smartphone betrachten, kann es vorkommen, dass die Zeilenlänge zu einem Umbruch führt. Dadurch verschiebt sich die Zeilennummerierung, was aber auf Paste&Copy keinen Einfluss hat.


Achten Sie darauf, bei den If-Abfragen und den For-Schleifen immer die Einrückung von 4 Leerzeichen einzuhalten, wie es die Syntax von Python verlangt.
Zur Erklärung der Funktion: Es werden hier 8 aufeinanderfolgende Bilder für den Bewegungseffekt erzeugt. Die Variable i läuft immer von 0 bis 240 (Anzahl der Pixel auf dem Display) in der Schrittweite 3, Die Werte 120 und 67 beziehen sich auf die Mitte des Displays und der Faktor 45 nutzt die Displayhöhe maximal aus.
Die Position der einzelnen Pixel werden durch math.sin(f1*i) (x-Koordinate) und math.sin(f2*i) (y-Koordinate) bestimmt. In unserem Fall sind f1=1 und f2=2. Aus der Tabelle bei Wikipedia können sie entnehmen, für welche Frequenzverhältnisse 'schöne' Figuren entstehen.
Bleibt noch der Hinweis auf die Phasenverschiebung zwischen den einzelnen Bildern mit "+...*math.pi/4". In unserem Fall zwischen 0 und 7 * pi/4 (also 8 Bilder).

Wenn Sie bis hierher alles eingegeben haben und das Programm schon mal starten wollen, seien Sie nicht enttäuscht, denn außer dem Erlöschen der LED passiert noch nichts weiter. Die Funktion 'draw()' wird ja noch von keiner Stelle des Programms aufgerufen. Das werden wir jetzt in einer sich immer wiederholenden Schleife tun.

Die Funktion 'draw(a, f1, f2)' wird 8 mal aufgerufen, dabei wird a jedes mal um eins erhöht und dann wieder auf 1 gesetzt. Anschließend werden die Pixel aus dem Puffer an das Display übergeben. Mit der kurzen Pause 'time.sleep(t)' können Sie die Geschwindigkeit der Darstellung variieren. Speichern Sie das Programm jetzt auf dem Pico oder ihrem Rechner und starten es dann. Wie Sie sehen, hat sich die Mühe gelohnt. Um die senkrechte Achse dreht sich eine räumlich erscheinende endlose parabelförmige Schleife. Vertauschen Sie die Werte der Frequenzen f1 und f2, erfolgt die Drehung um die waagerechte Achse. Experimentieren Sie ruhig ein wenig mit den Variablen.

Zum Abschluss dieses kleinen Projektes biete ich noch ein paar Varianten zum direkten Download an.

1. Das obige Programm in der beschriebenen Form: Lissajous-Figur auf Pi Pico.

2. Das gleiche Programm, aber mit 16 Einzelbildern und Veränderung der Parameter über die Display-Tasten: Lissajous mit Tastenfunktion.

3. Ein kleiner Spass zum Schluss. Wer hier eine Taste drückt, bringt den Pico zur Explosion. Deshalb habe ich das Programm bumm genannt.

Ein letzter Hinweis an dieser Stelle. Wenn Sie eines der Programme (gilt für MicroPython) auf dem Pico unter dem Namen "main.py" abspeichern, startet es immer automatisch bei Stromzufuhr. Sie verlieren jedoch den Zugriff über Thonny. Entweder löschen Sie dann die Datei später in der Konsole mit Hilfe von 'rshell' oder müssen auf dem Windowsrechner den Pico wie am Anfang des Beitrages unter 'Los gehts' beschrieben, komplett zurücksetzen. Deshalb ist es sehr ratsam, Programme während der Experimentierphase nicht nur auf dem Pico, sondern auch auf dem Rechner zu speichern.


Viel Spass und Erfolg beim Ausprobieren.


Zurück