Voici un tutoriel que j'ai écris pour un site de robotique. Il permet d'expliquer facilement comment communiquer entre une carte Arduino et un PC.
Présentation :
En robotique et plus généralement
en électronique on a souvent besoin d'échanger des informations entre différents
systèmes.
Par exemple si vous écrivez plusieurs fonctions (ou sous programmes) et que vous souhaitez les exécuter ou les tester à partir d'un système externe, vous aurez besoin d'échanger des infos entre le système de commande et le système à commander.
Par exemple si vous écrivez plusieurs fonctions (ou sous programmes) et que vous souhaitez les exécuter ou les tester à partir d'un système externe, vous aurez besoin d'échanger des infos entre le système de commande et le système à commander.
On peut évidement
utiliser des protocoles de communication courant comme l’I²C ou d’autre, mais
il est parfois plus simple et plus rapide de définir son propre protocole quand
il s’agit de quelque chose de simple.
Prenons un exemple à titre d’illustration.
Prenons un exemple à titre d’illustration.
Vous souhaitez faire une main robotisée capable de prendre, lâcher, se lever et se baisser. Elle sera commandée par un PC afin d’effectuer les différentes actions.
Dans un premier temps vous devez commencer par écrire vos 4 fonctions et les tester.
La liaison entre votre main et le PC de commande se fera par le port USB et les ordres seront envoyés avec n’importe quel logiciel qui peut envoyer des infos sur un port USB (L’environnement de développement Arduino intègre ce genre d’outils.) Si par la suite vous décidez de réaliser un logiciel de contrôle plus convivial pour l’utilisateur, il sera alors très simple d’envoyer les mêmes informations.
Dans un premier temps vous devez commencer par écrire vos 4 fonctions et les tester.
La liaison entre votre main et le PC de commande se fera par le port USB et les ordres seront envoyés avec n’importe quel logiciel qui peut envoyer des infos sur un port USB (L’environnement de développement Arduino intègre ce genre d’outils.) Si par la suite vous décidez de réaliser un logiciel de contrôle plus convivial pour l’utilisateur, il sera alors très simple d’envoyer les mêmes informations.
Pour seulement 4 ordres,
il est inutile de passer par un protocole compliqué. Le plus simple reste
d'envoyer l'ordre à exécuter sous la forme d’un caractère ASCII et d'écrire un
programme capable de reconnaitre le caractère reçu pour exécuter l'ordre
correspondant.
Pour cela on peut
utiliser un ‘SwitchCase’ Le programme exécutera la fonction choisie en fonction
du caractère qu'il a reçu.
A noter que le ‘SwitchCase a une particularité. Il n'accepte la réception que d'un seul caractère ASCII. Si on veut utiliser un ‘mot’ comme commande il faut passer par des chaines de caractères mais il faudra alors utiliser des If /Then/ Else
Pour visualiser la fonction qui sera exécutée on câble 4 LED
sur les sorties 10, 11, 12,13. On pourra facilement adapter ce code pour
commander des moteurs, des relais, des transistors etc…
Du PC on exécutera les
fonctions en envoyant la première lettre de la fonction souhaité (un ‘p’ pour
Prendre, ‘l’ pour Lâcher, ‘m’ pour monter, et ‘d’ pour descendre)
Regardons maintenant le code de notre exemple.
/*
Description:
Ce programme est un exercice d’initiation à la programmation
Il a pour fonction d'exécuter un sous programme en fonction d’un caractère
reçu par le port série.
Circuit: Arduino Duemilanove avec
connexion PC sur port USB
Câblage LED1 sur Pin 10
LED2 sur Pin 11
LED3 sur Pin 12
LED4 sur pin 13
Revision: V1.0
created by CROZEMARIE J.Pierre
Juin 2012
*/
//-----------------------------------------
// FONCTIONS
//-----------------------------------------
void Prendre()
{
digitalWrite(13, HIGH); // On
allume la LED1 pour vérifier que la fonction s'exécute correctement
delay(1000);
digitalWrite(13, LOW);
// pendent 1 seconde puis on l'éteint
}
//--------------------------------------
void Lacher ()
{
digitalWrite(12, HIGH); //On allume la LED2 pour vérifier que la
fonction s'exécute correctement
delay(1000);
digitalWrite(12, LOW); // pendent 1 seconde puis on l'éteint
}
//------------------------------------
void Monter ()
{
digitalWrite(11, HIGH); //On
allume la LED3 pour vérifier que la fonction s'exécute correctement
delay(1000);
digitalWrite(11, LOW); // pendent 1 seconde puis on l'éteint
}
//------------------------------------
void Descendre ()
{
digitalWrite(10, HIGH); //On allume la LED3 pour vérifier que la
fonction s'exécute correctement
delay(1000);
digitalWrite(10, LOW); // pendent 1 seconde puis on l'éteint
}
//------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println("Connexion etablie"); // permet de vérifier la
connexion
pinMode(13, OUTPUT); // On
configure les broches sur lesquelles sont
pinMode(12, OUTPUT); // branchées
les LED en mode 'sortie'
pinMode(11, OUTPUT);
pinMode(10,
OUTPUT);
}
void loop()
{
if
(Serial.available() > 0) {
char code =
Serial.read();
switch (ordre) { //On analyse le caractère reçu
case 'p': // Si on reçoit le caractère
'P' on exécute la fonction Prendre
Prendre ();
break;
case 'l':
Lacher (); // Si on reçoit le caractère 'l'
on exécute la fonction Lâcher
break;
case 'm':
Monter (); // Si on reçoit le caractère 'm' on
exécute la fonction Monter
break;
case 'd':
Descendre (); // Si on reçoit le caractère 'd' on
exécute la fonction Descendre
break;
default:
Serial.println("Cette
commande n'est pas valide!"); //
Si on reçoit autre chose, alors on affiche un message d'erreur.
} // Fin du 'switch'
} // Fin du 'if serial'
} // Fin de 'loop'
Conclusion :
Voici donc une structure de programme qui est très simple à adapter en
fonction de son utilisation, qui permet de commander notre système à partir
d’un PC et que l'on peut facilement faire évoluer.
Aucun commentaire:
Enregistrer un commentaire