Communication filaire : Différence entre versions
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(): | + | * 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. | ||
+ | # 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 | + | 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 | + | 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 | ||
− | + | 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é | + | 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 | + | 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 | + | 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 | + | // 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 | + | pinMode(ledR, OUTPUT); // la broche led (3) est initialisee en sortie |
− | pinMode(ledG, OUTPUT); // la broche led (5) est | + | pinMode(ledG, OUTPUT); // la broche led (5) est initialisee en sortie |
− | pinMode(ledB, OUTPUT); // la broche led (6) est | + | 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 | + | void loop() // loop est déroulee indefiniment |
{ | { | ||
if (Serial.available()) | if (Serial.available()) |
Version actuelle en date du 4 janvier 2016 à 15:55
Sommaire
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.
- 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
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 :
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);
}
}