dimanche 26 octobre 2014

Communication RF 433 MHz entre Raspberry Pi et Arduino

Cet article a été mise à jour le 8 janvier 2021. À cette occasion, j'ai pu faire fonctionner la communication de l'Arduino vers le Raspberry pi uniquement. Pour une raison que j'ignore, la communication du Raspberry Pi vers l'Arduino ne semble plus fonctionner.

Nous avons déjà abordé la communication entre le Raspberry Pi et l'Arduino au moyen d'un câble USB, ce qui imposait une certaine proximité entre les deux cartes.

Aujourd'hui, nous nous débarrassons du câble:  l'Arduino et le Raspberry Pi s'échangeront des informations par ondes radio, à une fréquence de 433 MHz.


Matériel nécessaire

En plus du Raspberry Pi et de l'Arduino, nous utiliserons un émetteur et un récepteur 433 MHz, le modèle ultra-économique qu'on peut trouver sur eBay pour environ 1 euro.  Une antenne constituée d'un fil conducteur d'environ 17 cm vous permettra d'augmenter considérablement la portée de votre paire émetteur-récepteur.

Émetteur
Récepteur


Installation des bibliothèques 

Du côté de l'Arduino, j'ai utilisé la bibliothèque VirtualWire même si elle n'est plus mise à jour par son auteur (je ne me suis pas encore converti à RadioHead).  Donc, si ce n'est pas déjà fait, vous devriez télécharger et installer VirtualWire dans votre IDE Arduino.

Du côté du Raspberry Pi, j'ai utilisé le module Python rédigé par Joan du Forum Raspberry Pi.  Donc vous téléchargez le fichier vw.py et vous le placez dans le même répertoire que votre script Python (voir plus loin pour les scripts).  Ce n'est pas tout:  ce module requiert la bibliothèque pigpio .  Pour installer cette bibliothèque dans votre Raspberry Pi, vous tapez ces lignes de commande dans le terminal:

wget https://github.com/joan2937/pigpio/archive/master.zip
unzip master.zip
cd pigpio-master
make
sudo make install

Transmission de l'Arduino vers le Raspberry Pi

Branchez l'émetteur à l'Arduino de la façon suivante: 
  • Broche DATA de l'émetteur à la sortie 12 de l'Arduino
  • Broche Vcc de l'émetteur à la sortie 5 V de l'Arduino
  • Broche GND de l'émetteur à une des broches GND de l'Arduino

 Branchez le récepteur au Raspberry Pi de la façon suivante:
  • Une des broches DATA du récepteur (peu importe laquelle) à la pin GPIO 11 du Raspberry Pi.
  • Broche 5 V du récepteur à une des broches 3,3 V du Raspberry Pi
  • Broche GND du récepteur à une des pins GND du Raspberry Pi
Voici le sketch à installer dans l'Arduino (chaque message envoyé par l'Arduino sera numéroté, ce qui nous permet de vérifier si tous les messages envoyés sont reçus).



Et voici le script Python à installer dans le Raspberry Pi.  N'oubliez pas d'installer ce script dans le même répertoire que le fichier vw.py. 

Avant d'exécuter le script, vous devez mettre en marche le "démon pigpio" au moyen de cette ligne de commande:

sudo pigpiod








Transmission du Raspberry Pi vers l'Arduino 

N.B.: Lors de la mise à jour de cet article le 8 janvier 2021, je ne suis pas parvenu à faire fonctionner la transmission du Raspberry Pi vers l'Arduino.

 Branchez l'émetteur au Raspberry Pi de la façon suivante: 
  • Broche DATA de l'émetteur à la pin GPIO 25 du Raspberry Pi
  • Broche Vcc de l'émetteur à une des pins 5 V du Raspberry Pi
  • Broche GND de l'émetteur à une des pins GND du Raspberry Pi

 Branchez le récepteur à l'Arduino de la façon suivante:
  • Une des broches DATA du récepteur (peu importe laquelle) à l'entrée 11 de l'Arduino.
  • Broche 5 V du récepteur à la sortie 5 V de l'Arduino 
  • Broche GND du récepteur à une des pins GND de l'Arduino

Voici le sketch à installer dans l'Arduino (n'oubliez pas d'afficher le moniteur série, où les résultats reçus seront affichés):



Et voici le script Python à exécuter par le Raspberry Pi (n'oubliez pas d'installer ce script dans le même répertoire que le fichier vw.py). 

Avant d'exécuter le script, vous devez mettre en marche le "démon pigpio" au moyen de cette ligne de commande:

sudo pigpiod






Si vous préférez une communication 433 MHz entre deux Arduinos, référez-vous à cet article.  Et j'ai tout plein d'articles sur le Raspberry Pi qui vous plairont peut-être.

Yves Pelletier (Twitter:  @ElectroAmateur)

26 commentaires:

  1. Encore un bon tuto :)

    RépondreSupprimer
  2. Bonjour,
    Quand il est écrit " la pin GPIO 11 " c'est bien la pin 11 du connecteur. Car j'ai un peu de mal avec les N° de GPIO et les numero de pin. J'ai un raspberry pi B+
    Merci

    RépondreSupprimer
    Réponses
    1. C'est la pin 11 en notation BCM ou la pin 23 en notation Board. Vous pouvez vous baser sur le schéma qui apparaît dans l'article, le fil bleu est branché sur la bonne pin.

      Supprimer
  3. Bonjour,
    j'ai bien suivie ce tuto, mais lorsque je lance la commande python recepteur433Mhz.py, il ne se passe rien.
    Concernant la partie matériel cela fonctionne correctement car j'ai testé avec RFSniffer (cf adafruit).

    J'ai pense a un problème de définition des broches dans le code python, mais si on utilise la notation BCM je doit bien indiquer 23 pour mon montage.
    Voici un extrait de mon gpio readall: (je suis sur un rpi B+)
    Physical | V | Mode | Name | wPi | BCM |
    16 | 0 | OUT | GPIO. 4 | 4 | 23 |
    18 | 0 | IN | GPIO. 5 | 5 | 24 |

    Coté arduino j'ai forcé la définition de la pin d’émission:
    int pin = 12;
    vw_set_tx_pin(pin); // dans mon void setup ()

    J'ai également fait afficher sur mon port série des messages avant et après l’émission:

    Serial.println("avant emission");
    digitalWrite(13, true); // Flash a light to show transmitting
    vw_send((uint8_t *)message, strlen(message));
    vw_wait_tx(); // Wait until the whole message is gone
    digitalWrite(13, false);
    Serial.println("apres emission");

    Ces messages s'affichent bien dans la console.

    Une idée pour m'aider a debuger?
    PS: j'ai également forcé les broches pour la deuxieme partie du tuto (rpi vers arduino), et j'ai le même comportement.

    RépondreSupprimer
    Réponses
    1. Bonjour. J'ai le même problème et peu de moyens de débugger. J'ai suivi le tuto à la lettre mais strictement rien en se passe... Je vais voir si d'autres tutos en ligne peuvent m'aider.

      Supprimer
  4. Bonjour, je voulais juste savoir comment installer VirtualWire dans l'IDE Arduino?. Mais aussi, comment placer le fichier vw.py dans le même répertoire que le script Python? Merci!

    RépondreSupprimer
  5. Bonjour !

    Merci pour ton tuto. J'aimerai juste signaler quelques petites choses pour ceux qui aimeraient communiquer entre deux raspberry.
    Je l'ai fait mais d'une raspberry à la même et il faut changer le code. Déjà, il faut fermer le canal tx à la fin de chaque émission (sinon on bloque la réception visiblement) et il faut penser à nettoyer les waveform en faisant un pi.wave_clear() au démarrage du pi et à chaque tour de boucle (du côté émetteur).

    Merci pour ce tuto en tout cas ! Si tu en as un sur radiohead en préparation, ça serait top !

    RépondreSupprimer
  6. Bonjour !

    Super tuto ! merci beaucoup!

    Pour ma part, j'ai eu du mal à faire fonctionner le récepteur sur raspberry, il me lisait des valeurs non cohérentes et à l'oscillo il y avait des fronts bizarre à la réception...

    Mon rasp ne donne pas un 5V parfait (petit bruit) et il semble que ce type de module low cost apprécie guère.
    Avec une alim externe ou le 5V d'un arduino, pas de soucis ...
    J'ai du mettre un condo de découplage entre 5v et la masse et tout roule maintenant !

    Ca pourra peut-être aider quelqu'un...

    RépondreSupprimer
  7. Bonjour,
    j'ai fait le même câblage que vous ensuite j'ai mis le même code mais j'ai l’émetteur qui marche après le récepteur ne reçoit pas le message . J'ai vérifié le câblage plusieurs fois mais c'est juste et le récepteur est nouveau donc je ne sais pas quel peut être le problème ??

    RépondreSupprimer
  8. Je ne reçois rien quand j'envoi des messages depuis l'arduino vers le rpi
    J'ai reverifié le cablage pas de souci à ce niveau là. Je ne sais pas comme debugger ca, une idée ?

    RépondreSupprimer
  9. Pareil, à la réception, je recois difficilement quelquechose.
    A l'émission, apres avoir testé 10 fois, je n'ai toujours rien réussi à envoyer avec VirtualWire. J'ai l'impression qu'en fait aucun signal n'est émis depuis mon RBPI.
    Par contre, ça marche tres bien avec RCSwitch.
    Pour ce que concerne Radiohead, je n'ai encore rien trouvé sur le web que je puisse tester ... :).
    Si quelqu'un a des solutions pour débloquer l'émission VirtualWire depuis un RBPI, je pense qu'on est pas mal à être preneur ... :)

    RépondreSupprimer
  10. Si je ne me trompe pas, la broche data du module de réception que vous branchez directement sur une pin du GPIO a une tension de 5V !!!

    ATTENTION : les PIN du GPIO n'acceptent au maximum que du 3,3V ... le courant circulant est probablement suffisamment faible pour ne pas endommager le raspberry.
    Qu'en pensez-vous ?

    RépondreSupprimer
    Réponses
    1. Il serait plus prudent d'alimenter le récepteur avec 3,3 V, en effet.

      Supprimer
  11. Bonjour
    Peut-on utiliser cette solution pour relier un RAspberry avec plusieurs Arduino.
    je cherche à déployer des capteurs dans ma maison et je me pose la question de savoir comment les transmettre et récupérer les informations.
    Merci de votre aide.

    RépondreSupprimer
  12. Bonjour,
    J'ai vue qu'il était possible d'alimenter l'émetteur jusqu'a 12V. J'ai essayer avec une alimentation 12V, mais cela n'a pas l'aire de fonctionner.
    J'ai tenté divers pont diviseur de tension pour réduire l'alimentation (6V, 5V et 3V) mais cela ne fonctionne pas non plus.
    J'ai l'impression que c'est dû au fait d'utiliser une alimentation extérieur. Est-ce que quelqu'un vois pourquoi cela poserait problème.

    PS : en 5V depuis l'arduino ça passe

    RépondreSupprimer
  13. Bonjour et merci pour ce tuto!

    J'essaye ce schéma avec un rpi 3 donc j'ai simplement adapté les sorties GPIO.
    Une erreur s'affiche lorsque je tente de lancer pigpiod dans la console que je ne sais pas résoudre (je suis encore un peu novice en utilisation de la console).

    Le message est le suivant:

    2017-06-08 15:34:58 initInitialise: Can't lock /var/run/pigpio.pid
    Can't initialise pigpio library


    Je comprend le problème mais n'ai aucune idée de comment le résoudre. Quelqu'un saurait m'aider?

    Merci beaucoup par avance! :)

    RépondreSupprimer
    Réponses
    1. Je n'ai pas eu l'occasion de l'expérimenter moi-même, mais le remède recommandé sur le web est d'écrire les deux lignes de commande suivantes:

      sudo killall pigpiod
      sudo pigpiod

      Supprimer
    2. Merci, j'ai tenté cette solution plusieurs fois mais ça n'a rien changé au problème...

      De plus d'autres erreurs sont indiquées par la suite, ce qui m'amène à de nouvelles questions:

      - Comment faire pour désinstaller entièrement PIGPIO? je voudrais recommencer de zéro voir si ça peut venir d'une fausse manip (je n'arrive pas à trouver la commande à utiliser)

      - Je me demandais si il fallait mettre les fichiers python dans le dossier crée PIGPIO?

      - Enfin, il semble qu'une erreur suivante apparait au niveau du fichier recepteur:

      File "recepteur433MHz.py", line 8
      SyntaxError: Non-ASCII character '\xc3' in file recepteur433MHz.py on line 9, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


      Je finis par me demander si des fonctions sont différentes entre le rpi 2 et 3?

      Merci pour votre aide...

      Supprimer
    3. Pour ta dernière erreur, c'est juste que le code python est mal "copié collé".
      Installe le avec un wget comme pour pgpio

      Supprimer
  14. this works! but I can receive only few messages...

    RépondreSupprimer
  15. Bonsoir, le module Python rédigé par Joan du Forum Raspberry Pi, le fichier vw.py et la bibliothèque pigpio, ne sont plus disponibles, auriez-vous une alternative ?!?!
    Merci.
    William

    RépondreSupprimer
    Réponses
    1. Le site de pigpio a migré de abyz.co.uk vers abyz.me.uk. Je viens de mettre à jour les liens de l'article.

      Supprimer
  16. Salut. Merci pour l'information.
    Je l'ai testé avec un capteur de son numérique RF 433 MHz et, lors de la détection d'un son, le message "Capteur activé" est reproduit. Maintenant j'ai une question;

    Est-il possible de lire ce message via PHP en tant que page Web? C’est-à-dire qu’il ya un bouton fixe où il est indiqué "Capteur de son" et quand il est activé, un message "Capteur activé" apparaît à côté du bouton. Si possible, à quoi ressemblerait-il?

    Le flux est le suivant: Capteur de son -> arduino Nano -> module TX ---> module RX ---> Raspberry -> WEB

    RépondreSupprimer
  17. Bonjour,

    Un excellent tuto que je tente de suivre en 2019.
    Je tente d'envoyer les infos depuis l'ARDUINO vers le PI. (PI 3 B+)

    En utilisant les différents codes, j'ai une erreur à l’exécution du code Python :
    print("".join(chr (c) for c in rx.get()))
    IndentationError : exprecter an indented block

    Puis-je avoir de l'aide pour résoudre cette erreur ?



    RépondreSupprimer
  18. Bonjour, merci beaucoup pour l'article! Je ne comprend pas les bornes de branchement sur la raspberry pi (j'ai une 3 B+). Sur le schéma pour le pi comme récepteur la borne data indique gpio16 mais sur le code c'est TX=25. le programme utilise la norme bcm ou la position du soc ? Je suis un peu paumé

    RépondreSupprimer