dimanche 26 octobre 2014

Communication RF 433 MHz entre Raspberry Pi et Arduino

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 abyz.co.uk/rpi/pigpio/pigpio.zip
unzip pigpio.zip
cd PIGPIO
make
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 pins 5 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

Et vous exécutez le script en tapant:

python recepteur433MHz.py






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 à 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

Et vous exécutez le script en tapant:

python emetteur433Mhz.py





C'est quand même pas mal, ne trouvez-vous pas?   Je ne dispose malheureusement pas d'un deuxième Raspberry Pi pour faire des tests, mais les deux scripts en Python pourraient certainement être utilisés pour permettre à deux Raspberry Pi de communiquer entre eux.

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)

20 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

Related Posts Plugin for WordPress, Blogger...