lundi 25 juin 2012

Arduino SwitchCase



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.
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.
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.
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