🛠 Point d'accès & provisioning Wi-Fi par navigateur (mode SoftAP)
Objectifs
Comment déployer 50 Pico W chez des gens qui ne lisent pas les logs série ? Réponse officielle : le provisioning par navigateur, exemple phare de pico_w/wifi/ dans pico-examples (access point + page web de configuration). Le principe : la carte émet son propre réseau (le CYW43439 accepte un SoftAP jusqu'à 4 clients), l'utilisateur s'y connecte depuis son téléphone, saisit les identifiants du réseau cible dans un formulaire servi par la carte, puis la carte bascule en station. Tu construiras le même enchaînement en MicroPython avec network.WLAN(network.WLAN.IF_AP).
Matériel
- 1 × Raspberry Pi Pico W + firmware MicroPython
_picow(alimentée par batterie ou USB autonome) - Un smartphone
- Boîtier non métallique ou fenêtre garde-dégagée sur la zone antenne (keep-out 14 × 9 mm — la datasheet interdit le métal par-dessus)
Code complet
# provisioning.py — SoftAP + formulaire + bascule station (MicroPython)
import machine, network, socket, time
FORM = (b'HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n'
b'<form method=POST>SSID<input name=s><br>'
b'<input name=p type=password><br>'
b'<button>Go</button></form>')
def parse_form(req):
kv = req.split(b'\r\n\r\n', 1)[-1].decode.split('&')
d = dict(x.split('=', 1) for x in kv if '=' in x)
return d.get('s', ''), d.get('p', '')
ap = network.WLAN(network.WLAN.IF_AP) # mode point d'accès (max 4 clients)
ap.ifconfig = ('192.168.4.1', '255.255.255.0', '192.168.4.1', '8.8.8.8')
ap.config(ssid='PICO-SETUP', key='provision123') # WPA2, canal par défaut
ap.active(True)
print('réseau PICO-SETUP emis sur 192.168.4.1')
srv = socket.socket
srv.bind(socket.getaddrinfo('192.168.4.1', 80)[0][-1])
srv.listen(1)
srv.settimeout(120) # fenêtre de config de 2 minutes
try:
cl, _ = srv.accept
req = cl.recv(1024)
if b'POST' in req:
ssid, pwd = parse_form(req)
cl.write(b'HTTP/1.0 200 OK\r\n\r\nConfig ok, au revoir')
cl.close
ap.active(False) # coupe le SoftAP
sta = network.WLAN # retour en station
sta.active(True)
sta.connect(ssid.replace('%20', ' '), pwd.replace('%20', ' '))
for _ in range(60):
if sta.isconnected: break
machine.idle
print('IP finale :', sta.ipconfig('addr4'))
finally:
srv.close
Vérification attendue
Au premier boot sans configuration connue, le réseau PICO-SETUP apparaît sur le téléphone ; le formulaire saisi, la carte émet le message de succès, ferme le SoftAP et rejoint le réseau domestique — l'IP finale s'affiche une fois connectée. C'est exactement le flux de l'exemple officiel C (qui, lui, sert une vraie page avec listes des réseaux scannés).
Erreurs fréquentes
- Oublier de désactiver l'AP après provisioning : la carte reste en mode mixte et consomme la place client (4 max) — bascule propre AP off / STA on.
- Caractères URL-encodés dans le mot de passe (
%20,%26…) : un formulaire HTML encode tout — décode avantconnect, sinon échec d'association incompréhensible. - Boîtier métallique ou Pico W glissée sous un routeur : l'antenne PCB a besoin de sa zone keep-out dégagée ; le métal à proximité dégrade gain et bande passante (documenté).
- Pas de persistance : ce script relance le provisioning à chaque boot — en production, sauvegarde les identifiants dans un fichier flash et ne démarre l'AP que si le connect station échoue.
- Contraindre le téléphone à rester sur le réseau de la carte : certains OS basculent automatiquement vers le Wi-Fi Internet dès que PICO-SETUP n'a pas de passerelle — préviens dans l'UI ou utilise le portail captif.
- En C SDK, le même flux s'appuie sur le scan (
cyw43_wifi_scan_results) pour lister les réseaux — l'exemple officiel d'AP provisioning est le point de départ recommandé.
Autres tutoriels pour cette carte
- Faire clignoter la LED embarquée (elle est derrière la puce Wi-Fi !)
- Se connecter à un réseau Wi-Fi (station, WPA2/WPA3)
- Bouton et potentiomètre sans marcher sur le sans-fil (GPIO libres & ADC)
- Servir une page web depuis la Pico W (socket TCP + HTTP)
- Client HTTP : consommer une API depuis la Pico W
- Heure exacte via NTP : l'horloge temps réel des projets connectés
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython