Den Raspberry Pico gibt es in Ausführungen mit und ohne WLAN. Dabei lässt sich der Raspberry Pico W (kurz Pico W) im WLAN mit Python gut und einfach programmieren. Insbesondere Neueinsteiger stoßen auf wenig Hürden. Im Folgenden finden Sie eine Einführung.
Stand: 16.12.2022 (work in progress)
Inhalt Pico W im WLAN mit Python
Was ist der Raspberry Pico W?
Warum Python?
Thonny IDE für Python laden und einrichten
Pico W anschließen und Micro Python auf den Pico W laden
Thonny IDE für den Pico W anpassen
Erste Python-Experimente mit dem Pico W
Den Pico W ins WLAN bringen
Der Pico W spricht mit einem Webservice
Den Pico W standalone laúfen lassen
Ausblick
Quellen
Was ist der Raspberry Pico W?
Der Raspberry Pico ist eine Microcontroller-Platine so wie ein Arduino, ein Calliope Mini oder ein ESP32. Es werkelt ein RP2040-Prozessor, den die Raspberry Pi Foundation entwickelt hat, darauf. Schnell hat sich um den Pico eine aktive und wachsende Community gebildet. Im Gegensatz zum Raspberry Pi, der ein vollwertiger Kleincomputer mit Betriebssystem auf SD-Karte ist, eignet sich der Pico für einfachere Aufgaben. Die „Einstiegshürden“ sind geringer. Den Pico können Sie mit C/C++ z.B. mit der Arduino-IDE programmieren oder mit MicroPython. Die Thonny IDE macht letzteres besonders einfach. Die Variante Pico W hat nun – so wie auch der ESP32 – WLAN und Bluetooth an Board. Damit lässt sich der Pico W ins heimische Netz einbinden.
Warum Python?
Python hat als Programmiersprache im KI-Umfeld eine besondere Bedeutung. Auch der Raspberry Pi setzt auf Python. Python ist im Tiobe Index im September 2022 auf Platz eins, dicht gefolgt von der zweitplatzierten Sprache C. Python solle einfach zu erlernen sein, den Einstieg erleichtert sicherlich, dass Python interpretiert wird und der lästige Code-Compile-Test Loop entfällt. Für fast alle technischen und ernsthaften wissenschaftlichen Anwendungsfällen gibt es fertige Bibliotheken. Schnell finden Sie für Ihre Problemstellung, ´wie besonders sie auch sein mag, ein Tutorial, dass sie löst.
Python ist ein wenig langsamer als z.B. C, was jedoch meist nicht ins Gewicht fällt. Hinderlich hingegen sind Hintergrundprozesse in Python wie Garbage Collection, die in seltenen Fällen unerwartete Effekte bei Echtzeitanwendungen hervorrufen.
Für den Einstig in Python genügt ein einfacher Texteditor mit Syntax-Highlighting (Sublime Text, Notepad++, Atom). Bequemer ist es mit c.B. Visual Studio Code oder einer kompletten schlanken Entwicklungsumgebung wie die Thonny IDE:
Thonny IDE für Python laden und einrichten
Nutzung der Thonny IDE ist der bequeme Weg, den Pico W mit Python zu programmieren. Alle Beispiele wurden mit einem Macbook unter MacOS ausprobiert.
Thonny herunterladen
Unter https://thonny.org/ finden Sie direkt den Download-Link für die Betriebssysteme Windows, MacOS und Linux. Der Link verweist auf GitHub https://github.com/thonny/thonny/releases/tag/v4.0.1, die installation ist dort auf englisch beschrieben. Für den Mac laden Sie thonny-x.x.x.pkg, die Datei ist nur 40 MB groß. Mit einem Doppelklick starten Sie den Installationsprozess, der etwa 140 MB auf der Festplatte benötigt.
Thonny zum ersten Mal starten und ausprobieren
Starten Sie Thonny und stellen Sie zunächst mit Thonny | Preferences | Interpreter als Interpreter „Lokales Python 3“ ein.
Abb. 1: Thonny Bildschirmdialog für die Einstellungen
Es öffnet sich ein neues Editierfenster. Das Fenster hat noch keinen Namen, wählen Sie Datei | Speichern unter … und speichern Sie als „ersterTest.py“.
Im unteren Teil des Editierfensters können Sie interaktiv einzelne Python Befehle ausprobieren (Abb. 2)
Abb. 2: Python Befehle ausprobieren in der Konsole
Im oberen Teil des Editierfensters können Sie mehrer Python Befehle untereinander schreiben und die Befehlskette (das Python-Programm) speichern, um an einem anderen Tag an Ihrem Programm weiter zu arbeiten. Klicken Sie auf den grünen Pfeil oben in der Leiste, die Ausgaben Ihres Programms sehen Sie dann im unteren Teil des Fensters (Abb. 3).
Abb. 3: Python Programm schreiben und lokal ausführen mit Thonny
Pico W anschließen und Micro Python laden
Schließen Sie den Pico W an Ihren Rechner an. Es passiert nichts, es sei denn, der Pico hat bereits ein Programm, das etwas tut.
Schließen Sie den Pico W an Ihren Rechner an und halten Sie dabei die „BOOTSEL“ Taste gedrückt. Im Dateimanager (Finder auf dem Mac) sehen Sie ein neues Laufwerk „RPI-RP2“. Das Laufwerk enthält zwei Dateien INDEX.HTM und INFO_UF2.HTM. Wenn Sie ein Programm geschrieben haben (eine .uf2-Datei erzeugt haben) kopieren Sie das Programm auf den Pico. Der Pico startet dann selber automatisch neu. Dieser Prozess ist vergleichbar mit dem Aufspielen einer .hex-Datei auf einen Calliope Mini.
Damit Sie direkt Python-Programme auf den Pico laden können, brauchen Sie einen Python-Interpreter. Auch dieser ist nur ein Programm als .uf2-Datei, die sie vorab auf den Pico laden müssen.
Sie bekommen die Datei von der RaspberryPi.com-Seite unter https://www.raspberrypi.com/documentation/microcontrollers/micropython.html. Wichtig ist: Haben Sie einen Pico ohne W benötigen Sie eine andere Datei als für den Pico W. In diesem Falle laden Sie
Raspberry Pi Pico W (with urequests and upip preinstalled)
Die so heruntergeladene uf2-Datei schieben Sie auf Ihr Laufwerk RPI-RP2.
Der Pico startet neu und sollte nun für das interaktive Arbeiten mit Python und der Thonny-IDE bereit sein.
Sollten Sie die falsche Datei installiert haben, werde Sie es spätestens merken, wenn Sie für den Befehl import network eine Fehlermeldung bekommen.
UPDATE FÜR MAC USER 16.12.2022: Mit MacOS Ventura und Änderungen in der Art, wie der Finder mit Dateien umgeht, kann dazu führen, dass geübte Praxis mit dem Pico (und anderen Microcontrollern) nicht mehr funktioniert (Stand November 2022) . Anscheinend hat Apple das Probelm just behoben, nachzulesen hier: https://www.raspberrypi.com/news/the-ventura-problem/https://www.raspberrypi.com/news/the-ventura-problem/. Ich selber untersuche das gerade noch …
Thonny IDE für den Pico W anpassen
Sollten Sie einmal den unteren Teil mit der Kommandozeile nicht sehen, aktivieren Sie ihn mit Ansicht | Kommandozeile.
Stellen Sie mit Thonny | Preferences | Interpreter als Interpreter „MicroPython (Raspberry Pi Pico“ ein.
In der Kommadozeile (unteres Thonny-Fenster) geben Sie ein:
help(„modules“)
Wenn Sie die Module sehen, die Sie nun verwenden können und „network“ ist dabei (Abb. 4), haben Sie vermutlich alles richtig eingestellt.
Abb. 4: Pico W angeschlossen, Anzeige der Module
Erste Python-Experimente mit dem Pico W
Nun können Sie Python interaktiv über die Kommandozeile auf dem Pico W ausprobieren oder kleine Programme schreiben. Als erstes bringen Sie die Leuchtdiode auf dem Pico zum Blitzen. Im Folgenden benennen Sie das Progamm immer „main.py“, so können Sie es später als „Stand alone Programm“ auf den Pico spielen.
Schreiben Sie im Editor (oberes Thonny Fenster) folgenden Quellcode:
# Bibliotheken laden import machine import network import rp2 import utime as time import urequests as requests # Status-LED led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0) # Funktion: LED-Blitzer def blink(anzahl): for k in range (anzahl): led_onboard.on() time.sleep_ms(8) led_onboard.off() time.sleep_ms(96) # Dauerschleife while (1==1): print('Blink 2') blink(2) time.sleep(3) print('Blink 5') blink(5) time.sleep(3)
Listing 1: Ein Dauer-LED-Blitzer
Starten Sie das Programm mit einem Klick auf den grünen Pfeil. Damit wird das Program auf den Pico geladen und automatisch gestartet. Im Ausgabefenster sollten sie alle drei Sekunden „Blink 2“ bzw „Blink 5“ sehen, die grüne LED auf dem Pico blitzt zweimal und fünf Mal auf.
Den Pico W ins WLAN bringen
Erweitern Sie Ihr Programm wie in Listing 2. Es enthält Aufrufe für die Verbindung mit Ihrem WLAN. Sie benötigen Ihre SSID (WLAN-Name) und Ihr WLAN-Zugangspasswort.
# Bibliotheken laden import machine import network import rp2 import utime as time import urequests as requests # Status-LED led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0) # WLAN-Konfiguration # hier Ihre SSID wlSsid = 'xxxxxxxxxxx' # hier Ihr Passwort wlPw = 'xxxxxxxxxxxx' rp2.country('DE') # Funktion: LED-Blitzer def blink(anzahl): for k in range (anzahl): led_onboard.on() time.sleep_ms(8) led_onboard.off() time.sleep_ms(96) # Funktion: WLAN-Verbindung def wlanConnect(): wlan = network.WLAN(network.STA_IF) if not wlan.isconnected(): print('WLAN-Verbindung aufbauen') wlan.active(True) wlan.connect(wlSsid, wlPw) for i in range(10): if wlan.status() < 0 or wlan.status() >= 3: break led_onboard.toggle() print('->', wlan.status()) time.sleep(0.5) if wlan.isconnected(): print('WLAN-Verbindung ok') led_onboard.on() print('WLAN-Status:', wlan.status()) netConfig = wlan.ifconfig() print('IPv4-Adresse:', netConfig[0], '/', netConfig[1]) print('Standard-Gateway:', netConfig[2]) print('DNS-Server:', netConfig[3]) time.sleep(3) led_onboard.off() else: print('Keine WLAN-Verbindung') led_onboard.off() print('WLAN-Status:', wlan.status()) # WLAN-Verbindung herstellen wlanConnect() # Dauerschleife while (1==1): blink(2) time.sleep(10)
Listing 2: Der Dauer-LED-Blitzer nimmt Kontakt zum heimischen WLAN auf.
Diesen Code können Sie nun so erweitern, dass der Pico Daten aus dem Internet holt oder auf einen Internetserver transferiert. Für das erste verwenden Sie z.B. wie hier einen Wetterdienst, für das zweite schreiben Sie sich ein kleines Script auf Ihrem Webserver.
Schreiben Sie nun in Ihren Code hinein (Am Anfang dort, wo andere Variablen gesetzt werden):
# Aufruf URL urlWetter="http://wttr.in/willich"
Listing 3: Ein Wetterdienst (sieht nicht schön aus und wird noch ersetzt)
Sie brauchen noch eine Funktion, die einen http-Aufruf durchführt. Schreiben Sie die Funktion hinter die anderen Funktionen.
# Funktion eines Internt-Aufrufs # nur die URL muss uebergeben werden def httpAufruf(url): # HTTP-Request senden print('Request: GET', url) response = requests.get(url) if response.status_code == 200: print('Response:', response.content, 'Code:', response.status_code) blink(2) else: print('Status-Code:', response.status_code) print('Fehler:', response.reason) response.close() blink(5)
Listing 4: Eine Funktion für den http-Aufruf
Die Funktion rufen Sie dann auf mit
httpAufruf(urlWetter)
Der Pico W spricht mit einem eigenen Webservice
Insbesondere wenn Sie den Pico als IoT-Device (ein kleines Gerät, das etwas misst und die Daten an einen Internet-Server überträgt) einsetzen wollen, brauchen Sie einen Programm im Internet, dass die Daten entgegennimmt. Den folgenden Webservice können Sie für einige wenige Tests nutzen, sollten aber dann das Script auf einen eigenen Webserver aufspielen.
Erweitern Sie Ihr Python-Programm um folgende Zeilen:
urlUp="https://cbrell.de/test/220913picoWS/picoWS.php?x=Claus-1933"
Ersetzen Sie dabei „Claus“ durch Ihren Vornahmen – aber ohne Umlaute – und „1933“ durch Ihr Geburtsjahr. Es sollen keine Umlaute, Sonderzeichen und Leerzeichen auftauchen.
Der Aufruft ist dann wie oben
httpAufruf(urlUp)
Ob Ihre Daten angekommen sind, können Sie mit dem Browser testen mit dem Aufruf
https://cbrell.de/test/220913/LOG/Claus-1933.csv
Wollen Sie so etwas für Ihre eigenen Daten verwenden, z.B. einen Temperaturlogger, können sie das folgende PHP-Script für Ihre Zwecke anpassen.
<?php /* picoWS Claus Brell speichert Daten in Logdateien Standort: cbrell.de/test/220913picoWS/picoWS.php erste Erstellung 12.02.2021, Anpassung 13.09.2022: Aufruf: picoWS.php?x=Vorname-Geburtsdatum */ // Vorbelegungen $log="LOG/"; /* Daten aus Übergabestring übernehmen erwartet: x=Vorname-Geburtsdatum alle Daten Text Fehlerbehandlung und Rückgabe: 0 fehlerfrei 1 Fehler */ $fehler=0; if (!isset($_GET['x'])) $fehler="1 Fehler: keine Parameter"; if (strlen($_GET['x'])<3 or strlen($_GET['x'])>256) $fehler="2 Fehler: falsche Laenge"; if ($fehler!=0) exit ($fehler); // Daten enoden und übernehmen $x=urldecode($_GET['x']); // Daten in Textdatei speichern $zeit=date('ymd-His'); $zeitstempel=time(); // Sicherung in Datei file_put_contents ( $log.$x.".txt" , $x.' ; '.$zeit); echo $fehler; ?>
Listing 5: Ein einfacher Webservice in PHP.
Das komplette Programm für den Pico W ist in Listing 6 gezeigt. Die vorigen Experimente sind herausgenommen.
# Bibliotheken laden import machine import network import rp2 import utime as time import urequests as requests # Status-LED led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0) # WLAN-Konfiguration # hier Ihre SSID wlSsid = 'Gloryhammer' # hier Ihr Passwort wlPw = 'dada08154711' rp2.country('DE') # Aufruf URL urlUp="https://cbrell.de/test/220913picoWS/picoWS.php?x=Claus-1933" urlDown="https://cbrell.de/test/220913picoWS/LOG/Claus-1933.txt" # Funktion: LED-Blitzer def blink(anzahl): for k in range (anzahl): led_onboard.on() time.sleep_ms(16) led_onboard.off() time.sleep_ms(128) # Funktion: WLAN-Verbindung def wlanConnect(): wlan = network.WLAN(network.STA_IF) wlan.active(True) print(wlan.scan()) print('WLAN-Verbindung aufbauen') wlan.connect(wlSsid, wlPw) while not wlan.isconnected(): blink(1) print('WLAN-Status:', wlan.status()) time.sleep(1) if wlan.isconnected(): print('WLAN-Verbindung ok') led_onboard.on() print('WLAN-Status:', wlan.status()) netConfig = wlan.ifconfig() print('IPv4-Adresse:', netConfig[0], '/', netConfig[1]) print('Standard-Gateway:', netConfig[2]) print('DNS-Server:', netConfig[3]) time.sleep(3) blink(5) else: print('Etwas ist schiefgegangen') def httpAufruf(url): # HTTP-Request senden print('Request: GET', url) response = requests.get(url) if response.status_code == 200: print('Response:', response.content, 'Code:', response.status_code) blink(2) else: print('Status-Code:', response.status_code) print('Fehler:', response.reason) response.close() blink(20) # WLAN-Verbindung herstellen wlanConnect() # Dauerschleife while (1==1): httpAufruf(urlUp) httpAufruf(urlDown) time.sleep(10)
Listing 6: Ein IoT Client Rohling für den Pico W in Python
Den Pico W stand alone laufen lassen
Bislang funktioniert das nur, wenn der Pico W am Comuter angeschlossen und die Thonny-IDE aktiv ist. Das ist unpraktisch, wenn der Pico eigenständig z.B. mit einem Batteriepack im Garten laufen soll. Dazu fehlt nur noch ein kleiner Schritt.
Wenn der Pico mit gedrückert BOOTSEL Taste angeschlossen wird, präsentiert er sich als Laufwerk. Die Firmware mit Micro Python sorgt nun dafür, das ein Python-Programm, das „main.py“ heißt, für den stand alone Betrieb übernommen wird.
Speichern Sie nun Ihr Programm aus der Thonny-IDE auf Ihren Computer unter dem Namen main.py. Stecken Sie sodann den Pico W ein. Kopieren Sie die Datei main.py in das Laufwerk RPI-RP2. Der Pico führt nun, immer wenn neu gestartet, dieses Programm aus.
Ausblick
Die Uhrzeit von einem Webservice berechnen zu lassen ist wenig spannend. Es ist jetzt nur noch ein kleiner Schritt, aus dem Pico W z.B. einen WLAN-Temperaturlogger zu machen.
Quellen
Einer von vielen Python-Kursen im Internet: https://www.python-kurs.eu/python3_kurs.php
Offizielle Seite der Raspberry Foundation: https://www.raspberrypi.org/
Offizielle Pico Micro Python SDK Dokumentation: https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-python-sdk.pdf
Übersicht der Raspberry -Projektseiten auf cbrell.de