Communication 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(): écrit les données sur le port série

Le but de cet atelier est de vous familiariser avec l'échange via une liaison série à l'aide de deux exemples.

  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.
  2. Le second cas présente comment contrôler une arduino de manière plus précise à l'aide d'une grammaire maison.
Programme

Nous allons commencer par faire un petit programme echo

/* 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 La 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ée à 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 : 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 calculee à 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 initialisee en sortie
  pinMode(ledG, OUTPUT); // la broche led (5) est initialisee en sortie
  pinMode(ledB, OUTPUT); // la broche led (6) est initialisee en sortie

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

void loop() // loop est déroulee indefiniment
{
  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);
}
}