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)

14 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

Related Posts Plugin for WordPress, Blogger...