Für die ersten Schritte mit dem Raspberry Pi Pico W benutze ich den Hardwareaufbau aus dem Python GPIO Post.
Material
Ich benutze folgendes Material:
- Raspberry Pico W
- Breadboard fullsize
- USB A to Micro-USB Kabel
- Vorwiderstand 220Ω
- PullUp Widerstand 10kΩ
- Taster vierpolig quadratisch
- LED rot
- Jumper-Kabel m-m
Schaltungsaufbau
Die Anode der LED wird über den 220Ω Widerstand mit dem GPIO Pin 15 verbunden, die Kathode natürlich mit der Masse-Schiene. Der Taster wird auf der einen Seite mit Masse, auf der anderen an GPIO Pin 16 angeschlossen. Gleichzeitig wird Pin 16 über den 10kΩ Widerstand an +5V angeschlossen (Pull Up Widerstand, s.u.)
Ich programmiere Pico W komplett über meine Raspberry Pi 4B, auf dem ich DietPi mit XfcE nachinstalliert habe.
Micropython flashen
Der Pico W unterscheidet sich durch sein WLAN Modul vom Raspberry Pi Pico, dadurch sind einige GPIO Pins anders belegt, um das Modul anzubinden. Daraus folgt, dass du ein anderes Firmwareimage aufspielen musst.
Der Vorgang bleibt derselbe.
- Stecke den Micro-USB Stecker in den Pico W
- Halte den BootSel-Button auf dem Board gedrückt und
- stecke dann den USB-A Stecker in deinen Computer.
Der Pico W verbindet sich dann als ein mountbares Blockdevice, sobald der Datenträger zugreifbar ist, kopiere das heruntergeladene .uf2 File einfach in die berste Ebene des Datenträgers. Wenn dies abgeschlossen ist, wird der Pico W automatisch einen Neustart durchführen, um das Micropython Image zu starten.
Thonny
Thonny ist eine IDE (Integrated Development Environment), die uns die Programmierung des Pico W erleichtert, gerade beim Übertragen des Programms auf den Mikrocontroller ist Thonny sehr nützlich.
Sollte Thonny noch nicht auf deinem Rechner vorhanden sein, kannst du es mit
sudo apt install thonny
nachinstallieren.Auf thonny.org kannst auch eine Version für Windows runterladen.
Die wichtigste Konfiguration, die du bei Thonny machen musst, ist die Verbindung zum Pico herzustellen.Verbinde deinen Pico per USB mit deinem Computer und klicke in Thonny im Menü auf Tools/Options und wähle dann die Registerkarte Interpreter Wähle als Interpreter MicroPython (Raspberry Pi Pico)
aus. Falls dieser nicht verfügbar sein sollte, reicht auch MicroPython (Generic)
. Bei Port wählst du den seriellen Port aus, mit dem das Betriebssystem deinen Pico angebunden hat. Bei mir ist es /dev/ttyACM0. Wichtig ist, dass der Benutzer, mit dem du angemeldet ist, auf die Devicedatei zugreifen darf.
sudo usermod -a -G dialout <user>
Du musst dich einmal neu anmelden, damit diese Änderung wirksam wird.
Thonny ist im Wesentlichen in zwei Bereiche unterteilt, im oberen Bereich gibst du deinen Programmcode ein, darunter ist das Fenster für die Python Interactive Shell, in dem alle Ausgaben des laufenden Programms erscheinen.
Wenn du alles richtig eingestellt hast, meldet sich die Interactive Shell wie folgt:
MicroPython v1.20.0 on 2023-04-26; Raspberry Pi Pico W with RP2040
Type "help()" for more information.
>>>
Hier kannst du, wie gewohnt Python-Kommandos eingeben. Der Unterschied ist nur, dass sie nicht auf deinem lokalen Rechner verarbeitet werden sondern direkt auf dem Pico W.
Onboard LED
Ein simples erstes Programm ist üblicherweise, die auf dem Pico aufgelötete LED neben der Micro-USB Buchse zum Blinken zu bringen.
from machine import Pin
from utime import sleep
led = Pin('LED', Pin.OUT)
state = False
def toggle_LED(state):
if state:
led.on()
else:
led.off()
while True:
state = not state
toggle_LED(state)
sleep(0.5)
Die Leuchtdiode hat keine Pinnummer sondern die Kennung LED
, dies liegt an dem WLAN-Modul, hardwareseitig ist die Onboard LED mit GPIO Pin 25 verbunden. Die Methode toggle_LED()
schaltet je nach übergebenen Parameter die LED ein oder aus. In einer Endlosschleife wird state
zwischen True
und False
hin- und hergewechselt und an die Methode übergeben. Danach wird eine halbe Sekunde gewartet. Wenn du den Code in Thonny hast, kannst das Programm mit dem Start-Button (grün unterlegter Pfeil) in der Menüleiste auf dem Pico starten (alternativ geht das auch mit der Taste F5. Beendet wird das Programm mit dem Stop-Button in der Menüleiste.
Dies die interaktive Shell von MicroPython. Alle Python Kommandos, die du hier eingibst werden nicht auf dem Rechner, auf dem Thonny läuft, ausgeführt sondern direkt auf dem Pico.
PullUp Widerstand
Der Pull Up Widerstand dient dazu, den Taster zu „entprellen“, da dessen Federkontakt mitunter mehrfache Signale sendet. Der Widerstand verhindert dies, in dem er das Eingangssignal glättet.
Taster auslesen
Den Taster benutzen wir jetzt als Ende Signal. Wird er gedrückt, beendet sich das Programm. Wir erweitern es wie folgt.
from machine import Pin
from utime import sleep
led = Pin(15, Pin.OUT)
button = Pin(16, Pin.IN)
waittime = 0.2
state = False
running = True
# Setzt den Zustand der LED und wartet dann <wait> Sekunden.
def toggle_LED(state,wait):
if state:
led.on()
else:
led.off()
sleep(wait)
#Endlosschleife
while running:
state = not state # state hin- und herschalten
toggle_LED(state,waittime) # LED umschalten
pressed = button.value()
if pressed == 0:
led.off()
running = False
print('Button gedrückt, Ende')
Der Pin 16 wird als Input-Pin deklariert.
button = Pin(16, Pin.IN)
Den aktuellen Zustand kannst du über button.value()
abfragen. Beachte, dass der Wert 0
anzeigt, dass der Taster gedrückt ist.
pressed = button.value()
Ist pressed == 0
, schalten wir die LED aus und beenden das Programm.
WLAN
Es ist jetzt Zeit, unseren Pico W ins WLAN zu bringen. Im Gegensatz zu den Raspberry Pi SBC, haben wir hier kein Betriebssystem, dass uns die Verbindung zur Verfügung stellt. Daher müssen wir das selber programmieren.
#encoding: utf-8
import machine
import network
import socket
import rp2
from time import sleep
ssid = '<ssid' # WLAN Name
passwd = '<wlanpw>' # Zugangspasswort des WLAN
rp2.country('DE') # WLAN im deutschen Frequenzspektrum
#einfache HTML Seite als Response
html = """<!DOCTYPE html>
<html>
<head>
<title>Willkommen</title>
</head>
<body>
<h2> Willkommen auf dem Raspberry Pi Pico W</h2>
</head>
</html>"""
# Verbindung aufbauen
def connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid,passwd)
while not wlan.isconnected(): # Wiederhlen, bis Verbindung besteht
print('Waiting for connection...')
sleep(1)
print(f'connected={wlan.isconnected()}')
return wlan.ifconfig()
# Bindet einen Socket an die Verbindung
def open_socket(ip):
# Socket öffnen
s = socket.socket()
address = socket.getaddrinfo('0.0.0.0',80)[0][-1]
print(f'address={address}')
s.bind(address)
s.listen(1)
return s
def serve(connection):
running = True
#Start web server
while running:
client, adress = connection.accept()
request = client.recv(1024)
print(f'1request={request}')
request = str(request)
print(f'2request={request}')
try:
request = request.split()[1]
print(f'3request={request}')
except IndexError:
pass
if request =='/stop':
print('stopping')
running = False
client.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n'.encode('utf-8'))
client.send(html.encode('utf-8'))
client.close()
ip = connect()
print(f'ip={ip}')
s = open_socket(ip)
print(f'socket={s}')
#Hier ist jetzt die Verbindung aufgebaut und der Socket einsatzbereit.
serve(s)
s.close()
Das Programm ist ein relativ einfacher Webserver, der beim Request einfach nur den unter html
abgelegten HTML-Code zurückliefert.Du musst nur den Namen deines Access Point und das WLAN Passwort in die Variablen ssid
und passwd
einsetzen. Die rote LED benutzen wir als Status LED, die anzeigt, dass die WLAN-Verbindung besteht.In meiner Fritz!Box taucht der Pico W dann so auf:
Du kannst dir jetzt mit http://picow die HTML-Seite anzeigen lassen. Ich habe noch die Möglichkeit eingebaut, den Webserver ordentlich zu beenden
Das Ärgerliche bei diesem Code ist, dass beim Stopp des Programms über Thonny der TCP Port nicht freigegeben wird. Vor jedem neuen Start des Programms musst du den PicoW komplett neu starten, indem du ihn vom USB-Port deines Arbeitsrechners trennst und wieder verbindest. Danach musst du über den Stop/Restart Button die Kommunikation zwischen Thonny und Pico wieder herstellen. Deshalb habe ich noch die Möglichkeit eingebaut, den Webserver ordentlich zu beenden und den Port wieder freizugeben. Dies geschieht mit dem URL http://picow/stop
Darauf aufbauend habe ich den led-server aus dem Python GPIO Kapitel für den PicoW portiert. Du findest ihn so wie alle anderen Sourcecodes dieses Posts im git Repo.
Pico mobil
Es macht natürlich keinen Sinn, den Raspberry Pi Pico W immer an einem Hostrechner zu betreiben. Daher speicherst du das WLAN Programm jetzt am besten mit Datei/Speichern Unter oder File/Save As auf englisch direkt auf dem Pico
Es erscheint dann der obige Dialog (der dir vermutlich vorher schon mal begegnet ist Dort wählst du MicroPython device und gibst danach als Dateinamen main.py
an. Jetzt ist das Programm auf dem PicoW gespeichert und wird bei dessen Start automatisch ausgeführt.
Ich habe ein wenig in meiner Kiste gekramt und noch eine Powerbank gefunden, die 2,4A bei 5V liefern kann. Da die Stromaufnahme des Pico W im mA Bereich liegt, ist das natürlich überdimensioniert. Die Powerbank hat aber den Vorteil über einen On/Off-Schalter zu verfügen und kann mit einer Kapazität von 6700mAh den Mikrocontroller tage- wenn nicht wochenlang mit Strom versorgen.