Robokite/ComSansFil
Réalisation d'une communication sans fil entre deux arduino avec une paire d'émmetteurs-récepteurs à bas coût 433Mhz
Introduction
Cette page vise à excpliquer la procédure utilisée pour faire communiquer 2 arduinos entre elles. Elle permet d'envoyer des données de type chaine de caractère ou dans notre cas des entiers en utilisant une paire d'émetteur récepteur 433Mhz de ce type.
Les scripts présenté sont basés sur un tutoriel plus complet réalise par SKYWOOD et disponibles ici.
Branchements
Il est possible de choisir les pattes avec lesquelles ont souhaite émettre et recevoir les données (cf tutoriel indiqué dans l'introduction). Dans notre cas, nous allons utiliser les pattes par défaut.
Le plus petit module est l'emetteur , le grand module est le récepteur (un peu plus conséquent sans doute car il doit falloir filtrer légèrement les signaux reçu.
Aussi, la simplicité de ces modules se retrouve dans leurs branchements:
Branchement de l'arduino au récepteur:
Arduino ------ Récepteur
5V ------ 5V
D11 ------ Data (n'importe laquelle des 2 pattes si vous en avez 2 sur le récepteur)
GND ------ GND
Branchement de l'arduino à l'émetteur:
Arduino ------ Emetteur 5V ------ 5V D12 ------ Data GND ------ GND
Il faut ensuite installer la libraire VirtualWire, à télécharger ici et à placer dans le dossier libraries de votre dossier d'installation arduino.
La librarie VitrualWire crée un protocole de communication assez semblable à de l'UDP: elle vérifie l'intégrité des messages à la réception mais ne s'occupe pas de les renvoyer si un packet à été loupé. Elle ne permet d'envoyer que des chaines de caractères. Pour envoyer des entiers ou des floatant sans gaspiller de bande passante, il faudrait créer notre propre fonction de convertion. Mais dans un premier temps, nous allons simplement utiliser les fonctions fournies par arduino itoa() et atoi() qui permettent respectivement de transformer une chaine de caractère en un int et un int en une chaine de caractère. Avec cette méthode un int qui représente normalement deux octets sera envoyé sous forme d'une chaine de caractère entre 1 et 5 caractère suivant sa valeurs. Soit entre 1 et 5 octet : perte de bande passante.
Quoiqu'il en soit, les sketchs suivants fonctionnent:
Emetteur
- include <VirtualWire.h> // inclusion de la librairie VirtualWire
// DATA D12!!!
char SensorMsg1[10]; unsigned int SensorData1 = 42239;
void setup() // Fonction setup() {
Serial.begin(9600); Serial.println("Demarrage");
vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds
}
void loop() // Fonction loop() {
itoa(SensorData1,SensorMsg1,10); Serial.print(SensorMsg1); // On signale le début de l'envoi vw_send((uint8_t *)SensorMsg1, strlen(SensorMsg1)); // On envoie le message vw_wait_tx(); // On attend la fin de l'envoi Serial.println(" envoyé !"); // On signal la fin de l'envoi
delay(2000); // Et on attend }
Récepteur
- include <VirtualWire.h> // inclusion de la librairie VirtualWire
// RECEPTEUR : DATA D11 // Sensors unsigned int SensorData1; char SensorMsg1[10];
void setup() // Fonction setup()
{
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor Serial.println("Start"); // Petit message de bienvenue
vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT) vw_rx_start(); // Activation de la partie réception de la librairie VirtualWire
}
void loop() // Fonction loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN) uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent {
if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non { Serial.print("RX : "); for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial //Serial.print(buf[i]);
SensorMsg1[i] = char(buf[i]);
Serial.println(""); }
SensorMsg1[buflen] = '\0'; SensorData1 = atoi(SensorMsg1); Serial.println(SensorData1); }
}