Raspberry Pi Pico W als WLAN-Client

Der Raspberry Pi Pico W hat auf seiner Platine einen Funk-Chip mit WLAN-Unterstützung. Da ist es natürlich naheliegend den Pico mit einem vorhandenen WLAN-Netzwerk zu verbinden. Alles was man braucht ist den Namen (SSID) des betreffenden WLANs und das zu dazugehörige Passwort zur Authentifizierung.

Zur Herstellen der WLAN-Verbindung reichen im einfachsten Fall schon insgesamt nur 4 Zeilen Programmcode aus.

Programmcode zur Anzeige anderer WLANs (WLAN-Scan)

Damit eine Verbindung zu einem WLAN möglich ist, muss das natürlich empfangbar sein. Der folgende Programmcode gibt auf der Kommandozeile eine Liste mit WLANs aus, die der WLAN-Chip in diesem Augenblick empfangen kann.

# Bibliotheken laden
import network

# Client-Betrieb
wlan = network.WLAN(network.STA_IF)

# WLAN-Interface aktivieren
wlan.active(True)

# WLANs ausgeben
print(wlan.scan())

Das WLAN, mit dem der Raspberry Pi Pico W sich verbinden soll, muss in dieser Liste vorhanden sein.

Programmcode zum Verbinden mit einem WLAN

Zum Verbinden mit einem existierenden WLAN reichen schon 4 Zeilen Programmcode aus. Damit der Verbindungsaufbau zu Deinem WLAN funktioniert, musst Du den WLAN-Name und das WLAN-Passwort korrekt im Programmcode eintragen.

  1. Die erste Zeile lädt die Bibliothek für die Netzwerk-Funktionen.
  2. Hier wird die Betriebsart definiert. STA_IF bedeutet so viel wie Station, also der Client-Betrieb.
  3. Jetzt wird das WLAN-Interface aktiviert.
  4. Die Verbindung wird mit dem WLAN-Namen (SSID) und dem Passwort (PASSWORD) hergestellt.

Die nachfolgenden 4 Zeilen haben mit dem Verbindungsaufbau nichts zu tun. Sie sind eine sinnvolle Ergänzung. Hier wird geprüft, ob die Verbindung erfolgreich war.

# Bibliotheken laden
import network

# Ländereinstellung
network.country('DE')

# Client-Betrieb
wlan = network.WLAN(network.STA_IF)

# WLAN-Interface aktivieren
wlan.active(True)

# WLAN-Verbindung herstellen
wlan.connect('WLAN_NAME', 'WLAN_PASSWORD')

# WLAN-Verbindungsstatus prüfen
import time
print('Warten auf WLAN-Verbindung')
while not wlan.isconnected() and wlan.status() >= 0:
    time.sleep(1)
print('WLAN-Verbindung hergestellt / Status:', wlan.status())

Nach der Meldung „WLAN-Verbindung hergestellt“ wird das Programm beendet. Die WLAN-Verbindung des Picos bleibt dabei bestehen. Der WLAN-Chip auf dem Pico-Board hält die WLAN-Verbindung unabhängig welches Programm auf dem Pico ausgeführt wird. Das heißt, man kann jetzt ein Programm starten, dass diese WLAN-Verbindung zur Kommunikation nutzt.

Programmcode zum Beenden der WLAN-Verbindung

Um die WLAN-Verbindung zu trennen bzw. zu beenden, sollte man den Pico niemals stromlos machen, sondern die Verbindung geordnet durch den WLAN-Chip beenden. Ansonsten kann es sein, dass der Pico keine erneute Verbindung zum WLAN aufbauen kann.

Wenn man einen Programmcode zum Verbinden mit einem WLAN noch einmal ausprobieren möchte, solltest Du zuerst den folgenden Programmcode auszuführen, um die WLAN-Verbindung zu beenden.

# Bibliotheken laden
import network
import time

# Ländereinstellung
network.country('DE')

# Client-Betrieb
wlan = network.WLAN(network.STA_IF)

# WLAN-Verbindung beenden
if wlan.isconnected():
    wlan.disconnect()
    time.sleep(2)
    print('WLAN-Verbindung beendet')

# WLAN-Verbindungsstatus
print('WLAN-Status:', wlan.status())

In der Regel wird man einen WLAN-Status von „0“ oder „-2“ bekommen, was bedeutet, dass die WLAN-Verbindung beendet ist.

Erweiterter Programmcode zum Verbinden mit einem WLAN

Was macht der folgende Programmcode besser?

  1. Das Herstellen der WLAN-Verbindung befindet sich in einer Funktion. Die Funktion kann in einen eigenen Programmcode übernommen werden und mit einem Kommando aufgerufen werden.
  2. Die Funktion prüft, ob schon eine WLAN-Verbindung besteht.
  3. Ausgabe zusätzlicher Informationen auf der Kommandozeile über die Netzwerk-Verbindung (IPv4-Konfiguration).
  4. Onboard-LED als Status-Anzeige: Wenn sie blinkt, dann wird die WLAN-Verbindung hergestellt. Leuchtet die LED, dann besteht die Verbindung zum WLAN.
# Bibliotheken laden
import machine
import network
import time

# WLAN-Konfiguration
wlanSSID = 'WLAN_NAME'
wlanPW = 'WLAN_PASSWORD'
network.country('DE')

# Status-LED
led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)

# Funktion: WLAN-Verbindung
def wlanConnect():
    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        print('WLAN-Verbindung herstellen')
        wlan.active(True)
        wlan.connect(wlanSSID, wlanPW)
        for i in range(10):
            if wlan.status() < 0 or wlan.status() >= 3:
                break
            led_onboard.toggle()
            print('.', wlan.status())
            time.sleep(1)
    if wlan.isconnected():
        print('WLAN-Verbindung hergestellt')
        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])
    else:
        print('Keine WLAN-Verbindung')
        led_onboard.off()
        print('WLAN-Status:', wlan.status())

# WLAN-Verbindung herstellen
wlanConnect()

Stromsparmodus abschalten

Standardmäßig schaltet sich der Funk-Chip automatisch in den Stromsparmodus, wenn er nichts zu tun hat (Idle). Im reinen Client-Betrieb ist das in Ordnung. Er kann dann aber keine eingehenden Verbindungen annehmen, was als Server aber notwendig wäre. Wenn der Pico als Server im WLAN nicht erreichbar ist, dann sollte man den Stromsparmodus abschalten.
Der Programmcode sollte bei der WLAN-Konfiguration noch folgende Angabe haben

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.config(pm = 0xa11140)

Hinweis: Wenn der Stromsparmodus ausgeschaltet ist, dann sollte dabei berücksichtigt werden, dass der Stromverbrauch über die Zeit erheblich größer sein wird. Unter Umständen schließt das einen Batterie-Betrieb aus.

Programmcode für CircuitPython

Programmcode zum Scannen verfügbarer WLANs:

# Bibliotheken laden
import wifi

# WLAN-Scan durchführen
networks = []
for network in wifi.radio.start_scanning_networks():
    networks.append(network)
wifi.radio.stop_scanning_networks()

# Sortieren nach Signalstärke (RSSI)
networks = sorted(networks, key=lambda net: net.rssi, reverse=True)

# WLANs ausgeben
for network in networks:
    print('SSID:', network.ssid, ' / RSSI:', network.rssi)

Einträge in der Datei settings.toml:

# Zugangsdaten für das eigene WLAN
CIRCUITPY_WIFI_SSID="SSID"
CIRCUITPY_WIFI_PASSWORD="PASSWORT"

Programmcode zum Verbinden mit einem WLAN und Ausgabe der IPv4-Konfiguration:

# Bibliotheken laden
import os
import wifi

# WLAN-Zugangsdaten
WLAN_NAME = os.getenv('CIRCUITPY_WIFI_SSID')
WLAN_PW   = os.getenv('CIRCUITPY_WIFI_PASSWORD')

# WLAN-Verbindung herstellen
if wifi.radio.connected is False:
    print('Mit WLAN verbinden:', WLAN_NAME)
    wifi.radio.connect(WLAN_NAME, WLAN_PW)

print('WLAN-Verbindung hergestellt')
print()
print('   MAC-Adresse:', [hex(i) for i in wifi.radio.mac_address])
print('      Hostname:', wifi.radio.hostname)
print('  IPv4-Adresse:', wifi.radio.ipv4_address)
print('  Subnetzmaske:', wifi.radio.ipv4_subnet)
print('Router/Gateway:', wifi.radio.ipv4_gateway)
print('    DNS-Server:', wifi.radio.ipv4_dns)

Troubleshooting: WLAN

Wenn es mit dem Programmcode Probleme gibt, dann betrifft das hauptsächlich die WLAN-Verbindung. Der Umgang mit Funkverbindungen ist immer etwas schwierig, weil man nicht „sieht“ was passiert. Man ist dann auf Status-Meldungen vom Programmcode angewiesen. Von der Status-Meldung lässt sich aber nur selten auf eine Problemlösung schließen. Hier muss man etwas genauer hinschauen, um den Fehler zu finden, der sich nicht im Programmcode befinden muss.

Darf es ein bisschen mehr sein?

Wenn man den Raspberry Pi Pico W als WLAN-Client programmiert und eine Verbindung zum Internet braucht, dann will man vielleicht prüfen, ob eine Verbindung ins Internet möglich ist.

Für bestimmte Anwendungen ist eine feste IPv4-Adresse gefordert. Hierfür muss man im Programmcode eine vollständige IPv4-Konfiguration hinzufügen.

Damit ein Raspberry Pi Pico W im lokalen Netzwerk einen individuellen Hostnamen erhält, gibt es einen Parameter in der Netzwerk-Konfiguration von MicroPython.

Oder möchtest Du Deinen Raspberry Pi Pico W als WLAN Access Point verwenden?

Wir nutzen hier einen Raspberry Pi Pico W als schnurlosen bzw. drahtlosen Taster, der damit ein Aktor in Deinem Smart Home werden kann.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Elektronik-Set Pico WLAN Edition

Elektronik-Set Pico WLAN Edition

Hardware-nahes Programmieren mit dem Mikrocontroller Raspberry Pi Pico W und MicroPython.

  • Raspberry Pi Pico W mit gelöteten Stiftleisten
  • Spezielles Steckbrett mit GPIO-Beschriftung
  • Einführung ins Hardware-nahe Programmieren
  • Schwerpunkte: WLAN, MQTT und Internet
  • Deutschsprachige Anleitung als PDF-Datei zum Download

In unseren Online-Workshops bieten wir intensiven Erfahrungsaustausch in kleinen Gruppen und Unterstützung bei individuellen Problemen.

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren