Es hatte mich ja bereits gewundert, warum der Raspberry Pi Pico 2 nicht direkt mit WLAN Modul erschienen ist. Jetzt hat die Raspberry Pi Foundation nachgelegt und schickt den Raspberry Pi Pico 2W ins Rennen.
Raspberry Pi Pico 2W
Die technischen Daten haben sich zum Pico 2 nicht geändert, abgesehen davon, dass jetzt noch ein kombiniertes WLAN7Bluetooth Modul auf der Platine Platz gefunden hat. Der Chip ist der schon vom Pico 1W bekannte Infineon Airoc CYW43439.
Pico | Pico 2 | Pico 2W | |
---|---|---|---|
Chip | RP2040 | RP2350 | RP2350 |
Kerne | Dual ARM Cortex-M0+ | Dual ARMCortex-M33 oder 2* Hazard3 RISC-V | Dual ARM Cortex-M33 oder 2* Hazard3 RISC-V |
Takt | 133MHz | 150MHz | 150MHz |
Speicher | 264kB | 520kB | 520kB |
PIO | 2 | 3 | 3 |
State Machines | 8 | 12 | 12 |
I²C | 2 | 2 | 2 |
GPIO | 26 | 26 | 26 |
SPI | 2 | 2 | 2 |
PWM | 16x | 24x | 24x |
USB | 1.1 | 1.1 | 1.1 |
Flash (onboard) | 2 MByte | 4 MByte | 4 MByte |
WLAN | beim Pico W | – | 802.11n |
Bluetooth | Pico W | – | 5.2 LE |
Der zusätzliche WLAN Chip bietet neben Wifi 802.1n auch Bluetooth 5.2 Low Energy an. Allerdings funkt er nur im 2,4GHz Band. Die Antenne ist direkt auf dem Board integriert.
Installation
Es gibt derzeit leider offiziell noch keine für den Pico 2W angepasste Version von MicroPython. Daher versuche ich es einfach mal mit der Version v1.25.0-preview für den Pico 2. Immerhin ist der SoC identisch und tatsächlich, nach dem Flashen erkennt Thonny die neue MCU.
Mit der Version ist mir leider nicht möglich gewesen, die onboard LED anzusprechen oder mit dem WLAN Modul zu kommunizieren.
Dann habe ich aber die Version v1.25.0-preview.49.g0625f07ad.dirty als inoffizielle MicroPython Version gefunden. Zum Herumspielen mit der neuen MCU reicht die zunächst mal aus, für eine produktive Umgebung warte ich dann doch lieber auf ein offizielles Image von micropython.org
Kompatibilität
zum Kompatibilitätstest lasse ich einige der Programme für den Pico 2 laufen. Da der Pico 2W auch auf dem RP2350 basiert, erwarte ich dabei keine großen Unterschiede.
onboard LED
Zunächst will ich ganz simpel die onboard LED zum Blinken bringen.
from machine import Pin
from utime import sleep
led = Pin("LED", Pin.OUT)
state = False
running = True
#Endlosschleife
led.off()
while True:
state = not state # state hin- und herschalten
sleep(1.0)
if state:
print('LED on')
led.on()
# running = False
else:
print('LED off')
led.off()
Das klappt schonmal problemlos.
WLAN
Darauf baue ich auf, um mit einem kleinen HTTP-Server die LED per URL ein- und auszuschalten.
#file: pico2w-ledserver
#encoding: utf-8
import machine
import network
import json
import socket
import rp2
from time import sleep
from machine import Pin
f = open('wlan.json', 'r')
c = json.load(f)
ssid = c['ssid']
passwd = c['passwd']
rp2.country(c['regio'])
led = Pin("LED", Pin.OUT)
ledstates = {'False':'ausgeschaltet','True':'eingeschaltet'}
def toogle_LED(state):
if state:
led.on()
else:
led.off()
def load_html():
try:
f = open('index.html','r')
print(f'f={f}')
page = f.read()
except IOError as x:
print(f'I/O-Fehler: {x}')
finally:
if f != None:
f.close()
return page
def connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid,passwd)
while not wlan.isconnected():
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(s):
page = load_html()
print(f'page={page}')
running = True
ledstatus = False
req_count = 0
toogle_LED(ledstatus)
#Start web server
while running:
client, address = s.accept()
request = client.recv(1024)
request = str(request)
req_count += 1
print(f'req_count={req_count}')
try:
request = request.split()[1]
except IndexError:
pass
if request == '/on':
print('Kommando on')
ledstatus = True
elif request =='/off':
print('Kommando off')
ledstatus = False
elif request =='/stop':
print('stopping')
running = False
ledstatus = False
toogle_LED(ledstatus)
client.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n'.encode('utf-8'))
state = ledstates[str(ledstatus)]
print(f'status={state}')
page = page.format(state)
client.send(page.encode('utf-8'))
client.close()
ip = connect()
print(f'ip={ip}')
s = open_socket(ip)
serve(s)
s.close()
toogle_LED(False)
Die Konfiguration der WLAN-Verbindung habe ich in die Datei wlan.json ausgelagert
{
"ssid": "<ssid>",
"passwd": "<wlan-passwort>",
"regio": "DE"
}
Dazu kommt noch eine HTML Datei index.html, die auf dem Pico 2W abgelegt wird, die auf dem Pico 2W gespeichert wird.
<!--Diese Datei muss für den led-server auf dem PicoW gespeichert werden. -->
<!DOCTYPE html>
<html>
<head>
<title>Pico 2W Page</title>
</head>
<body>
<h2> Raspberry Pi Pico 2W Status</h2>
<ul>
<li> LED {0} </li>
</ul>
</head
</html>
Nach Start des Programms verbindet sich die MCU mit meiner Fritzbox und ich kann mir dort die IP raussuchen.
Mit http://192.168.178.106/on kann ich im Browser die LED auf der Platine vom Browser aus einschalten und der Pico 2W liefert mir dann die index.html mit dem aktuellen Status der LED zurück.
Benchmarks
Meine Benchmarktests für den Pico 2 laufen ohne Modifikation, daher habe ich die Vergleichstabelle erweitert.
Pico 2 150Mhz | Pico 2 300MHz | Pico 2W 150MHz | Pico 2W 300MHz | Pico 133MHz | Pico 275MHz |
|
---|---|---|---|---|---|---|
Primzahlen | 55ms | 23ms | 46ms | 26ms | 91ms | 38ms |
nQueens | 1304ms | 653ms | 1304ms | 625ms | 2319ms | 1073ms |
Interessanterweise ist der Pico 2W in der Rechenleistung marginal langsamer als der 2er. Möglicherweise stammt der RP2350 meines Pico 2 aus einer Charge, die die Abwärme etwas besser ableiten kann.
Fazit
Der Raspberry Pi Pico 2W vereint den leistungsfähigen RP2350 SoC mit einem WLAN Modul und macht ihn dadurch interessant für Projekte, die viel Rechenkraft benötigen und im Netz erreichbar sein müssen. Wenn du bereits ein Projekt mit dem Pico 1W Laufen hast, aber mehr CPU-Power benötigst, ist der Tausch gegen einen 2W vermutlich relativ unkompliziert zu realisieren.
Leider ist er derzeit noch so neu auf dem Markt, dass es noch kein offizielles .utf2 Image von MicroPython für das Board gibt. Ich habe bei meinen Tests zwar keine Probleme mit der Preview Version gehabt, allerdings stecken die evtl. noch tiefer unter der Haube. Für konkrete Einsätze warte ich aber noch auf ein offizielles Image.