.
Mise à jour le 31/05/2017 : Dans cet article, nous allons voir comment envoyer des ordres depuis un pc vers un arduino au travers de la communication RF de deux xbee.
.
Schéma de principe pour le module Xbee
Dans ce schéma, on peut distinguer deux parties :
L’émetteur : il est constitué d’un PC, d’un arduino et d’un shield xbee.
Le récepteur : il est constitué d’un arduino et d’un shield xbee voir description . Il est également relié à une les et un bouton poussoir par le biais d’un shield Grove méga (mais vous pouvez adapter avec votre matériel sans problème).
Dans notre article, nous allons voir comment allumer une LED à distance mais aussi comment recevoir une information provenant du récepteur au travers d’un bouton poussoir.
Partie récepteur
Il faut donc préparer l’arduino pour qu’une led et un bouton poussoir y soient connectés. Il faut également solidariser le tout avec un shield xbee. Dans notre exemple nous avons placé la LED sur le pin D12 et le bouton sur le pin D2. Nous avons également branché le module xbee sur le port série hardware n°1 (par le biais d’un câblage et non en enfichant le shield sur l’arduino, cela permet de libérer le port COM de base qui sert également à la programmation de l’arduino et évite ainsi de devoir bouger les jumpers sans arrêt).
Au niveau programmation, nous allons coder une partie qui va permettre d’effectuer deux actions :
1) On va lire les données provenant du shield xbee pour voir si nous avons reçu un ordre et transmettre cet ordre à la LED (allumer ou éteindre)
2) On va envoyer l’état du bouton, si celui ci a changé, au PC.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
//On place le bouton sur le pin D2 const int buttonPin = 2; //Onb place la LED sur le pin D12 const int ledPin = 12; //Variable permettant de connaitre le dernier état du bouton int lastState = LOW; void setup() { //On initialise le port COM xbee Serial1.begin(9600); //On initialise la LED pinMode(ledPin, OUTPUT); //On initialise le bouton pinMode(buttonPin, INPUT); } void loop() { // RECEPTION D'UN ORDRE String lastOrdre = ""; while(Serial1.available()) { //On récupère le caractère char lastchar = Serial1.read(); //Si celui ci est un # on s'arrete là, l'ordre est complet if(lastchar == '#') { break; } //Sinon on concatene avec le reste de l'ordre lastOrdre += lastchar; } //Si la taille de l'ordre est > à 0 if(lastOrdre.length() > 0) { //Si l'ordre est ALLUMER if(lastOrdre == "ALLUMER") { //On passe la led à l'état haut (on l'allume) digitalWrite(ledPin, HIGH); } //Si l'ordre est d'éteindre if(lastOrdre == "ETEINDRE") { //On passe la led à l'état bas, on l'éteint digitalWrite(ledPin, LOW); } } delay(50); //EMISSION D'UN ORDRE //On récupère l'état actuel du bouton int currentState = digitalRead(buttonPin); //Si l'etat actuel du bouton est différent de celui qu'on avait enregistré la derniere fois, //on sait qu'on doit déclencher un nouvel ordre (on a changé d'état) if(currentState != lastState) { //Tout d'abord, on enregistre le nouvel état lastState = currentState; //Si l'état est haut if(lastState == HIGH) { //On demande l'allumage au PC Serial1.write("ALLUMER#"); } //Si l'état est bas if(lastState == LOW) { //On demande l'extinction au PC Serial1.write("ETEINDRE#"); } } } |
Partie émetteur – Arduino
La partie émetteur est la plus basique au niveau branchements : Nous avons juste branché un shield xbee par le biais de câbles (comme pour le récepteur) sur le port Série hardware n°1 et nous avons relié l’arduino au port USB.
Le programme de la partie émetteur est très simple, c’est une sorte de routeur. Il va recevoir les ordres du pc qu’il transmet au récepteur et il reçoit des ordres du récepteur qu’il transmet au pc. On utilise donc deux canaux série : le canal série Arduino/PC et le canal série Arduino/xbee.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
void setup() { //On initialise le port Serie Arduino / PC Serial.begin(9600); //On initialise le port Serie Arduino / Xbee Serial1.begin(9600); } void loop() { // RECEPTION D'UN ORDRE PROVENANT DE L'ARDUINO String lastOrdre = ""; while(Serial1.available()) { //On récupère chaque caractere provenant du module xbee char lastchar = Serial1.read(); //On concatene le caractère au reste de l'ordre lastOrdre += lastchar; //Si le caractère reçu est un #, on s'arrete là, fin de l'ordre. if(lastchar == '#') { break; } } //Si la taille de l'ordre est supérieur à 0 if(lastOrdre.length() > 0) { //On le renvoie directement vers le PC Serial.println(lastOrdre); } delay(50); // RECEPTION D'UN ORDRE PROVENANT DU PC lastOrdre = ""; while(Serial.available()) { //On récupère chaque caractère provenant du PC char lastchar = Serial.read(); //On concatene le caractère au reste de l'ordre lastOrdre += lastchar; //Si le dernier caractère était un #, on s'arrete là if(lastchar == '#') { break; } } if(lastOrdre.length() > 0) { //On transmet l'ordre à l'autre arduino via le shield Xbee Serial1.print(lastOrdre); } } |
Partie émetteur – PC
La partie émetteur PC est assez similaire à la partie récepteur : il va lire les ordres reçus (état du bouton poussoir) et envoyer des ordres (allumer ou éteindre la led).
Dans notre exemple, nous utilisons un bouton nommé « LED » pour allumer ou éteindre la LED. Si on reste appuyé sur le bouton, la LED reste allumée. Si on relâche, elle s’éteint.
En revanche, tant qu’on reste appuyé sur le bouton poussoir, la case à cocher reste cochée, si on relâche le bouton poussoir, la case à cocher se décoche.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Au chargement du programme, on ouvre le port COM 3 SerialPort1.PortName = "COM3" SerialPort1.Open() End Sub Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 'A la fermeture de fenetre, on ferme le port COM et on détruit le composant SerialPort1 SerialPort1.Close() SerialPort1.Dispose() End Sub 'Evenement reçu lorsqu'on presse le clic souris sur le bouton "LED" Private Sub btnLed_MouseDown(sender As Object, e As MouseEventArgs) Handles btnLed.MouseDown 'On envoie l'ordre d'allumer la LED SerialPort1.Write("ALLUMER#") End Sub 'Evenement reçu lorsqu'on relache le clic souris du bouton "LED" Private Sub btnLed_MouseUp(sender As Object, e As MouseEventArgs) Handles btnLed.MouseUp 'On envoie l'ordre d'éteindre la led SerialPort1.Write("ETEINDRE#") End Sub 'Evenement reçu lorsqu'on reçoit des données sur le port COM provenant de l'arduino Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 'On lit la ligne de données provenant de l'arduino Dim valeurDepuisArduino As String = SerialPort1.ReadLine().ToString() 'On traite l'information SetValeur(valeurDepuisArduino.Substring(0, valeurDepuisArduino.Length - 2)) End Sub 'Méthode déléguée. Cela permet de réaliser la mise à jour de l'interface graphique alors que l'on provient d'un autre 'thread que celui de l'interface (opération interdite en direct) Delegate Sub SetTextCallback(valeur As String) 'Fonction permettant de gérer l'appel par délégué Private Sub SetValeur(valeur As String) 'On regarde si on a besoin de passer par un délégué ou non If Me.InvokeRequired Then 'Si oui, on invoque le délégué en transmettant la valeur Dim d As New SetTextCallback(AddressOf SetValeur) Me.BeginInvoke(d, New Object() {valeur}) Else 'Si non, on demande à mettre à jour l'affichage directement MettreAJourAffichage(valeur) End If End Sub 'Fonction permettant de gérer l'affichage. On lui passe en paramètre la valeur reçue depuis l'arduino Private Sub MettreAJourAffichage(valeur As String) If valeur = "ETEINDRE" Then 'Si la valeur reçue est "ETEINDRE" on décoche la case à cocher chkBouton.Checked = False ElseIf valeur = "ALLUMER" Then 'Si la valeur reçue est "ALLUMER" on coche la case à cocher chkBouton.Checked = True End If End Sub End Class |
Téléchargements
Télécharger => Émetteur PC.
Télécharger => Émetteur – Arduino.
Télécharger => Récepteur Arduino.