Filaire

De Wiki L.A.B
Aller à : navigation, rechercher
Matériel
  • 1 Arduino UNO
Principe

Le langage Arduino, issu de C/C++, intègre une API très facile à prendre en main pour la communication série. Elle contient les fonctions suivantes :

  • begin(): Fixe le débit en bits par secondes pour la transmission.
  • end(): désactive la communication série
  • available(): donne le nombre de bytes (caractères) disponible pour la lecture sur le port série.
  • read(): Lit le premier octet disponible sur le port série
  • flush(): Attend que toutes les données sortantes soient complètement envoyées
  • print(): Affiche les données sur le port série
  • println(): Affiche les données sur le port série, suivi d'un retour charriot (ASCII 13, or '\r') et d'une nouvelle ligne (ASCII 10, or '\n')
  • write(): écris les données sur le port série

Une description complète de ces fonctions n'est pas à l'ordre du jour d'autant que la documentation officielle est très bien faite.

Le but de ce chapitre est de vous familiariser avec l'échange via série à l'aide de deux exemple.

  1. Le premier cas montre comment communiquer entre un arduino et un langage type Python. Nous pourrons tout aussi bien ouvrir un terminal série pour écrire dedans ;-)
  2. Le second cas présente comment contrôler une arduino de manière plus précise à l'aide d'une grammaire maison :) Ca va faire hurler les théoriciens du langage de l'IUT
Programme

Nous allons commencer par faire un petit programme echo de base

/* une variable pour stocker l'information en provenance du port serie */
byte byteRead;

void setup() {                
  Serial.begin(9600);
}

void loop() {
   /*  On teste si de l'information est disponible */
  if (Serial.available()) {
    /* On lit l'octet disponible en premier */
    byteRead = Serial.read();
    /* On affiche sur le terminal en retour le caractère saisi */
    Serial.write(byteRead);
  }
}

On va apporter une petite modification en remplaçant Serial.write(byteRead) par Serial.println(byteRead) Désormais ce n'est plus un vrai écho dans le terminal. Le résultat affiché est désormais le code ASCII Ce table de conversion est bien utile pour comprendre les correspondances : http://www.ascii.cl/

/* une variable pour stocker l'information en provenance du port serie */
byte byteRead;

void setup() {                
  Serial.begin(9600);
}

void loop() {
   /*  On teste si de l'information est disponible */
  if (Serial.available()) {
    /* On lit l'octet disponible en premier */
    byteRead = Serial.read();
    /* On affiche sur le terminal en retour le caractère saisi */
    Serial.println(byteRead);
  }
}

Plus compliqué++ : ce programme ,très poli, vous donne le bonjour et vous invite à lui donner un chiffre. Il fera clignoter d'autant plus la mini led intégré à l'arduino sur le pin 13.

#define LED_PIN 13

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
    Serial.println("Bonjour Sebastien, je suis Sarah le gluon de la LED13. Combien de fois dois je tilter ?");
    while(Serial.available()) {
         int chiffre = Serial.read() -'0';
        clignote(chiffre);
    }
    delay(1000);
}

void clignote(int chiffre)
{
  for (int i = 0; i < chiffre; i++)
  {
    digitalWrite(LED_PIN, HIGH);
    delay(1000);
    digitalWrite(LED_PIN, LOW);
    delay(1000);
  }
}

Passons au montage final désormais : envoyer une séquence dans le terminal pour modifier les couleurs d'une LED RGB

Montage

Nous reprenons un montage bien connu  :

Montage serie rgb.jpg

Montage LED RGB

int ledR = 6; // broche de la LED Rouge
int ledG = 5; // broche de la LED Verte
int ledB = 3; // broche de la LED Bleue

// valeur de l'intensite calcule à partir des infos reçues du port serie
unsigned int ledCurrent = 0;

// Octet courant lu
byte byteRead;

int i = 0; // variable de la boucle for

void setup() // setup est déroulé une seule fois après la remise à zéro
{
  pinMode(ledR, OUTPUT); // la broche led (3) est initialisée en sortie
  pinMode(ledG, OUTPUT); // la broche led (5) est initialisée en sortie
  pinMode(ledB, OUTPUT); // la broche led (6) est initialisée en sortie

  // ouverture du port serie
  Serial.begin(9600);
}

void loop() // loop est déroulé indéfiniment
{
  if (Serial.available())
  {
    byteRead = Serial.read();

    if (byteRead == 'R') {
      ledCurrent = ledR;
    } else if (byteRead == 'G') {
      ledCurrent = ledG;
    } else if (byteRead == 'B') {
      ledCurrent = ledB;
    }
    else if (byteRead == 'A')
    {
      digitalWrite (ledR,LOW);
      digitalWrite (ledG,LOW);
      digitalWrite (ledB,LOW);
      for (i = 0; i <= 255; i++) // i varie de 1 à 255
      {
        analogWrite(ledR, i); // génère une impulsion sur la broche de largeur i => la luminosité R augmente
        analogWrite(ledG, i); // génère une impulsion sur la broche de largeur i => la luminosité G augmente
        analogWrite(ledB, i); // génère une impulsion sur la broche de largeur i => la luminosité B augmente
        delay(20); // pause de 20 ms entre chaque pas
      }
    }
    allumer(ledCurrent);
  }
}

// Prend en parametre la LED à allumer
void allumer(int led)
{
  for (i = 0; i <= 255; i++) // i varie de 1 à 255
  {
    analogWrite(led, i); // génère une impulsion sur la broche de largeur i => la luminosité R augmente
    delay(20); // pause de 20 ms entre chaque pas
  }
  digitalWrite (led, LOW);
}
}