Communication radio entre deux Arduino

Accueil/Communication radio entre deux Arduino
Communication radio entre deux Arduino 2016-12-20T11:37:48+00:00
Bonjour à tous, dans ce tutoriel, nous allons apprendre à faire communiquer deux Arduino à distance en utilisant des modules radio. Ces modules sont très petits, ce qui facilite la mise en place d’un tel dispositif dans tous vos projets, et au final très simple à utiliser pourvu qu’on sache par où commencer.

 

Le matériel

radio
Pour réaliser ce tutoriel vous devez vous procurer :

  • Deux Arduino, peu importe le modèle, tant que vous savez les programmer.
  • Deux modules éméteurs radio de 443MHz par exemple, vous pouvez les acheter pour quelques dollars sur ebay.
  • Deux modules récépteurs radio de la même fréquence que les éméteurs, ils sont souvent vendus avec les éméteurs.

Le montage

Raccorder ces modules radios est simple, vous devez simplement :

  • Relier tous les VCC au +5v de l’Arduino
  • Relier tous les GND au GND de l’Arduino
  • Relier le pin DATA de l’émetteur radio à un pin PWM de l’Arduino
  • Relier le pin DATA du récepteur radio au pin 2 de l’Arduino et pas un autre

Faites ce même montage pour les deux Arduino

 

La Programmation

Pour pouvoir utiliser ces modules radio, nous allons utiliser la librairie RCSwitch, que vous devez télécharger et ajouter à vos bibliothèques Arduino, pour cela, téléchargez ce zip et décompressez-le, puis placez le dossier dans le dossier librairie de l’IDE Arduino.

Une fois fait, ouvrez un nouveau programme, il faut commencer par indiquer que l’on va utiliser la librairie RCSwitch, on ajoute alors ce code :

#include<RCSwitch.h>

Puis il faut déclarer notre objet RCSwitch, qui represente notre couple éméteur récéteur radio :

RCSwitch mySwitch = RCSwitch();

Mais il faut maintenant définir les pins où l’on a branché les datas des modules, dans la fonction setup on marque donc :

void setup(){
  mySwitch.enableTransmit(10);  // L'émetteur est sur le pin 10
  mySwitch.enableReceive(0);  // Le pin 0, qui est le pin d'interruption 0, représente en fait le pin 2
}

Pour envoyer un message, plusieurs options s’offrent à vous, je vais vous parler de la plus simple entre deux arduino, elle permet d’envoyer un message décimal ( des nombres ), elle s’utilise comme suit :

mySwitch.send(5393,24);

Ici on envoie le code 5393, en indiquant que le message fait 24 bit. A vous de créer votre « protocol » de communication pour faire communiquer vos Arduino en créant des codes spécifiques, par exemple 111 peut pouvoir dire allume la lampe et 100 eteint la lampe.

Sur l’autre Arduino, pour récuperer le message, il existe une fonction toute faite qui est  :

int value = mySwitch.getReceivedValue();

La variable value va donc contenir le message recu, attention si cette valeur est zéro, c’est que le message s’est mal envoyé. Cette fonction ne doit être utiliser que si un message a été recu, c’est pourquoi on la place à l’intérieur d’une condition :

 if (mySwitch.available()) {
 
 int value = mySwitch.getReceivedValue();

// analyse du message
mySwitch.resetAvailable(); // On indique que le message est lu
}

Je vous propose enfin un dernier code, qui va juste tester le matériel, une Arduino va envoyer à l’autre toujours le même message en boucle et l’autre le recoit et l’affiche dans le moniteur série.

Dans la première Arduino entrez le code suivant :

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
 Serial.begin(9600);
 mySwitch.enableTransmit(10);
}
void loop() {
 mySwitch.send(5393, 24);
 delay(1000); 
 mySwitch.send(5396, 24);
 delay(1000);
}

Et dans la deuxieme :

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void setup() {
 Serial.begin(9600);
 mySwitch.enableReceive(0); 
}
void loop() {
 if (mySwitch.available()) {
 
 int value = mySwitch.getReceivedValue();
 
 if (value == 0) {
 Serial.print("Unknown encoding");
 } else {
 Serial.print("Received ");
 Serial.print( mySwitch.getReceivedValue() );
 Serial.print(" / ");
 Serial.print( mySwitch.getReceivedBitlength() );
 Serial.print("bit ");
 }
mySwitch.resetAvailable();
 }
}