Communication filaire : Différence entre versions

De Wiki L.A.B
Aller à : navigation, rechercher
 
Ligne 14 : Ligne 14 :
 
* print(): Affiche les données sur le port série
 
* 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')
 
* 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
+
* write(): écrit 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.
+
# 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 ;-)
+
# 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
+
  
 +
Le but de cet atelier est de vous familiariser avec l'échange via une liaison série à l'aide de deux exemples.
 +
# Le premier cas montre comment communiquer entre un arduino et un langage type Python. Nous pourrons tout aussi bien ouvrir un terminal série.
 +
# Le second cas présente comment contrôler une arduino de manière plus précise à l'aide d'une grammaire maison.
 
===== Programme =====
 
===== Programme =====
  
Nous allons commencer par faire un petit programme echo de base
+
Nous allons commencer par faire un petit programme echo
  
 
<syntaxhighlight lang="cpp" enclose="div">
 
<syntaxhighlight lang="cpp" enclose="div">
Ligne 45 : Ligne 42 :
 
</syntaxhighlight>
 
</syntaxhighlight>
  
On va apporter une petite modification en remplaçant     Serial.write(byteRead) par Serial.println(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
 
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/
+
La table de conversion est bien utile pour comprendre les correspondances : http://www.ascii.cl/
  
 
<syntaxhighlight lang="cpp" enclose="div">
 
<syntaxhighlight lang="cpp" enclose="div">
Ligne 68 : Ligne 65 :
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Plus compliqué++ : ce programme ,très poli, vous donne le bonjour et vous invite à lui donner un chiffre.
+
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.
+
Il fera clignoter d'autant plus la mini led intégrée à l'arduino sur le pin 13.
  
 
<syntaxhighlight lang="cpp" enclose="div">
 
<syntaxhighlight lang="cpp" enclose="div">
Ligne 102 : Ligne 99 :
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Passons au montage final désormais : envoyer une séquence dans le terminal pour modifier les couleurs d'une LED RGB
+
Passons au montage final : envoyer une séquence dans le terminal pour modifier les couleurs d'une LED RGB
  
 
===== Montage =====
 
===== Montage =====
Ligne 117 : Ligne 114 :
 
int ledB = 3; // broche de la LED Bleue
 
int ledB = 3; // broche de la LED Bleue
  
// valeur de l'intensite calcule à partir des infos reçues du port serie
+
// valeur de l'intensite calculee à partir des infos reçues du port serie
 
unsigned int ledCurrent = 0;
 
unsigned int ledCurrent = 0;
  
Ligne 127 : Ligne 124 :
 
void setup() // setup est déroulé une seule fois après la remise à zéro
 
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(ledR, OUTPUT); // la broche led (3) est initialisee en sortie
   pinMode(ledG, OUTPUT); // la broche led (5) est initialisée en sortie
+
   pinMode(ledG, OUTPUT); // la broche led (5) est initialisee en sortie
   pinMode(ledB, OUTPUT); // la broche led (6) est initialisée en sortie
+
   pinMode(ledB, OUTPUT); // la broche led (6) est initialisee en sortie
  
 
   // ouverture du port serie
 
   // ouverture du port serie
Ligne 135 : Ligne 132 :
 
}
 
}
  
void loop() // loop est déroulé indéfiniment
+
void loop() // loop est déroulee indefiniment
 
{
 
{
 
   if (Serial.available())
 
   if (Serial.available())

Version actuelle en date du 4 janvier 2016 à 16:55

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);
}
}