Bonjour à tous, l'objectif du jour est de pouvoir faire communiquer une carte Arduino Uno, Arduino Mega et Arduino Nano ensemble !
Petite contrainte supplémentaire : La carte Uno ne doit écrire qu'a la MEGA, la MEGA n'écrit qu'a la Nano, et enfin la Nano n'écrit qu'a la UNO !
1er étape : Cabler mes différents capteurs
Comme indiqué dans la fiche produit du capteur, je peux brancher mes capteurs HC-12 de manière classique pour la UNO et la NANO :
VCC : 3.3V | GND : GND | RXD : 4 | TXD : 5 | SET : 6
Note : J'utilise un shield sur la Nano qui n'est pas obligatoire
De même comme il est précisé dans le code du HC-12 pour l'Arduino Mega les Pins RXD et TXD sont imposées, on a donc :
VCC : 3.3V | GND : GND | RXD : 46 | TXD : 48
2éme étape : Mise en place du code
Grâce aux codes fournis dans la fiche produit, je compile les codes avec la librairie "SoftWareSerial" pour l'Arduino Uno et Nano, et le code avec la librairie
"AltSoftSerial" pour l'Arduino Mega.
Ainsi mes cartes communiquent entre elles :
- 1 message envoyé depuis la UNO : reçu par la MEGA et la Nano
- 1 message envoyé depuis la MEGA : reçu par la UNO et la Nano
- 1 message envoyé depuis la Nano : reçu par la MEGA et la UNO
3éme étape : Communication deux à deux
Afin de s'adresser à un capteur HC-12 précis, il est possible de choisir un channel précis ! Pour ce faire il faut utiliser le mode AT.
Afin d'accéder à ce mode, il faut brancher "SET" sur la masse (GND) de vos Arduino.
Commandes existantes :
Vérification du mode : AT --> Renvoie OK (Permet de s'assurer que l'on se trouve dans le mode).
Afficher le Setup : AT+RX à Renvoie les paramètres
Choix du Baudrate : AT + B.... --> Renvoie OK+B.... Exemple: Si je veux le BaudRate 9600 je commande : AT+B9600, le moniteur répondra OK+B9600.
Choix du Channel : AT+C... --> Renvoie OK+C... Je peux choisir un channel de 001 à 100.
Choix du Mode : OK+FU. --> Renvoie OK+FU. Je peux choisir le mode de 1 à 4 (Le mode de communication classique est le FU3)
Choix du Niveau de communication : OK+P. --> Renvoie OK+P. Choix du niveau ce qui influence la puissance de transmission
Cas d'application : Si je laisse le channel par défault (1) sur l'Arduino MEGA, et place sur le Channel 2 (AT+C002) l'Arduino Uno et Nano :
- 1 message envoyé par la MEGA : Reçu par aucune des cartes
- 1 message envoyé par la Nano : Reçu par la UNO uniquement
- 1 message envoué par la UNO : Reçu par la Nano uniquement
4éme étape : Atteindre notre objectif !
Maintenant que l'on sait communiquer à un channel précis, il reste à automatisé le changement de channel, afin de pouvoir recevoir un message sur un channel et l'envoyer sur un autre channel !
Si on résume les étapes pour changer de channel à partir du mode émission : il faut brancher le SET sur la masse, et envoyé la commande de changement de channel (AT+C...).
Pour ce faire, nous allons brancher le SET sur une Pin Digital que nous feront passer de l'état haut pour l'émission, à l'état bas pour le changement de mode ! Il ne nous restera qu'a écrire dans le Serial la commande souhaité.
Établissons alors les channels des communications que nous allons utiliser :
Et maintenant traduisons cela dans le code :
(Pour la Nano et la UNO)
(Pour la MEGA)
Fonctionnement du code : Grâce au switch case, je peux choisir de paramétrer ma carte. Pour y accéder je n'ai qu'a rentrer "$", je peux ensuite rentrer ma commande. Exemple : $p --> affiche les paramètres, $3ac --> Rentre 3 dans channel, affichage 3 et rentre dans la channel 3 du HC12.
Alors je vous montrerai le résultat mais en testant le programme, nous avons très vite constaté que le HC-12 est plutôt lent, et qu'il est nécessaire d'appliquer des delay (enfin des safe-delay) afin de laisser les trams de réponses arriver sans être perturbées.
Le programme fonctionne bien, mais il y a toujours un moment où il se "dérègle" et où les trams sont reçu de manière déformée (retour à la ligne à chaque caractère, des symboles étrange comme '⸮').
Je ne suis pas parvenu à résoudre le problème pour le faire fonctionner de manière constante.