Raspberry Pico W im WLAN mit Python – eine Einführung

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.

Bild Screenshot Thonny IDE einrichten

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)

Bild Screenshot Python interaktiv in Thonny ausprobieren

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).

Bild Screenshot Thonny Module

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

Tiobe Index

 

Teile diesen Beitrag.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert