Aujourd'hui nous allons découvrir le module RFM22.
Le RFM22 est un module bidirectionnel, c'est à dire qu'il peut à la fois émettre et recevoir une donnée. Ainsi avec plusieurs de ces modules, on peut les faire interagir et communiquer entre eux.
Datasheet du RFM22 disponible ici.
La librairie utilisée pour faire fonctionner ce produit a été développée par RadioHead, disponible ici.
EXEMPLE D'UTILISATION
Dans ce tutoriel, nous allons réaliser deux programmes. Le premier enverra la data suivante, PING. Le deuxième, à la réception de la précédente data l'affichera sur le moniteur série et enverra à son tour une data qui sera PONG. Cette dernière sera à son tour affiché par le premier programme sur son moniteur série. Ainsi avec le rebouclage des programmes nous aurons un effet PING-PONG!
- MATÉRIEL:
- - Arduino/Genuino Uno rev 3 (x2)
- Breakout RFM 22 (x2)
- Résistance 3.3KOhms (x6)
- Résistance 1.8KOhms (x6)
- Breadboard (x2)
- Câbles M/M
Pourquoi avoir chaque composant en double!?
Simplement car le module RFM22 communique par SPI avec la Uno. Puisque que nous avons besoin de 2 modules pour faire un jeu de PING-PONG, nous avons donc besoin de 2 arduino Uno et donc 2 fois plus de matériel.
- SCHÉMA DU MONTAGE:
Alimentation du montage:
Le module RFM22 est un module fonctionnant sous une alimentation de 3.3V. Impeccable me direz vous car l'arduino Uno possède une broche capable de délivrer ce niveau de tension. Or nous allons tout de même rencontrer une difficulté ici. Les cartes arduino fonctionnent en logique TTL, en 0-5V. Et nos deux cartes échangent leurs données par communication SPI, les niveaux de tension doivent donc être similaires pour que le protocole fonctionne. Donc le module et la Uno ne pourront pas communiquer puisque l'une est en 3.3 et l'autre en 5.
La seule solution pour faire fonctionner notre montage et d'arriver à mettre l'une des tensions au niveau de l'autre tension. Pour cela, il existe deux méthodes. La première est le "level shifter" (convertisseur de niveaux, ici utilisé en tant que réhausseur de tension), qui consiste à faire passer la tension 3.3V à du 5V. Ceci est réalisable avec l'aide de transistors et de résistances. La deuxième méthode est un pont diviseur de tension, à l'inverse de la technique précédente, il s'agit de partir d'un 5V pour arriver à une tension plus petite, ici du 3.3V. Pour la réaliser, il suffit simplement de disposer de résistances. Nous allons mettre en oeuvre la deuxième procédure.
Il existe également une autre méthode qui permet de ne pas avoir à adapter la tension. Pour cela, il suffit d'utiliser une carte Teensy à la place d'une arduino. En effet la Teensy fonctionne sous une alimentation de 3.3V.
Nous avons besoin de mettre en place des ponts diviseurs de tension pour la broche qui va servir de Clock, celle qui va servir de Chip Select et celle qui va servir de MOSI. Ces dernières sont respectivement les pins 13, 11 et 10 de l'arduino Uno. Il faut donc placer un pont diviseur entre ces dernières et leurs homologues du module RFM22. Ainsi le protocole de communication SPI pourra se dérouler correctement. Le schéma du montage montre comment disposer les résistances pour créer un pont diviseur de tension. Pour passer de 5 à 3.3V, il faut utiliser des résistances de 3.3KOhms et de 1.8KOhms.
Branchements:
- ==> Du module RFM22 au module RFM22:
- La broche GPIO 0 à la broche TX ANT.
- La broche GPIO 1 à la broche RX ANT.
- ==> Du module RFM22 à la carte arduino Uno:
- La broche 3.3V à la broche 3.3V.
- Le GND au GND.
- La broche SDO à la broche D12.
- La broche NIRQ à la broche D2.
==> De la carte arduino Uno à la breadboard (pont diviseur):
- Le GND au GND de chaque pont diviseur (soit à une patte de chaque résistance de valeur 3.3kOhms).
- La broche D10 à une patte d'une résistance de valeur 1.8kOhms.
- La broche D11 à une patte d'une résistance de valeur 1.8kOhms.
- La broche D13 à une patte d'une résistance de valeur 1.8kOhms.
==> De la breadboard (pont diviseur) au module RFM22:
- Du nœud des résistances 1.8 et 3.3kOhms à la broche SDI.
- Du nœud des résistances 1.8 et 3.3kOhms à la broche SCLK.
- Du nœud des résistances 1.5 et 3.3kOhms à la broche NIRQ.
Voilà pour les explications de la partie Hardware.
- CODE:
Pour réaliser ce tutoriel, il faut deux sketchs. Le premier qui envoie une donnée en continue et peut afficher une donnée sur le moniteur série dès qu'il en reçoit une. Et le deuxième qui affiche la donnée qu'il reçoit sur le moniteur série puis qui envoie une nouvelle donnée à son tour, seulement et seulement si il en a reçu une avant.
Premier Sketch:
- Code: Tout sélectionner
/* Skecth Ping-Pong */
#include <SPI.h>
#include <RH_RF22.h>
RH_RF22 rf22; // Définition de la commande.
uint8_t data[] = "PING"; // Donnée qui va être émise.
uint8_t buf[RH_RF22_MAX_MESSAGE_LEN]; // Variables qui vont permettre de
uint8_t len = sizeof(buf); // décrypter les données reçues.
void setup()
{
Serial.begin(9600);
Serial.println("Sketch PING.");
if (!rf22.init()) // Vérification que le modem soit correctement initialisé.
{
Serial.println("Echec de l'initialisation modem!");
}
else
{
Serial.println("Succes de l'initialisation modem!");
}
}
void loop()
{
rf22.send(data, sizeof(data)); // Envoi de la donnée(PING).
if (rf22.waitAvailableTimeout(500)) // Timeout.
{
if (rf22.recv(buf, &len)) // Réception d'une donnée(PONG).
{
Serial.println((char*)buf); // Affichage de la donnée reçue.
}
}
delay(400);
}
Deuxième Sketch:
- Code: Tout sélectionner
/* Skecth Ping-Pong */
#include <SPI.h>
#include <RH_RF22.h>
RH_RF22 rf22; // Définition de la commande.
uint8_t data[] = "PONG"; // Donnée qui va être émise.
uint8_t buf[RH_RF22_MAX_MESSAGE_LEN]; // Variables qui vont permettre de
uint8_t len = sizeof(buf); // décrypter les données reçues.
void setup()
{
Serial.begin(9600);
Serial.println("Sketch PONG.");
if (!rf22.init()) // Vérification que le modem soit correctement initialisé.
{
Serial.println("Echec de l'initialisation modem!");
}
else
{
Serial.println("Succes de l'initialisation modem!");
}
}
void loop()
{
if (rf22.recv(buf, &len)) // Réception d'une donnée(PING).
{
Serial.println((char*)buf); // Affichage de la donnée reçue.
rf22.send(data, sizeof(data)); // Envoi de la donnée(PONG).
}
}
Une fois les montages correctement réalisés et les deux sketchs dispatchés chacun dans un Arduino Uno, vous devriez obtenir les choses suivantes.
Lorsque vous avez chargé les sketchs. Le premier sketch devrait faire afficher quelque chose de similaire dans le moniteur série :
Le deuxième sketch devrait vous fournir quelque chose de semblable à ceci :
Et voilà, nous avons transformé nos deux cartes Arduino Uno en vrai pongistes professionnels. Effet PING-PONG. Nous avons réalisé un échange simple de données entre deux modules. Mais il est possible d'ajouter autant de modules que votre projet en nécessite. De plus, vous pouvez transmettre des données issues de capteurs et ainsi faire réagir un mécanisme à l'autre bout de la maison à la réception des données du capteur.
Seule l'imagination peut vous stopper dans vos projets.