Raspberry Pi Pico 2W

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.

Platine des Raspberry Pi Pico 2W
Olli Graf - raspithek.de
pico2wCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Platine des Raspberry Pi Pico 2W

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.

PicoPico 2Pico 2W
ChipRP2040RP2350RP2350
KerneDual ARM Cortex-M0+Dual ARMCortex-M33 oder 2* Hazard3 RISC-V


Dual ARM Cortex-M33 oder 2* Hazard3 RISC-V


Takt133MHz150MHz150MHz
Speicher264kB520kB520kB
PIO233
State Machines81212
I²C222
GPIO262626
SPI222
PWM16x24x24x
USB1.11.11.1
Flash (onboard)2 MByte4 MByte4 MByte
WLANbeim Pico W802.11n
BluetoothPico W5.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.

Auszug aus der Liste der WLAN Geräte in der Fritzbox
Olli Graf - raspithek.de
fritz-box-connected-pico2wCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Auszug aus der Liste der WLAN Geräte in der Fritzbox

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.

gelieferte Webseite des LED Servers
Olli Graf - raspithek.de
led-server-responseCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
gelieferte Webseite des LED Servers

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
Primzahlen55ms23ms46ms26ms91ms38ms
nQueens1304ms653ms1304ms625ms2319ms1073ms

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.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner