Arduino > Communication série en ASCII

1.  Code Arduino/Wiring

Pour envoyer un message ASCII d'une carte Arduino, il faut d'abord initialiser une communication série à une vitesse(baud) que nous déterminons avec la commande Serial.begin(). Il faut ensuite utiliser les diverses formes des commandes Serial.print()  et Serial.println() .

1.1  Déboguer

Pour déboguer la communication série, on peut ouvrir le «serial monitor» du logiciel Arduino:

1.2  Envoyer une entrée numérique

Pour envoyer la valeur mesurée à l'entrée numérique 2 nous utilisons le code suivant:

Afficher/cacher le code

/*
Exemple de base de communication ASCII.
Version numérique.
Réalisé par Thomas O Fredericks.
*/

int interval = 20; // Intervalle de temps entre deux envois de message.

int val;

void setup()
{
        // Initialiser la communication série à 57600 baud.
        Serial.begin(57600);
}

void loop()
{
        // Exécuter le code suivant seulement si l'intervalle de temps
        // s'est écoulé:
        delay(interval);

        int newval = digitalRead(2); // Lecture de la broche numérique 2.
        // Envoyer la valeur seulement si elle est différente:
        if ( newval != val ) {
                val = newval;
                // Construction du message:
                Serial.print("d2"); // Envoi de la chaîne de caractères "d2" pour identifier la valeur.
                Serial.print(' '); // Envoi du caractère «espace» pour séparer l'indentifiant de la valeur.
                Serial.print(val, DEC); // Envoi de la valeur.
                Serial.println(); // Envoi de l'indicateur de terminaison du message (retour à la ligne et retour de chariot)
        }
}

1.3  Envoyer une entrée analogique

Pour envoyer la valeur mesurée à l'entrée analogique 0 nous utilisons le code suivant:

Afficher/cacher le code

/*
Exemple de base de communication ASCII.
Version analogique.
Réalisé par Thomas O Fredericks.
*/

int interval = 20; // Intervalle de temps entre deux envois de message.


int val;

void setup()
{
        // Initialiser la communication série à 57600 baud.
        Serial.begin(57600);
}

void loop()
{
        // Exécuter le code suivant seulement si l'intervalle de temps
        // s'est écoulé.
        delay(interval);

        int newval = analogRead(0); // Lecture de la broche analogique 0.
        // Envoyer la valeur seulement si elle est différente:
        if ( newval != val ) {
                val = newval;
                // Construction du message:
                Serial.print("a0"); // Envoi de la chaîne de caractères "a0" pour identifier la valeur.
                Serial.print(' '); // Envoi du caractère «espace» pour séparer l'indentifiant de la valeur.
                Serial.print(val, DEC); // Envoi de la valeur.
                Serial.println(); // Envoi de l'indicateur de terminaison du message (retour à la ligne et retour de chariot)
        }
}

1.4  Envoyer une entrée numérique et une entrée analogique sans delay()

Pour envoyer la valeur mesurée à l'entrée analogique 0 et à l'entrée numérique 2 nous utilisons le code suivant:

Afficher/cacher le code

/*
Exemple de base de communication ASCII.
Version analogique et numérique.
Réalisé par Thomas O Fredericks.
*/

int interval = 25; // Intervalle de temps entre deux envois de message.
unsigned long timeStamp;

int a0;
int d2;

void setup()
{
        // Initialiser la communication série à 57600 baud.
        Serial.begin(57600);
}

void loop()
{
        // Exécuter le code suivant seulement si l'intervalle de temps
        // s'est écoulé:
        if ( millis() - timeStamp >= interval ) {
                // Mettre en mémoire le temps présent pour calculer le
                // prochain intervalle:
                timeStamp = millis();
                int newval = analogRead(0); // Lecture de la broche analogique 0.
                // Envoyer la valeur seulement si elle est différente:
                if ( newval != a0 ) {
                        a0 = newval;
                        // Construction du message:
                        // Envoi de la chaîne de caractères "a0" pour identifier la valeur:
                        Serial.print("a0");
                        // Envoi du caractère «espace» pour séparer l'indentifiant de la valeur:
                        Serial.print(' ');
                        // Envoi de la valeur:
                        Serial.print(a0, DEC);
                        // Envoi de l'indicateur de terminaison du message
                        // (retour à la ligne et retour de chariot):
                        Serial.println();
                }

                newval = digitalRead(2); // Lecture de la broche numérique 2.
                // Envoyer la valeur seulement si elle est différente:
                if ( newval != d2 ) {
                        d2 = newval;
                        // Construction du message:
                        // Envoi de la chaîne de caractères "d2" pour identifier la valeur:
                        Serial.print("d2");
                        // Envoi du caractère «espace» pour séparer l'indentifiant de la valeur:
                        Serial.print(' ');
                        // Envoi de la valeur:
                        Serial.print(d2, DEC);
                        // Envoi de l'indicateur de terminaison du message
                        // (retour à la ligne et retour de chariot):
                        Serial.println();
                }
        }
}

2.  Processing

Pour recevoir les messages dans Processing, on utilise la logithèque Serial.

Afficher/cacher le code

import processing.serial.*;

// Lorsque vous démarrez ce code, tout les ports
// séries sont affiché dans la fenêtre de déboguage.
// Changer la chaîne suivante pour qu'elle
// corresponde au nom de votre port série.
String portName = "/dev/tty.usbmodemfd131";

// Déclarer une instance de la classe Serial:
Serial serial;


int a0;
int d2;

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


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

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

        // Indiquer à l'instance serial de lancer la fonction serialEvent
        // lorsque l'octet 10 est reçu. L'octet 10 est envoyé par
        // Serial.println() pour terminer le message:
        serial.bufferUntil(10);

        textAlign(LEFT,TOP);
}

// Définir une fonction pour recevoir les données du port série:
void serialEvent(Serial p) {

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

        // Séparer les éléments 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 à la bonne variable selon
        // l'identifiant:
        if ( elements.length == 2 ) {
                if ( elements[0].equals("a0") ) {
                        a0 = int(elements[1]);
                }
                else if ( elements[0].equals("d2") ) {
                        d2= int(elements[1]);
                }
        }

}

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

        text("d2: "+ d2, 20, 50);
        if ( d2 > 0 ) rect(0,70,width,20);
}

3.  Max/MSP

Pour recevoir un message ASCII par communication série dans Max/MSP, on utilise la classe serial:

<pre><code>
----------begin_max5_patcher----------
1681.3oc6Z0saaaCE95jmBBeia.xDD+QRT6pk0ALTfNrK5kqEExRzNrUhzkR
JKoE8cY2skcwdI7K1NjxxVNwVwNSocFnH.9GZJxy4imy246HkOc5IilnuVTN
B88neCcxIe5zSNwMjcfSV98SFUjbcZdRoaZiR0EEBU0nya9sJw0UtweYBJ8x
jE+iRfDJTgnrLYl.8KIW60N0olYSrS02ye4HySpRuTpl8ViHspwHh4d9QLZL
6bDih83bFIJ5bDgG.WEh.WK5MKuZYlai0Sd22ErZOzpJURgv8KWXjI4s+hpt
PpxEUNu.udPccU6n9cVjR4GcKBl34aG8ymdp8ky+OhROWqtRXpjFTtnDozES
Lv6.f0hcW7pm+hW73gL+HO+XeNG+fPF4XAx9Yitdt3d.VtrrRfd1GyQyrS3L
jnxMEg5J8M1oqMkenV.iAXqb5Ti.goHQILqZzyJE4.9gv9vfmsBtykJQptV4
1Xxi7LfxB8hB8o3fUmAT51OCnwGKGBuT73SoiXdQAD+PH7LJzymR8ImivA98
EcR+eWF8R2+dHCAi7Gsammfcdb.uw64AwrXfOqw6w7c383Cz6Ia06w6v6WNb
yLqtYtnwTGMB8lGAvnD+NXy2CWlZzEk2TLQm2C5..PP.MhP1jsOh1Ky0vj07
UEcjU5j9vkHuHB72cnzAlk9vE9AhKzAAWjV5xADZ5RMuGPDYSF2n9K5EMHPD
8.gnIIpYiNe86CJd0VAbOwJN0KNvm4GCjP8mlENHjPjCMM6QiO8T6ZtQTHAQ
AIlY014fx.gAffU60JPiKEVmZLJawsUBC3RNYCy0lJT4haMRAZwefz0WY.ca
I01oUjXLP0.OzqUvxmIpuVt3uJbyCVijI4VEdInqjUB6N7rII0YmY20TsRIt
VpU1K8GxpLHLJIsRdkaKseOUf9PszoTQs31TaYGowZM01eyTk.lWIJMw.KM5
BSVsTo2tBlvCoJMNf6QvLtkygvfHCV.i4jQ5Hc3Q6HJ4nQ58upbZCgCyZEZr
MUbbCnNUaREtiqR3DWZONKQYv4zhagOXDK9yZ384IlUAJCffQNwKjFRsU9hi
7B.vN.DHQC86SuHgdDpWbrMOBfZHwR3R7RuTKKcc.0ME6vzThIDOdbXHmZIv
3dQwTZHP+SCH8wogiOVjU5Pl9jH.j21.n.K.fwN98PqbAbeBKw7iHgk6J15m
ZnecsDhJ.5Vi9vBdfXj3XbDyJWfrJ26A5HAGdrj6gOC87bIz6qAUBzaima.I
ZK45VWgygdSzpMxAeshbF5UKt0p.CpQIbUibSPzvddSBT7zg6alcC08xGCvD
jguhjDJvQOCs9zRnJqg5g1qdLPEXz6fGkdHmkLlms8pHn+pXu.PYCM1Jxg3A
4FgrHaWW637jcTxkt7rbIY53joSkoW1bXpzEtRW1SjxVgKYIpRaosoB0h+tB
zQLF5eeHJfgwta4AqoY9X.uihBirhwo8UBC6ezv.ag5Q6EKBNLviux+6i.le
72XeS5MJAE.8b4iZzvteMePXwN5VqtRLo2N0FF1VxinW1gt+rO3355GhBWAQ
cDCBBx6AfXeUhjbcv9nPmJ8rY4h8CD5TUlz+sIr2XAPxNfKP8t2JTPKYhtDG
aGFFtatg83eRcUkV0ZhWJaXYG0CFPCWc2B2aL.2SGXneTmm09ySzlLg4Nfv8
QMCTNHS3V+vtU.1MVZ80Tct1z3D9dTVrsrv8+.tiKrJAo6g3VtIKSl0Yscpa
88h3bBMv9IVDfV7MW4IIouelyM1YHN0qqwquRX1vAb1b6KcWZ4LkFNtxkouu
6Z2.sarDN6r8ktKw1uiGm+EOVqyirnaGTOPvF8HOXi7sfsuxAacEK0evV7wd
vF9aAaaOXycItlOty+6AtPG63aFAVB8tl1tpK0QiVuwPWOURUhsk0NyIbi4b
oLKSn5d3VHylqASaoIDR7Xs544bPaebL2xGF4QVJKY8vq2YYoMlwcbr8lO1W
OJbO7H6iunWWZ3LG1..vCm0P2Cqg8EyZrO.xGzbrOCWDd+C+H.CY6iBEXmrp
.CAsegXuf1me7pgeBB+H6SF0cb7mTLNZC3aG1yAlhGDrJWlFw7hIAgj3MRwW
O7SAFa8Ix.6Sb5FFOix8w22mZF9ovm1KdK9Wr3F7SQkApGt8Vsy783XNlEtA
Dud3GDhaJ8kLeNTYtboY47FPl06ZJx5dtcfQnZ9pqT7Hi3JY67cBHFkX.UVU
fDqZSivnq4giN0tOe9z+EDCSbYC
-----------end_max5_patcher-----------
</code></pre>

4.  Pure Data

Pour recevoir un message ASCII par communication série dans Pure Data, on utilise plusieurs classes qui sont distribuées avec Pd-Extended:

5.  Isadora