Der Raspberry Pi Pico W kombiniert den RP 2040-Mikrocontroller mit einem aus dem Hause Infineon stammenden WLAN-Modul. Wie die „praktische Integration“ auf MicroPython-Ebene gelöst ist, wie die Programmier-Schnittstellen ausfallen und welche Unterschiede Umsteiger beachten müssen, klärt dieser Folgeartikel.
Zum Geleit
Statt einer Einleitung sei auf den unter der URL Beitrag "Raspbery Pi Pico W – RP2040 mit WLAN" bereitstehenden Vorgängerartikel verwiesen - er enthält eine „grobe“ Beschreibung der Hardware des RP2040 bzw. Raspberry Pi Pico W, und geht auch darauf ein, warum das WLAN-Modul nicht von „Towarisch Haxxor“ in ein WLAN-Bluetooth-Modul umgewandelt werden kann.
Erstes Problem: LED!
So gut wie alle als „Embedded-Boards“ vorgesehene Prozessrechner bringen eine Hello World-Leuchtdiode mit - die ein Arduino Uno mit dem berühmten-berüchtigten Pin dreizehn verbundenen Diode ist seither quasi Standard. Am Raspberry Pi Pico lässt sich die LED unter MicroPython nach folgendem Schema aktivieren:
1 |
from machine import Pin |
2 |
led = Pin(25, Pin.OUT) |
3 |
led.value(1) |
4 |
led.value(0) |
Am Raspberry Pi Pico W gibt es in diesem Bereich eine Umstellung: Die Leuchtdiode ist nicht mehr direkt mit dem Mikrocontroller gebunden, sondern wird nun über das Funkmodul angesprochen, das seinerseits nämlich ebenfalls eine Gruppe von GPIO-Pins exponiert. Der zum Blinken mit dem neuartigen Raspberry Pi notwendige Code sieht folgendermaßen aus:
1 |
from machine import Pin |
2 |
led = Pin("LED", Pin.OUT) |
3 |
led.on() |
4 |
led.off() |
Erkennung der Unterschiede
Es gibt immer wieder Situationen, in denen ein Skript davon profitieren könnte, wenn es per Reflexion zur Laufzeit feststellen kann, auf „welcher Art“ von Uptonitischern Prozessrechner es gerade zur Ausführung gelangt. „Direkt“ wird dieses Begehr in der Runtime nicht unterstützt - die Dokumentation teilt dem Entwickler lapidar folgendes mit:
1 |
There is no direct method for software written in MircoPython to discover whether it is running on a Raspberry Pi Pico or a Pico W by looking at the hardware |
Zur Umgehung des Problems stehen allerdings gleich zwei Codesnippets zur Verfügung, die wir nach folgendem Schema unkommentiert stehen lassen wollen:
1 |
import network |
2 |
if hasattr(network, "WLAN"): |
3 |
print ("Pico W) |
4 |
|
5 |
- - - - - -
|
6 |
|
7 |
>>> import sys
|
8 |
>>
|
9 |
>> sys.implementation
|
10 |
(name='micropython', version=(1, 19, 1), _machine='Raspberry Pi Pico W with RP2040', _mpy=4102)
|
Verbindungsaufbau per WLAN!
Funkstacks stehen seit jeher - zumindest bis zu einem gewissen Grad - in der Reputation, nicht sonderlich benutzerfreundlich zu sein. Nicht umsonst warb Texas Instruments bei der Auslieferung eines neuen Chips damit, dass der hauseigene Stack „menschenfreundlich“ konzipiert und leicht zu bedienen sei. Für den Verbindungsaufbau zu einem „in der Umgebung“ befindlichen WLAN ist auf dem Raspberry Pi Pico W nach folgendem Schema aufgebauter Code notwendig:
1 |
wlan.connect("Tamoggemon Holding k.s. WiFi BA2", "pwd") |
2 |
max_wait = 10 |
3 |
while max_wait > 0: |
4 |
if wlan.status() < 0 or wlan.status() >= 3: |
5 |
break
|
6 |
max_wait -= 1 |
7 |
print('waiting for connection...') |
8 |
time.sleep(1) |
Angemerkt sei an dieser Stelle allerdings, dass es sich dabei um kein Raspberry Pi-Spezifikum handelt: Wer MicroPython beispielsweise auf einem ESP 32 verwendet, findet - zumindest im Allgemeinen - dieselbe API vor. Weitere Informationen hierzu finden sich auch im unter https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf bereitstehenden PDF.
Analyse des Strombedarfs
Dass WLAN für Ultra-Low-Power-Anwendungen eher schlecht als recht geeignet ist, können wir bei Lesern von Microcontroller.net als bekannt annehmen. Im Interesse der Lustigkeit hat der Autor trotzdem einige Energieverbrauchs-Messungen durchgeführt. Im Interesse der Fairness sei an dieser Stelle angemerkt, dass das WLAN-Modul „von Haus aus“ in einen Stromsparmodus arbeitet. Wer die „maximale“ Leistung abrufen möchte, muss dies durch nach folgendem Schema aufgebauten Code tun:
1 |
wlan = network.WLAN(network.STA_IF) |
2 |
wlan.active(True) |
3 |
wlan.config(pm = 0xa11140) |
Im nächsten Schritt stellt sich die Frage, „wie“ Energieversorgung und Messung erfolgten. Im Interesse der Bequemlichkeit setzte der Autor sowohl für die Stromversorgung als auch für die Messung der Energieaufnahme auf sein Labornetzteil Hewlett Packard 6624A. Der Raspberry Pi Pico bekam anfangs folgendes Script als main.py eingeschrieben:
1 |
from machine import Pin |
2 |
import time |
3 |
led = Pin(25, Pin.OUT) |
4 |
while 1: |
5 |
led.value(1) |
6 |
time.sleep(5) |
7 |
led.value(0) |
8 |
time.sleep(2) |
Die Energieversorgung erfolgt über Vsys – Vbus wäre direkt mit dem USB-Kabel verbunden, und würde dem 6624A das “Grillen” des USB-Hubs erlauben, wenn man das (immer empfehleswerte) Abstecken des Kabels vergisst. Das 6624A mass dann jedenfalls zwischen 17 und 20 mA Stromverbrauch. Am Zero W kam danach folgendes Testprogramm zum Einsatz:
1 |
from machine import Pin |
2 |
import time |
3 |
led = Pin("LED", Pin.OUT) |
4 |
while 1: |
5 |
led.on() |
6 |
time.sleep(5) |
7 |
led.off() |
8 |
time.sleep(2) |
Der gemessene Stromverbrauch pendelte nun zwischen 29 und 32 mA – die rund 10mA Differenz gehen zu Ehren des Funkmoduls.