jeudi 16 février 2017

Communication entre Raspberry Pi et Arduino avec modules nRF24L01

N.B.: Cet article a été mis à jour le 29 décembre 2020 (es scripts sont désormais compatibles avec Python 3).

Nous voyons aujourd'hui comment établir une communication entre un Raspberry Pi et un Arduino.

Pour des raisons de simplicité, je vous propose des scripts qui permettent une communication unidirectionnelle:  un des deux appareils émet des informations, et l'autre appareil les capte.

Les possibilités sont donc:

- Un Raspberry Pi émetteur qui envoie des informations à un Arduino récepteur.
- Un Arduino émetteur qui envoie des informations à un Raspberry Pi récepteur.
- Un Raspberry Pi émetteur qui envoie des informations à un Raspberry Pi récepteur.

Les modules nRF24L01 offrent beaucoup plus de possibilités, comme par exemple une véritable conversation entre deux cartes (chacune agissant tour à tour comme émetteur et comme récepteur)­. Nous y reviendrons peut-être dans un futur article.

Réglages de l'Arduino

Si la communication que vous désirez établir implique la présence d'un Arduino (peu importe qu'il soit émetteur ou récepteur), référez-vous à cet article pour programmer la carte et y brancher convenablement le module nRF24L01.

Réglages du Raspberry Pi

Il faut tout d'abord s'assurer que le protocole SPI est activé.

Pour ce faire, on va dans le menu "Préférences", "Configuration du Raspberry Pi'.


Sous l'onglet "Interfaces", activer SPI, si ce n'est pas déjà fait.


Installation de la bibliothèque RF24

Voici ce que j'ai écrit dans le terminal pour télécharger et installer la bibliothèque RF24:

--------------------

wget http://tmrh20.github.io/RF24Installer/RPi/install.sh
chmod +x install.sh
./install.sh
sudo apt-get install python3-dev libboost-python-dev python3-setuptools python3-rpi.gpio 
cd rf24libs/RF24/pyRF24
chmod +x setup.py
python3 setup.py build
sudo python3 setup.py install 

------------------------

L'installation de la bibliothèque "libboost" et l'étape "setup.py build" nécessitent plusieurs minutes. 

Le circuit:

Voici d'abord un schéma identifiant les différents connecteurs du module nRF24L01:
Les connexions entre le module nRF24L01 et le Raspberry Pi sont:
  • GND du nRF24L01 : une des pins GND du Raspberry Pi (board 6: fil noir sur le schéma ci-dessous)
  • Vcc du nRF24L01 : une des pins 3V3 du Raspberry Pi (board 1: fil rouge)
  • CE du nRF24L01 : GPIO22 du Raspberry Pi (board 15: fil bleu)
  • CSN du nRF24L01 : GPIO8 du Raspberry Pi (board 24: fil vert)
  • SCK du nRF24L01 : SCKL du Raspberry Pi  (board 23:  fil orange)
  • MOSI du nRF24L01:  MOSI du Raspberry Pi (board 19:  fil rose)
  • MISO du nRF24L01:  MISO du Rasbperry Pi (board 21:  fil jaune)



Lors de mes tests, il n'a pas été nécessaire d'ajouter un condensateur de 10 μF en parallèle avec l'alimentation du nRF24L01,  C'est parfois conseillé.

Script en python pour que le Raspberry Pi agisse en émetteur





Script en python pour que le Raspberry Pi agisse en récepteur





Même si les scripts eux-même ne font aucune vérification, la bibliothèque s'assure que le module nRF24L01 est correctement branché.  Si ce n'est pas le cas, le message "radio not responding" s'affiche à l'écran.

Notez finalement qu'il existe bien d'autres façons d'établir une communication entre un Raspberry Pi et un Arduino, et nous en avons exploré quelques-unes dans le passé:  communication par USB et communication RF 433 MHz.

Yves Pelletier   (TwitterFacebook)

4 commentaires:

  1. Hello ,
    this is very helpful thank you
    i just have one question, how can i set multiple arduino transmitters for one Raspberry receiver.

    Thank you

    RépondreSupprimer
  2. Bonjour,

    Quelqu'un saurait il me dire si quelque chose (Library ou Hardware) à changé depuis que le tutoriel a été publié.

    Voilà 2 jours que je m'arrache les dents pour faire communiquer un pi avec un arduino et rien ne fonctionne :/

    Cordialement
    Leo

    RépondreSupprimer
    Réponses
    1. bonjour, je suis dans le meme cas, as tu trouvé une solution ?

      Supprimer
    2. Bonjour,
      ce script fonctionne. Pour vérifier la communication j'ai ajouté coté Arduino et coté Raspberry PI la commande radio.printDetails(). Bien vérifier les adresses RX_ADDR_P0-1 coté Arduino et TXADDR coté Raspberry PI sont le mêmes. Vérifier également la vitesse Data rate.

      Supprimer