Arduino > Exemple d'un potentiomètre et de la communication ASCII

1.  Description

L'Arduino effecture une lecture de la broche analogique 0 et envoie la valeur sous forme de message ASCII.

2.  Code Arduino

/*
Description
=============
L'Arduino effectue a chaque 20 ms une lecture
de la broche analogique 0 et
envoie la valeur sous forme de message ASCII.

Le message ASCII est compose des elements suivants:
* en-tete (A0) suivi d'un espace
* la valeur
* indicateur de fin de ligne


Circuit
=============
Broche analogique 0: potentiometre.




Thomas Ouellet Frederics, 4 novembre 2012
*/

unsigned long previousMillis;
unsigned long interval = 20;



void setup() {



        // Demarrer la communication serie a  57600 baud.
        Serial.begin(57600);

}

void loop() {

        // Verfier si au moins 20 millisecondes se sont ecoulees
        // depuis le dernier envoi.
        if ( millis() - previousMillis >= 20 ) {
                previousMillis = millis();

                // Lire la valeur du potentiometre.
                int valeur = analogRead(0);

                // Envoyer la valeur du potentiometre.
                Serial.print("A0 "); // en-tete (A0) suivi d'un espace
                Serial.print(valeur); // la valeur
                Serial.println(); // indicateur de fin de ligne

                /* //Le bloc precedent peut aussi etre ecrit ainsi:
                Serial.print("A0 "); // en-tete (A0) suivi d'un espace
                Serial.println(valeur); // la valeur suivi de l'indicateur de fin de ligne
                */

        }
}

3.  Recevoir les messages dans le «Serial Monitor»

4.  Recevoir les messages dans Max

<pre><code>
----------begin_max5_patcher----------
1678.3oc6Z0saaaCE95jmBBeia.xHD+QRT6p00ALTfNrK5kqEExRzNrUlzkR
JKoE8co2skcwdI7K1NjxxVtwVwN0IcFnv.9GJJxy46722gxe7zSFLxbkrb.5
GQ+A5jS93ombheH2.mr32mLXZ5UYEok9oMHyLcpTWM37lqUIupxO9KRQYWjN
+e0RjTilJKKSmHQ+V5U31oN1NYjapA3fEiLKsJ6BkdxarxrpFgHQfCh4rD94
HNifEBNMN9bDUDB2EhB2K50KtaUteiMid6ODtbOL5Jc5To+JO0pRKZuhtdpR
WHq7ZAY0fl5p1QC5rHkpO3WDBEG3F8Smdp6sy+JQomYzWJsUJKpPVhzloirv
m.f0hcO8kO64O+9CYAw3fj.gfbmPF8XAx9Uqodl7V.VgprRhdxGJPSbS3Ljr
xOEo9Ry0toarkuuVBiAXqZ7XqDQXHYILqZzSJkE.9gHAvfmsDtKTZYloV62X
58zFv3Q33n.FIboMfw1rMfkbrXDdg79GRGywwgzfHv8LNBGvXAzyQjvf97NY
+uKhdg5eKjgRPAC1txSIdMNTzn8hvDdBjOqQ6Ihsn8j8T6oaT6IaQ6WLbyLq
tdlrQTGL.856Avnk+IHy2BWFaMSKud5HSQOnC..ggrXJc8r8wrdybcXhZ9lh
NpJSZe3RLNlBu9hT5Plk9vEwdhKrCBtnboKOfPS2Ty6.DQWOiab+E8hOHPDa
OgnQo5ICNe0mGT7psB3NhUBFNILfGj.Ig5OLK5fjDhtugY2a7omZWyrxoJfT
PpcRsaNnbfX.PX0cuRzvRoSoFhxmeSkzBpjm1vLisBUN+FqRhl+Yjo9RKvaK
s1MsooVKTM.idkFV9bY8Up4+8T+7f0HcTgigWJ5RUkzsCOYTZc9YtcMyn0xq
TFs6V+o7JKhfRypTW52R2uyjn2Wq7LUzyuIyU1QYcRSs6Z1pTP7JQYoVXoQO
0lWqzlMyfIZepRSBEXJgKb4bnbvyfGx4dZj9jNh3s3kbzP8920dtgfwrViF5
BEG1.piM1Lo2bUBVbkybVhxA6z7afuXky+qZ3yYo1kNJG.BiBJNhEwbU9Rhw
g.XGBDjXQA8wWjxNB4KNzEGAPMDXI8AdYWXTk9Nf5FhsebJITJVjDEIXtDXB
bbBiEAo+Ygz9xoQRNVnU5Ql9nH.IucNPgN.fP742ibzEH8QrjHNhHVtMeqeo
I8qukPzTHcq0reNOfORRBIl6nKPWF6cGcjPhNVh8HmgdVgB580hJgzaCmYAJ
ZKx0spBmG8FYzqEC9JM8LzKmeiiAFTiR5qF4mfrI640oPwSOtudzMT2qXH.S
PD9xjjPAN1YnUVKotrFpG5t6gPp.qYK4QY6isjywt1qhg9qRvg.yFVhijCEC
wFQ7XWWWawdxOJyktvVtHY5vzwiUYWzXL0lo9RWNKRYKwk7Tcoqz1Xod9+TA
7HFB8ueHJfQH9i7f2zLeBf2wwQwNx3r9JgQBNZx.6f5A6TVDRTHVrT+6KAr3
3uw9lvaTJJD54J.0vgc2Z9fxS7oac7JIzd6T6vjskdO5k8P2e168455GhhVB
QcHCBDx6Af3eS7j7cvduPmJyjIExcCD5TUl1+wD1qu.PYGvEnd2ajZnkLY2D
GaFFNbGtgy7OptpxnaEwKTMYYGzCFvhVdZg6LFP5oCLzOaJxau7HiMWZ+BP3
1nlEJGjK8qeT2J.aGKc5ZlovXaTh.Lim3JKb6uP5nBKCP5ZD2vgrLZRm01yt
M.GKDTVn6a7X.sDquxiRyd2DuZrUWbFtqvatTZWSA7xb6acWZ0DsALWEpr20
csaf10VBub19V2kXym3w4O59ZcdjEc6f5Nb1XG4Nazu6r8M1YqKYo9c1RN1c
1He2YayNa9aw27wW7eOv653FecOvRn20r1UcQgezpMF55oRoScsr1YN70lyE
p7botqwMWU5r2dnbyMNrqRCeGjlnGMoIZGjF2CB4QRbbm4zWM5LUkOy.tQKb
WhXXR6gewCvBhfvcDkhwzksZzN7pc9foRODZDEya6lTHfNKSRDgqoQqF9APi
79Cj6xoYO0ovvkBOKliSngQzj0zoUC+PoSzCrNIXqI7blHfbacpY3GBcZmBt
EOZA2zcITv8.6erjmjcPdb+8J53rem1bJPdo8eo.Pbv0fVDjsIhfCa+qcrb3
6zl2T5Kc1Lnxb4B4xqN.Mq21Tj0+b6.gP27Seo3AV4kp146IPLH0Brrp.JV0
1FhQWIhFbpae9zo+GU1cbYC
-----------end_max5_patcher-----------
</code></pre>

5.  Recevoir les messages dans Processing

import processing.serial.*;

// Lorsque vous demarrez ce code, tout les ports
// series sont affiche dans la fenaªtre de deboguage.
// Changer la chaine suivante pour qu'elle
// corresponde au nom de votre port serie.
String portName = "/dev/tty.usbmodemfd131";

// Declarer une instance de la classe Serial:
Serial serial;


int A0;

void setup() {
        size(256, 256);
        smooth();


        println(Serial.list()); // Affiche les noms des ports.

        // Creer une instance de la classe Serial avec
        // une vitesse de 57600 baud:
        serial = new Serial(this, portName, 57600);

        // Indiquer a  l'instance serial de lancer la fonction serialEvent
        // lorsque l'octet 10 est recu. L'octet 10 est envoye par
        // Serial.println() pour terminer le message:
        serial.bufferUntil(10);

        textAlign(LEFT,TOP);
}

// Definir une fonction pour recevoir les donnees du port serie:
void serialEvent(Serial p) {

        // Lire le message.
        String chaine = p.readString();

        // Separer les elements du message
        // selon les espaces:
        String[] elements = splitTokens(chaine);

        // S'assurer qu'il y a bien deux mots
        // dans le message et ensuite attribuer
        // la valeur a  la bonne variable selon
        // l'identifiant:
        if ( elements.length == 2 ) {
                if ( elements[0].equals("A0") ) {
                        A0 = int(elements[1]);
                }

        }

}

void draw() {
        background(0);
        text("A0: "+ A0, 20, 10);
        rect(0,30,A0/1024.*width,20);

}

6.  Envoyer plusieurs données

L'extrait de code embarqué suivant envoie la valeur de trois entrées analogiques sur des lignes différents:

Serial.print("A0 "); // en-tete (A0) suivi d'un espace
Serial.print(analogRead(0)); // la valeur
Serial.println(); // indicateur de fin de ligne

Serial.print("A1 "); // en-tete (A1) suivi d'un espace
Serial.print(analogRead(1)); // la valeur
Serial.println(); // indicateur de fin de ligne

Serial.print("A2 "); // en-tete (A2) suivi d'un espace
Serial.print(analogRead(2)); // la valeur
Serial.println(); // indicateur de fin de ligne