COMMUNICATION SANS FIL


La communication sans fil de type WiFi ou encore Bluetooth doit surtout permettre l'échange de données entre cartes Raspberry Pi ou entre cartes Raspberry Pi et autres appareils comme un PC ou un Smartphone.


MENU

  1. Communication WiFi sur réseau local existant
    1. Échange entre PC et Raspberry Pi 4B (RasPi4B) sur réseau local
    2. Raspberry Pi Pico2W comme client sur réseau local
      1. Insertion du Pico2W dans le réseau local par WiFi
      2. Suite de la configuration du Pico2W comme terminal du réseau local : nœud IPv4
      3. Échange entre PC et Pico2W sur réseau local
    3. Carte Pico2W comme Terminal WiFi sur réseau local hébergeant un site web
      1. Site Web simple "Hello World"
      2. Commande extérieure de processus Pico2W

  2. Communication WiFi sur réseau privé à construire (Point d'Accès - Hotspot)
    1. Un PC configuré comme serveur WiFi et un Raspberry Pi 4B comme client
      1. Création du point d'accès
      2. Mise en œuvre de python3 pour l'échange de données
    2. Un Raspberry Pi 4B configuré comme serveur WiFi et un PC comme client
      1. Création du point d'accès
      2. Mise en œuvre de python3 pour l'échange de données
    3. Un Raspberry Pi Pico2W comme Point d'Accès (serveur WiFi)
      1. Configuration du Pico2W comme Point d'Accès WiFi
      2. Exemples d'utilisation du Pico2W comme serveur WiFi
        1. Serveur web simple - Affichage d'informations
        2. Serveur web pour commande simple
        3. Serveur web pour commande du mouvement d'un véhicule
        4. Serveur pour transmission de cap défini par un capteur "boussole"

  3. Communication Bluetooth
    1. Généralités sur le Bluetooth pour comprendre les programmes utilisés
    2. Commande à distance des broches GPIO du Raspberry Pi 4B par Smartphone via Bluetooth
      1. Liens
      2. Principe
      3. Connexion Bluetooth entre Smartphone et Raspberry Pi
      4. Expérimentation
    3. Application du Bluetooth au Pico2W
      1. Raspberry Pi Pico2W utilisant le Bluetooth pour communiquer avec une application Android


1. Communication sur réseau local existant

Généralement à la maison, on dispose d'une connexion internet par fibre reliée à un terminal jouant le rôle de routeur. A partir de ça, on peut se créer un réseau filaire ou de communication par WiFi.
Un réseau local se compose donc d'un serveur et de clients.
Le serveur est le routeur au bout de la fibre, les clients pouvant être des imprimantes, des PC ou autres Raspberry Pi.
On se propose d'échanger des données soit par réseau filaire, soit par WiFi.
Si un Raspberry Pi Pico2W est dans la boucle, il ne peut communiquer sur le réseau local que par WiFi et il lui faudra d'abord s'insérer dans le réseau.

1.1. Échange entre PC et Raspberry Pi 4B (RasPi4B) sur réseau local

J'ai constitué à la maison un réseau local filaire (LAN). Le PC et le RasPi4B peuvent donc être connectés à la box par fil ou par WiFi de façon traditionnelle.

Adresses IPv4 en usage ici
PC RasPi4B
LAN 192.168.1.25 192.168.1.46
WiFi 192.168.1.41 192.168.1.24

Dans un premier exemple, le RasPi4B qui va envoyer des données au PC qui va accuser réception : (Programmes python3: PC_Client_Box.py et RasPi4B_Client_Box.py.

La mise en œuvre de python3 pour l'échange de données se fonde sur la classe socket. La classe principale, socket.socket, permet de créer des objets socket, qui servent de points d'entrée pour la communication réseau (par exemple, pour créer un serveur TCP ou un client TCP).

Liens :

Les méthodes utilisées dans les programmes python n'ont pas besoin d'être introduites, sauf :

AU NIVEAU DU PC :
Dans un terminal démarré à partir du répertoire contenant le programme PC_Client_Box.py, on va le lancer par
sudo python3 PC_Client_Box.py
Le PC joue le rôle de serveur, c'est-à-dire qu'il va attendre une demande de connexion d'un appareil extérieur, demande qu'il va accepter en révélant qui s'est connecté (adresse IP du RasPi4B), puis va recevoir des données et envoyer un accusé de réception

AU NIVEAU DU RasPi4B
Après avoir démarré le programme au niveau du PC, on lance le programme au niveau du RasPi4B : dans un terminal démarré à partir du répertoire du programme RasPi4B_Client_Box.py, on le lance par
python3 RasPi4B_Client_Box.py
Le RasPi4B demande de se connecter au PC puis envoie des données et reçoit une réponse.

1.2. Raspberry Pi Pico2W comme client sur réseau local

Le module de communication WiFi permet d'utiliser le pico2W en 2 modes différents :

Les deux modes sont déclarés et utilisés de façon identique, seuls quelques mots-clés diffèrent. La communication de fait en trois grandes étapes :

Les détails sont donnés ci-après.

1.2.1. Insertion du Pico2W dans le réseau local par WiFi

Le PC est connecté à la box par fil ou par WiFi de façon traditionnelle. Il faut aussi s'assurer d'avoir lancé le WiFi à partir de la box.

Ensuite, avant de procéder à l'échange de données, il faut insérer le Pico2W dans le réseau :

On récupère ainsi l'adresse IPv4, par exemple 192.168.1.34. Ce résultat n'est pas vraiment utile mais permettra plus tard de vérifier les connexions.

1.2.2 Suite de la configuration du Pico2W comme terminal du réseau local : nœud IPv4

La programmation par nœud (sockets = prise ou nœud) permet de connecter deux nœuds d'un réseau pour communiquer entre eux. Un nœud écoute sur un port spécifique d'une adresse IP. Le serveur forme le nœud d'écoute tandis que le client établit la connexion avec le serveur.

On peut maintenant se connecter au serveur (box) via ce nœud (socket ou prise).

1.2.3. Échange entre PC et Pico2W sur réseau local

On va s'intéresser aux 2 programmes python3 et micropython : PC_Client_Box.py et Pico2W_Client_Box.py.

Le programme PC_Client_Box.py de l'exemple précédent est en principe valable ici aussi.

Le programme Pico2W_Client_Box.py contient 2 parties : Cependant l'exécution de ce dernier programme conduit à une erreur : la méthode with ... as ... n'est pas valable avec MicroPython utilisé pour programmer le Pico2W. Cette méthode a donc été remplacée et le bloc se termine maintenant par l'instruction s.close(), mais on sait que la fermeture n'est pas complète. Ceci peut poser problème lorsqu'on relance les programmes.
Alors l'instruction s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) a été rajoutée dans le programme PC_Client_Box.py comme le suggère le lien
https://lxadm.com/socket-error-errno-98-address-already-in-use/
pour permettre la réutilisation immédiate du port, même si celui-ci est dans l’état TIME_WAIT.
Ce programme devient donc maintenant PC_Client_Box2.py .

1.3. Carte Pico2W comme Terminal WiFi sur réseau local hébergeant un site web

1.3.1. Site Web simple "Hello World"

Tout comme le programme Pico2W_Client_Box.py, le programme Pico2W_SiteWEB.py est décomposé en 2 parties.
La partie 1, c'est-à-dire l'insertion dans le réseau du Pico2W est identique.
Au début de la partie 2, le Pico2W est configuré comme serveur, attendant que des clients demandent une connexion.

Voici la procédure d'exécution :

1.3.2. Commande extérieure de processus Pico2W

Les programmes Pico2W_Box_web_control_LED.py et Pico2W_Box_web_control_mouv.py sont des exemples qui permettent de commander, par une page web, un processus lié au serveur.
Dans le premier exemple, on utilise des boutons et dans le second exemple, une disposition spatiale qui ressemble beaucoup à celle utilisée par la classe Python - Bluedot dans la commande du véhicule autonôme, non présente dans MicroPython et qui en constitue donc une alternative.

L'explorateur peut être lancé sur un smartphone Android. Dans ce cas, le résultat ressemble fort à celui qu'on peut obtenir avec BlueDot sous python3. BlueDot n'est pas disponible sous MicroPython.


2. Communication WiFi sur réseau privé à construire (Point d'Accès - Hotspot)

Un réseau privé contient aussi un serveur et des clients. Mais ici, il faut configurer un appareil comme serveur appelé aussi "Point d'Accès" ou "Hotspot". Plusieurs situations sont présentées :

Le WiFi de la box internet n'est donc pas utilisé ici.

2.1. Un PC configuré comme serveur WiFi et un Raspberry Pi 4B comme client

2.1.1. Création du point d'accès

Le Point d'Accès est créé ici sur un ordinateur portable fonctionnant sous Ubuntu 24.04.5 LTS.

La création d'un Point d'Accès sans fil sous Linux est nettement facilité par la mise en œuvre de l'utilitaire linux-WiFi-hotspot.

Pour installer linux-WiFi-hotspot sur une machine Ubuntu, il faut ajouter l'archive de packages personnels lwh à l'aide de add-apt-repository :
sudo add-apt-repository ppa:lakinduakash/lwh
Maintenant, il faut mettre à jour les applications et installer linux-WiFi-hotspot avec :
sudo apt update
sudo apt install linux-WiFi-hotspot
Une fois le processus terminé, dans un terminal, on exécute
wihotspot
Une fenêtre apparaît, dans laquelle il faut définir un SSID (Nom du Point d'Accès), par exemple "Legion" et un mot de passe par exemple "blablabla".
Dans les paramètres avancés, on découvre le numéro de la passerelle associée (Gateway), par exemple 192.168.12.1, dont on aura besoin plus tard.
Il faut ensuite cliquer sur "Create hotspot" pour créer le point d'accès Legion, cette création n'étant valable que pour la session en cours.
En cas de besoin, dans une nouvelle cession, on exécute à nouveau
wihotspot
sachant que SSID et mot de passe ne doivent plus être redéfinis. Par contre "Create hotspot" est nécessaire.

En fonction de l'historique WiFi, une erreur peut intervenir suite à la commande
wihotspot

Error: Failed to run hostapd, maybe a program is interfering.
If an error like 'n80211: Could not configure driver mode' was thrown
try running the following before starting create_ap:
    nmcli r WiFi off
    rfkill unblock wlan
Command not found or exited with error status
Les commandes
nmcli r WiFi off
rfkill unblock wlan
rectifient effectivement la situation permettant
wihotspot
de s'effectuer maintenant sans erreur.

2.1.2. Mise en œuvre de python3 pour l'échange de données

Voici la procédure du programme PC_Serveur_wifi.py

Voici la procédure du programme RasPi4B_Client_wifi.py

2.2. Un Raspberry Pi 4B configuré comme serveur WiFi et un PC comme client

Le Raspberry Pi 4B fonctionne sous OS bookworm.

2.2.1. Création du point d'accès

Le Point d'Accès doit être créé ici sur un Raspberry Pi 4B fonctionnant sous OS bookworm.

La création d'un Point d'Accès sans fil sous Linux est nettement facilité en installant d'abord l'utilitaire Pi-Apps qui permet d'installer facilement des applications sur Raspberry Pi 4B :
wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps/master/install | bash

On peut alors installer linux-WiFi-hotspot à partir du menu des applications :
Accessoires / Pi Apps / Tools / Linux Wifi Hotspot

Pour créer l'émetteur WiFi, il faut aller dans le Menu des applications / Outils système et lancer
Wifi Hotspot
Il faut nommer le réseau (SSID par exemple "Suisse") et donner un mot de passe (par exemple "blablabla"). Il faut ensuite cliquer sur Create hotspot.
Le réseau est alors visible sur d'autres appareils, par exemple le PC. Cette création n'est valable que pour la session en cours.
En cas de besoin, dans une nouvelle cession, on retourne dans le Menu des applications / Outils système et on relance
Wifi Hotspot
sachant que SSID et mot de passe ne doivent plus être redéfinis. Par contre "Create hotspot" est nécessaire.

ATTENTION :
Un gros problème : en quittant le hotspot, la situation antérieure (client WiFi pour se relier à la box, par exemple) n'est pas rétablie.
Dans un terminal, la commande
nmcli device status
montre que le WiFi est non-géré !
En fait la configuration du NetWorkManager a dû être modifiée par la création hotspot ! On peut éditer la configuration du NetWorkManager par :
sudo nano /etc/NetworkManager/NetWorkManager.conf
Sous [ifupdown], il faut modifier "managed=false" par "managed=true" et
sous [keyfile], il faut modifier "unmanaged..." par "managed..."
La commande
nmcli device status
montre que maintenant le WiFi est géré.

2.2.2. Mise en œuvre de python3 pour l'échange de données

Voici la procédure du programme RasPi4B_Serveur_wifi.py

Voici la procédure du programme PC_Client_wifi.py

2.3. Un Raspberry Pi Pico2W comme Point d'Accès (serveur WiFi)

On peut utiliser le Pico2W pour créer un réseau sans fil personnel auquel d'autres appareils peuvent se connecter.
C'est le mode AP (AP = Access Point).
Voici quelques exemples d'utilisation du mode AP sur le Pico2W :

La carte microcontrôleur Pico2W n'intègre pas de périphérique permettant l'affichage ou l'échange d'informations. Pac contre, son module WiFi engage son utilisateur à le définir comme Point d'Accès (AP) et à le configurer comme serveur web. Ainsi n'importe quel autre appareil du genre PC ou Smartphone disposant d'un navigateur peut se connecter à ce HotSpot WiFi permettant ainsi tout échange d'information, y compris graphique, prévue par le langage HTML.

Les exemples de cette section illustrent ces possibilités.

2.3.1. Configuration du Pico2W comme Point d'Accès WiFi

Le programme Pico2W_AP.py valable en microPython comprend les étapes suivantes :

2.3.2. Exemples d'utilisation du Pico2W comme serveur WiFi

Tous les exemples ici possèdent contiennent 2 parties.

La PARTIE 1 est la même pour tous : La carte Pico2W est configurée comme Point d’Accès WiFi d'adresse 192.168.4.1

2.3.2.1. Serveur web simple - Affichage d'informations

Éléments sur la PARTIE 2 du programme Pico2W_AP_bienvenue.py :

Quelques remarques pour s'y connecter comme client :

2.3.2.2. Serveur web pour commande simple

Éléments sur la PARTIE 2 du programme Pico2W_AP_web_control_LED.py :

2.3.2.3. Serveur web pour commande du mouvement d'un véhicule

Éléments sur la PARTIE 2 du programme Pico2W_AP_web_control_mouv.py :

2.3.2.4. Serveur pour transmission de cap défini par un capteur "boussole"

Un module boussole électronique QMC5883L, capteur de champ magnétique à trois axes, est connecté à la carte Pico2W en I2C, pin 0 pour sda et pin 1 pour scl sans oublier l'alimentation 5V et la masse.
L'idée est de constituer le cap d'après les mesures et de le transmettre par WiFi à un client, par exemple un PC, pour une utilisation ultérieure.

Le programme MicroPython Pico_I2C_boussole.py a permis de réceptionner le module boussole électronique QMC5883L sans transmission des valeurs mesurées ou de leurs dérivés. Voir ici.

Ici

La carte Pico2W sert aussi à télécommander un bras manipulateur en InfraRouge. (Voir le programme MicroPython Pico_IR_Bras.py présenté ici)
Le simple enchaînement des deux programmes MicroPython Pico_IR_Bras.py et Pico2W_I2C_boussole.py fonctionne à priori, mais seulement pour la transmission de 15 valeurs concernant la boussole.
Ce problème est courant lors des échanges entre un serveur MicroPython (ici sur un Pico2W) et un client Python3 sous Ubuntu : la connexion fonctionne pour un nombre limité d’envois (15 dans ce cas), puis s’arrête, tandis que le serveur continue à générer des données sans que le client ne les reçoive.
La cause probable est le blocage du tampon d’envoi série ou socket sur le Pico2W/MicroPython qui se remplit parce que le client ne lit pas assez vite ou coupe la connexion prématurément. Lorsque le tampon est plein, les appels d’envoi (send, print, etc.) sur le Pico sont alors bloquants ou échouent silencieusement, mais la boucle du serveur peut continuer à générer des données. La solution a été ici d'introduire un échange simple d'acquittements (ACK) après réception de chaque message côté client.
Les deux programmes résultants sont :


3. Communication Bluetooth

Le Bluetooth est une technologie de communication sans fil à courte portée qui permet à différents appareils électroniques de se connecter et d’échanger des données sans utiliser de câbles.

Le Bluetooth fonctionne sur la bande de fréquence des micro-ondes (2,4 GHz) et utilise des transmissions radio pour connecter des appareils sur de courtes distances, généralement jusqu’à une quinzaine de mètres. Il est utilisé pour connecter des périphériques comme des écouteurs, des claviers, des souris, des haut-parleurs, ainsi que des objets connectés tels que des montres intelligentes ou des capteurs.

Les principaux avantages du Bluetooth sont sa simplicité d’utilisation, son économie d’énergie (surtout avec la version Bluetooth Low Energy), la sécurité des données grâce au chiffrement, et sa polyvalence avec de nombreux types d’appareils. Il existe différentes versions, chaque nouvelle version apportant des améliorations en vitesse de transfert, portée, sécurité et efficacité énergétique.

3.1. Généralités sur le Bluetooth pour comprendre les programmes utilisés

3.2. Commande à distance des broches GPIO du Raspberry Pi 4B par Smartphone via Bluetooth

3.2.1. Liens

3.2.2. Principe

L'idée est de commander à distance par smartphone un circuit utilisant les broches GPIO du Raspberry Pi.
La communication entre Smartphone et Raspberry Pi s'effectue par Bluetooth. On utilise ici aussi le logiciel python3.

Il faut d'abord installer 2 modules de python3 :

3.2.3. Connexion Bluetooth entre Smartphone et Raspberry Pi

La connexion Bluetooth entre Smartphone et Raspberry Pi se fait de façon traditionnelle. Par contre, il faut installer l'application "Blue Dot" sur le Smartphone pour assurer la communication Bluetooth avec le programme python. Après installation, il est possible d'ouvrir "Blue Dot" pour s'assurer que le Raspberry Pi est bien présent dans la liste des clients mais la connexion ne sera possible que lorsque le programme python aura été lancé sur le Raspberry Pi.

3.2.4. Expérimentation

L'expérimentation est ici très simple. Une LED est reliée à la broche GPIO18 par l'intermédiaire d'une résistance 220Ω.
A l'exécution, le programme python3
Bluetooth.py, très simple aussi, signale que le serveur a démarré mais qu'il attend la connexion.
Il faut alors démarrer l'application "Blue Dot" sur le Smartphone et le connecter au Raspberry Pi. Un gros point bleu apparaît alors sur le Smartphone.
En mettant le doigt dessus, la LED s'allume et lorsqu'on retire le doigt, la LED s'éteint.

Un application plus étendue est développée ici et .

3.3. Application du Bluetooth au Pico2W

https://picockpit.com/raspberry-pi/fr/tout-sur-le-bluetooth-sur-le-raspberry-pi-pico-w/

Le Pico2W fonctionne à la fois avec Bluetooth Classic et Bluetooth Low Energy. Bluetooth Classic et Bluetooth Low Energy (BLE) sont deux façons différentes pour les appareils de communiquer dans le cadre de la spécification Bluetooth.

Bluetooth Classic, également connu sous le nom de Bluetooth Basic Rate/Enhanced Data Rate (BR/EDR), est la version originale de Bluetooth. Elle a été conçue pour la transmission de données à haut débit, le streaming audio et le couplage d'appareils. Bluetooth Classic est couramment utilisé pour des applications telles que les haut-parleurs audio sans fil, les claviers, les souris et le transfert de fichiers entre appareils.

Bluetooth Low Energy (BLE), également connu sous le nom de Bluetooth Smart, est une variante économe en énergie de Bluetooth. BLE a été introduit dans le cadre de la spécification Bluetooth 4.0 et est optimisé pour les appareils à faible consommation d'énergie qui nécessitent une longue durée de vie de la batterie, tels que les trackers de fitness, les smartwatches, les appareils de domotique et les capteurs sans fil.

Le BLE présente les topologies de communication suivantes :

Note : Le Pico2W peut fonctionner à la fois comme un dispositif central et comme un dispositif périphérique.

3.3.1. Raspberry Pi Pico2W utilisant le Bluetooth pour communiquer avec une application Android

La procédure générale est la suivante

  1. Création d'une instance BLE et activation de la puce Bluetooth à partir de la classe bluetooth de MicroPython.
  2. Diffusion (advertising) : Rendre l’appareil visible pour qu’un autre périphérique puisse le détecter et s’y connecter (typiquement, un smartphone ou un ordinateur).
  3. Appairage et communication : Échanger des données entre le microcontrôleur et un autre périphérique via un modèle client-serveur (le microcontrôleur est souvent le serveur BLE qui annonce ses services/capteurs).
  4. Gestion des services et caractéristiques : Créer des services et des caractéristiques BLE pour transmettre des informations comme des états ou des mesures de capteurs.
  5. Notifications et callbacks : Envoyer des notifications (push) à un client connecté ou réagir à des événements reçus via des fonctions de rappel (callbacks).
  6. Ensuite, il est possible d’annoncer le périphérique et d’enregistrer des services/caractéristiques spécifiques, gérer les événements de connexion/déconnexion, et d’envoyer/recevoir des données.

https://electrocredible.com/raspberry-pi-pico-w-bluetooth-ble-micropython/

On envisage ici de lire le status d'un bouton poussoir et d'envoyer des commandes pour contrôler la led du Pico2W en utilisant l'application Android Serial Bluetooth Terminal).

Deux outils généraux MicroPython doivent être inclus dans un répertoire lib du Pico2W. Il s'agit des fichiers

Le programme Pico2W_Ble_LED.py lance l'application :