Dans cet article, nous établissons une communication sans fil entre deux Raspberry Pi Pico munis d'un module nRF24L01. Les Raspberry Pi Pico seront programmés en MicroPython.
Les modules nRF24L01 sont conçus pour transmettre des informations à une fréquence radio de 2,4 GHz. Chaque module peut émettre et capter des signaux. La portée peut être de quelques dizaines de mètres (j'ai fait mes test avec deux modules distants d'environ 10 mètres et situés dans deux pièces différentes).
Connexions
Je possède deux paires de modules nRF24L01: des modules verts comportant 10 broches clairement identifiées, et des modules noirs comportant 8 broches qui ne comportent aucune identification.
Chaque Raspberry Pi Pico a été branché à un module nRF24L01 de la façon suivante:
- Broche VCC du nRF24L01 : sortie 3,3 V du Raspberry Pi Pico
- Broche GND du nRF24L01 : broche GND du Raspberry Pi Pico
- Broche SCK du nRF24L01 : broche GP6 du Raspberry Pi Pico
- Broche MOSI du nRF24L01 : broche GP7 du Raspberry Pi Pico
- Broche MISO du nRF24L01 : broche GP4 du Raspberry Pi Pico
- Broche IRQ du nRF24L01: pas branchée
- Broche CE du nRF24L01 : broche GP12 du Raspberry Pi Pico
- Broche CSN du nRF24L01: broche GP5 du Raspberry Pi Pico
Installation de la bibliothèque nrf24l01.py
Après avoir téléchargé la bibliothèque nrf24l01.py, il est important d'installer le fichier nrf24l01.py dans la mémoire flash du Raspberry Pi Pico (en utilisant, par exemple, le volet "Fichiers" de Thonny).
En me basant sur cet exemple, j'ai produit deux scripts distincts conçus pour être utilisés simultanément sur deux Raspberry Pi Pico différents: un script pour l'émetteur, et un script pour le récepteur.
Script de l'émetteur
Une fois par seconde, ce Raspberry Pi Pico incrémente un nombre entier et le fait émettre par le module nRF24L01. Il vérifie ensuite s'il reçoit une réponse de la part du récepteur.
-
""" | |
Émetteur nRF24L01 | |
Raspberry Pi Pico et module nRF24L01 | |
Une fois par seconde, une valeur numérique est envoyée, et on | |
vérifie si on reçoit une réponse. | |
Pour plus d'infos: | |
https://electroniqueamateur.blogspot.com/2022/02/raspberry-pi-pico-et-nrf24l01.html | |
""" | |
import ustruct as struct | |
import utime | |
from machine import Pin, SPI | |
from nrf24l01 import NRF24L01 | |
# définition des broches pour le Raspberry Pi Pico: | |
broches = {"spi": 0, "miso": 4, "mosi": 7, "sck": 6, "csn": 5, "ce": 12} | |
# Addresses (petit boutiste) | |
pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") | |
print("Emetteur NRF24L01") | |
csn = Pin(broches["csn"], mode=Pin.OUT, value=1) | |
ce = Pin(broches["ce"], mode=Pin.OUT, value=0) | |
nrf = NRF24L01(SPI(broches["spi"]), csn, ce, payload_size=8) | |
nrf.open_tx_pipe(pipes[0]) | |
nrf.open_rx_pipe(1, pipes[1]) | |
nrf.start_listening() | |
compteur = 0 # augmentera de 1 à chaque émission | |
while True: | |
# nous arrêtons d'écouter, le temps d'envoyer un message | |
nrf.stop_listening() | |
compteur = compteur + 1 # préparation du message à envoyer | |
print("envoi:", compteur) | |
try: | |
nrf.send(struct.pack("i", compteur)) # envoi du message | |
except OSError: | |
pass | |
# on écoute si l'autre Pico nous répond | |
nrf.start_listening() | |
# on attend pendant 250ms max | |
start_time = utime.ticks_ms() | |
timeout = False | |
while not nrf.any() and not timeout: | |
if utime.ticks_diff(utime.ticks_ms(), start_time) > 250: | |
timeout = True | |
if timeout: # aucune réponse reçue | |
print("echec, pas de reponse") | |
else: # une réponse a été reçue | |
(reponse,) = struct.unpack("i", nrf.recv()) | |
print ("reponse recue:", reponse) | |
# on attend une seconde avant l'envoi du prochain message | |
utime.sleep_ms(1000) |
-
Script du récepteur
Si ce Raspberry Pi Pico reçoit un message en provenance de l'émetteur, il calcule le modulo du nombre reçu et retourne le résultat à l'émetteur (il retourne donc le nombre "0" lorsqu'il reçoit un nombre pair, et le nombre "1" lorsqu'il reçoit un nombre impair).
-
""" | |
Récepteur nRF24L01 | |
Raspbery Pi Pico et module nRF24L01. | |
Si on reçoit un nombre entier, on accuse réception en | |
retournant son modulo. | |
Pour plus d'infos: | |
https://electroniqueamateur.blogspot.com/2022/02/raspberry-pi-pico-et-nrf24l01.html | |
""" | |
import ustruct as struct | |
import utime | |
from machine import Pin, SPI | |
from nrf24l01 import NRF24L01 | |
from micropython import const | |
# délai entre réception d'un message et attente du prochain message | |
POLL_DELAY = const(15) | |
# Délai entre réception d'un message et envoi de la réponse | |
# (pour que l'autre pico ait le temps de se mettre à l'écoute) | |
SEND_DELAY = const(10) | |
# définition des broches pour le Pico: | |
broches = {"spi": 0, "miso": 4, "mosi": 7, "sck": 6, "csn": 5, "ce": 12} | |
# Addresses (petit-boutiste) | |
pipes = (b"\xe1\xf0\xf0\xf0\xf0", b"\xd2\xf0\xf0\xf0\xf0") | |
csn = Pin(broches["csn"], mode=Pin.OUT, value=1) | |
ce = Pin(broches["ce"], mode=Pin.OUT, value=0) | |
nrf = NRF24L01(SPI(broches["spi"]), csn, ce, payload_size=8) | |
nrf.open_tx_pipe(pipes[1]) | |
nrf.open_rx_pipe(1, pipes[0]) | |
nrf.start_listening() | |
print("Récepteur nRF24L01; dans l'attente du premier message...") | |
while True: | |
if nrf.any(): # on a reçu quelque chose | |
while nrf.any(): | |
buf = nrf.recv() | |
compteur = struct.unpack("i", buf) | |
print("message recu:", compteur[0]) | |
utime.sleep_ms(POLL_DELAY) # délai avant la prochaine écoute | |
reponse = compteur[0]%2 # préparation de la réponse | |
utime.sleep_ms(SEND_DELAY) # on laisse à l'autre Pico le temps de se mettre à l'écoute | |
nrf.stop_listening() | |
try: | |
nrf.send(struct.pack("i", reponse)) | |
except OSError: | |
pass | |
print("reponse envoyee:", reponse) | |
nrf.start_listening() |
-
À lire également:
D'autres projets impliquant le Raspberry Pi Pico:
- Programmer le Raspberry Pi Pico en MicroPython avec Thonny
- Raspberry Pi Pico et carte SD
- Module Bluetooth HC-06 et Raspberry Pi Pico
- Lecture d'un tag RFID avec module RC522 et Raspberry Pi Pico
- Module GPS NEO 6MV2 et Raspberry Pi Pico
- Robot quadrupède à base de Raspberry Pi Pico
D'autres projets impliquant le module nRF24L01:
- Communication par nRF24L01 entre deux cartes Arduino
- Communication entre Raspberry Pi et Arduino avec modules nRF24L01
- Communication nRF24L01 avec cartes ESP32 et ESP8266 (IDE Arduino)
- Communication nRF24L01 avec cartes STM32 (IDE Arduino)
Yves Pelletier (Facebook)