Communication sans fil entre deux cartes Raspberry Pi Pico W

Communication sans fil entre deux cartes Raspberry Pi Pico W

Dans ce tutoriel, nous allons faire en sorte qu’un Raspberry Pi Pico W envoie des valeurs aléatoires RVB (rouge, vert, bleu) à une autre carte Pico W ! Il s’agit d’un projet très simple pour introduire la communication WiFi avec MicroPython et pourrait constituer la base d’une grande variété de projets.

Le projet connecte les deux cartes Pico W à votre réseau Wi-Fi domestique, l’une agissant en tant que serveur et l’autre en tant que client.

Thomas est venu avec ce tutoriel après avoir bricolé avec ses cartes Pico W peu après le lancement du nouveau Pico sans fil, et nous ne pouvions pas nous empêcher de penser « … les ordinateurs se parlent… combien de temps avant SkyNet! ».

Une note rapide – ce n’est probablement pas le premier projet idéal si vous n’avez jamais utilisé de Pico auparavant. Pour un petit échauffement et une introduction, Raspberry Pi a un excellent Guide de démarrage iciou le livre Get started with MicroPython on Raspberry Pi Pico est également une bonne option !

Ce dont vous aurez besoin

Le système proposé

En un mot

  • Les deux cartes Pico W se connectent à votre réseau WiFi
  • Le Pico W #1 exécute un petit serveur Web qui reçoit les requêtes et envoie des réponses au Pico W #2
  • Le Pico W #2 envoie continuellement des demandes au serveur Web du Pico W #1 et reçoit des réponses de celui-ci

Comment ça marche?

Les deux cartes Pico reçoivent le SSID et le mot de passe de votre réseau WiFi. Nous avons mis en place un serveur web très simple sur le premier Pico W qui attend les requêtes du deuxième Pico W. Pour simplifier nous ne décodons pas les requêtes mais les traitons toutes de la même manière. Nous générons simplement trois valeurs, comprises entre 0 et 255 inclus, pour représenter les composantes rouge, verte et bleue d’une couleur.

Le premier Pico les regroupe dans une chaîne, séparées par des virgules, et l’envoie comme réponse au second Pico W. Le programme imprime son adresse locale une fois qu’il s’est connecté à notre réseau. Nous devons noter cette adresse car elle est utilisée par le deuxième Pico W pour demander des données.

Le deuxième Pico W envoie à plusieurs reprises des demandes au serveur Web et reçoit en retour la chaîne de données, qui est ensuite décompressée dans les trois valeurs de couleur et affichée.

Pour des raisons de sécurité, nous enregistrons le SSID et le mot de passe dans un fichier de bibliothèque séparé afin qu’il ne soit pas visible dans le programme.

Installer

1. Installez le fichier Pico W UF2

Vous devez d’abord vous assurer que vous disposez du dernier fichier Raspberry Pi MicroPython UF2 (la version spécifique Pico W) sur vos deux cartes Pico. Les fichiers UF2 sont disponibles ici.

Pour l’installer sur votre Pico, maintenez enfoncé le bouton BOOTSEL tout en branchant la carte sur un port USB. Votre Pico devrait alors apparaître comme un périphérique de stockage de masse (comme un lecteur), puis faites simplement glisser le fichier UF2. Cela installera le firmware sur votre carte. Une fois terminé, le Pico se réinitialisera automatiquement et sera prêt à l’emploi.

Pour l’instant, déconnectez les deux cartes et lisez la suite.Pico UF2

2. Préparez Thonny

Pour rendre les choses un peu plus faciles, nous pouvons configurer Thonny pour vous permettre d’ouvrir deux fenêtres Thonny (instances) en même temps, ce qui vous permet d’avoir une fenêtre Thonny distincte pour chaque Pico.

Pour ce faire, ouvrez Thonny et dirigez-vous vers Outils > Options > Général et décochez ‘Autoriser une seule instance Thonny’.Thonny instances multiplesMaintenant, redémarrez Thonny et connectez vos deux cartes Pico W. Sélectionner Exécuter > Sélectionner un interprète et choisissez le premier port COM disponible.Port COM ThonnyEnsuite, ouvrez une deuxième instance de Thonny (rouvrez simplement le programme depuis votre menu habituel). Suivez le même processus et sélectionnez l’autre port COM.

Vous utilisez maintenant deux fenêtres Thonny, une pour chaque Pico W !

3. Installez PyStone Lowmem

Nous devons maintenant installer des packages sur les deux cartes.

Premièrement le micropython-pystone_lowmem forfait. Dans Thonny, accédez à Outils > Gérer les packages et chercher micropython-pystone_lowmem.

Cliquez sur le résultat supérieur comme indiqué ci-dessous et installez-le.Pystone lowmem

Ensuite, nous devons installer demandes avec la même méthode que ci-dessus (ignorer tout avertissement):

demandes

Maintenant dans le REPL de Thonny (Lire évaluer la boucle d’impression) fenêtre, essayez ce qui suit à l’invite (vous devrez d’abord l’enregistrer, ce qu’il vous demandera de faire) :

import pystone_lowmem
pystone_lowmem.main()

Vous devriez voir quelque chose comme ceci :

sortie pystone

Suivez maintenant les mêmes étapes pour votre autre Pico dans l’autre fenêtre Thonny, car les deux cartes doivent être configurées de la même manière pour que ce projet fonctionne.

4. Créez la bibliothèque secrète

Créer une nouvelle fenêtre de programme dans tous les deux Thonny windows et copiez les lignes suivantes :

ssid = 'SSID'
password = 'PASSWORD'

Insérez vos propres valeurs de réseau WiFi entre les guillemets simples et enregistrez le programme dans les deux cartes en l’appelant secret.py

Création du serveur Web (Pico #1)

Ce programme met en place un serveur web simple (sur Pico #1) qui génère des valeurs RVB et les envoie sur demande.

Copiez le code ci-dessous dans une nouvelle fenêtre Thonny sur votre première carte Pico W, puis enregistrez-le sous serveur.py.

# Webserver to send RGB data
# Thomas 5 July 2022
import network
import socket
import time
from machine import Pin, ADC
from secret import ssid,password
import random
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
       
# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)

# Handle connection error
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print( 'ip = ' + status[0] )

# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

# Listen for connections
while True:
    try:
        cl, addr = s.accept()
        print('client connected from', addr)
        request = cl.recv(1024)
        print(request)
        # Do not unpack request
        # We reply to any request the same way
        # Generate 3 values to send back
        r = random.randint(0,255)
        g = random.randint(0,255)
        b = random.randint(0,255)
        # Join to make a simple string with commas as separators
        rgb = str(r) + "," + str(g) + ","+str(b)
        
        response = rgb # This is what we send in reply

        cl.send(response)
        print("Sent:" + rgb)
        cl.close()

    except OSError as e:
        cl.close()
        print('connection closed')

Maintenant, lancez le programme dans Thonny et il vous montrera son adresse IP. Notez-le puis passez au Pico #2 pour configurer le programme Client.

Adresse IP du serveur

Création du programme client (Pico #2)

Ce programme client demande des données au serveur Web, les décompresse dans les trois composants et les imprime.

Copiez le code ci-dessous dans une nouvelle fenêtre Thonny sur votre deuxième carte Pico W, mais avant de l’enregistrer, mettre à jour l’adresse IP avec l’IP de votre serveur Pico #1. Recherchez la ligne ci-dessous et modifiez-la pour refléter l’adresse IP correcte :

ai = socket.getaddrinfo("192.168.1.27", 80) # Address of Web Server

Une fois mis à jour, enregistrez-le sous client.py sur le Pic.

# Program to read RGB values from a local Pico Web Server
# Thomas 5th July 2022
# Connect to network
import network
import time
from secret import ssid, password
import socket

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected() and wlan.status() >= 0:
    print("Waiting to connect:")
    time.sleep(1)
 
# Should be connected and have an IP address
wlan.status() # 3 == success
wlan.ifconfig()
print(wlan.ifconfig())

while True:
    ai = socket.getaddrinfo("192.168.0.15", 80) # Address of Web Server
    addr = ai[0][-1]

    # Create a socket and make a HTTP request
    s = socket.socket() # Open socket
    s.connect(addr)
    s.send(b"GET Data") # Send request
    ss=str(s.recv(512)) # Store reply
    # Print what we received
    print(ss)
    # Split into RGB components
    l = len(ss)
    ss = ss[2:l-1]     # Strip to essentials  
    p = ss.find(",")   # Find first comma
    r = int(ss[0:p])   # Extract RED value
    ss = ss[p+1:]      # Remove red part
    p = ss.find(",")   # Find comma separator
    g = int(ss[0:p])   # Extract GREEN value
    b = int(ss[p+1:])  # Extract BLUE value
    print(r,g,b)       # Print RGB values
    print()
    # Set RGB LED here
    s.close()          # Close socket
    time.sleep(0.2)    # wait

Exécutez le projet !

Votre serveur sur Pico #1 devrait déjà fonctionner, alors exécutez maintenant le fichier client sur votre carte Pico #2.

Vous devriez voir une sortie similaire à l’exemple ci-dessous sur votre Client Pico, avec des valeurs RVB fournies les unes après les autres :

Sortie client sur Thonny

Nous avons démarré ces scripts manuellement, mais à titre d’exemple, vous pouvez enregistrer le programme du serveur Web sur le premier Pico W en l’appelant main.py afin qu’il s’exécute à la mise sous tension.

Choses à essayer

  • Mettre 3 potentiomètres sur le Web Server pour fournir les données
  • Contrôlez 3 LEDS ou une LED RVB avec les données reçues par le client
  • Envoyer une donnée de capteur (température et humidité par exemple) du serveur au client
  • Éloignez les Picos pour voir jusqu’où la connexion WiFi est efficace

Si vous avez apprécié ce tutoriel et que vous créez quelque chose de cool en vous basant sur les instructions ici, montre nous sur Twitter!

A propos de l’auteur

Cet article a été écrit par Thomas. Thomas est un professeur d’informatique à la retraite qui a commencé à écrire du code en 1968 alors que cela s’appelait programmation – il a commencé avec FORTRAN IV sur un IBM 1130 ! Membre actif de la communauté Raspberry Pi, ses principaux centres d’intérêt sont désormais le codage en MicroPython, les voyages et la photographie.

  • Waveshare GPIO Expander pour Raspberry Pi Pico, avec 1x Raspberry Pi Standard 40PIN, 1x Pico 2 × 20PIN Header, pour Connecter Raspberry Pi Hat et Raspberry Pi Pico Cartes D'extension
    HAT-Compatible GPIO Expander for Raspberry Pi Pico, with standard Raspberry Pi Pico female header for direct attaching Raspberry Pi Pico (if male header soldered), or just through jumper wires 1x Raspberry Pi standard 40PIN header and 1x Pico 2×20PIN header, allows connecting both Raspberry Pi HATs and Pico expansion boards USB power input connector, ensures sufficient power supply for multiple expansion modules Breakout RESET button, convenient for debugging Clear pinout labels on the front side, easy to use, immersion gold process, beautiful & practical, stunning aesthetic looking
  • Youyeeto BPI-PicoW-S3 ESP32-S3 Carte double cœur WiFi et processeur BLE AI 8 Mo Flash 2 Mo de SPRAM (uniquement carte)
    【ESP32-S3】Dual Core 32 bits LX7, 240 MHz maximum, ROM interne 384 Ko, SRAM interne 320 Ko, Flash ROM externe 8 Mo PSRAM externe 2 Mo Wi-Fi et BT : prend en charge la communication sans fil 2,4 GHz Wi-Fi et Bluetooth LE double mode, le périphérique est compatible avec le design matériel à faible puissance, et la consommation d'énergie est de seulement 10 uA en mode veille profond 2 entrées d'alimentation : USB et batterie au lithium externe de 3,7 V, les deux peuvent être interchangeables librement Compatible avec Raspberry Pi Pico W : les broches GPIO sur BPI-PicoW-S3 sont identiques à celles du Rraspberry Pi PicoW, les développeurs peuvent ajouter des périphériques pris en charge par DevKitC-1 sur le BPI-Leaf-S3, et peuvent également les combiner sur une platine d'expérience. Prend en charge ESP-IDF, Arduino, micropython et d'autres méthodes.