A la ferme du code heureux, des codes, des programmes, broutent en champ libre.
Comment communiquer avec l'Arduino
Voici un petit programme pour communiquer trois valeurs distinctes entre 0-255 à une carte Arduino à partir de Processing.

Ce protocol a été crée pour piloter trois moteurs, avec des valeurs différentes pour la vitesse de chaque moteur via les ports PWM. Il utilise le protocole standard JPM (Jean-Pierre Mandon), c’est-à-dire la lettre en majuscules « A », « B », ou « C », suivi par trois chiffres pour la valeur (ex : 063), terminé par le signe point-virgule « ; ». Par exemple, « A132; » allumerait le moteur numéro 1 avec une vitesse de 132 ; alors que « C007; » allumerait le moteur numéro 3 avec une vitesse de 7.

Voici la liste des commandes :

A###; affecter la valeur ### au moteur numéro 1
B###; affecter la valeur ### au moteur numéro 2
C###; affecter la valeur ### au moteur numéro 3
M connaître les valeurs actuelles des trois moteurs
S allumer le mode silencieux (pas de retour d’informations)
P allumer le mode parler (retour d’information lors de chaque attribution)

Ci-dessous le code Arduino pour recevoir des instructions de Processing (ou autre) avec le protocole JPM.


// la liste qui contiendra nos valeurs
unsigned char characters[5];
int character_index = 0;

// les trois vitesses stockées dans notre programme
int vitesses[3] = {0,0,0};

// si on ne veut pas de retour d'Arduino lors de chaque transaction
boolean silence = true;

// démarrer la communication série
void serialSetup() {
Serial.begin(9600);
Serial.print("Hellon send 'P' to turn on verbose moden send 'S' to turn on silent moden send 'M' to return the current list of valuesn");
}

// vérifier l'etat de la port série
void serialLoop() {
// si un caractère veut rentrer
while(Serial.available()) serialMoteur();
}

// traiter les informations rentrantes
void serialMoteur() {

// aller chercher le caractère actuel
unsigned char c = Serial.read();

// retour d'informations moteurs 1, 2, 3
if ('M' == c) {
Serial.print("nmoteur#1=");
Serial.print(vitesses[0]);
Serial.print("nmoteur#2=");
Serial.print(vitesses[1]);
Serial.print("nmoteur#3=");
Serial.print(vitesses[2]);
return;
}

// mode silencieux activé
if ('S' == c) {
silence = true;
return;
}

// mode silencieux désactivé (parler)
if ('P' == c) {
silence = false;
return;
}

// si le charactère ;
if (';' == c) {
// et on est à la position 4
if (4 == character_index) {
success();
return;
} // erreur
else {
erreur(-1);
return;
}
}

// si le charactère A, B, ou C
if ('A' == c || 'B' == c || 'C' == c) {
// si on n'est pas à la position 0
if (character_index != 0) {
erreur(-2);
return;
} // on est à la position 0, c'est bon, on retient
else {
characters[0] = c - 65;
character_index++;
return;
}
}

// si liste trop grand
if (character_index > 4) {
erreur(-3);
return;
}

// si un nombre
if (c < 48 || c > 57) {
erreur(-4);
return;
}

// si on est ici, c'est qu'on est bon, remplissez la liste
characters[character_index] = c - 48; // utiliser la valeur numérique et non pas ASCII
character_index++; // avancer au prochain dans la liste

}

// remettre la liste à zéro
void reset() {
character_index = 0;
}

// problème dans la transmission
void erreur(int code) {
Serial.print("nerror: ");
Serial.print(code, DEC);
reset();
}

// succès! stocker la valeur dans le bon moteur
void success() {

// récupérer l'index du moteur à définir
int quel_moteur = characters[0];

// récupérer les valeurs (0 - 999)
int centaines = characters[1] * 100;
int dixaines = characters[2] * 10;
int unites = characters[3];

// stocker la valeur
vitesses[quel_moteur] = centaines + dixaines + unites;

// retour d'informations, si on est en mode "parler"
if (!silence) {
Serial.print("nmoteur=");
Serial.print(quel_moteur, DEC);
Serial.print(", valeur=");
Serial.print(vitesses[quel_moteur], DEC);
}

// remettre la liste de caractères à zéro
reset();
}


Ici le code de test en Processing pour envoyer des instructions a l'Arduino


import processing.serial.*;

Serial port;

void setup() {

String[] ports = Serial.list();
println(ports);
port = new Serial(this, ports[4], 9600);

}

void draw() {

}

void keyPressed() {

int r = (int)random(255);
String message;

switch(key) {
case 'a' :
message = "A" + nf(r,3) + ";";
port.write(message);
return;
case 'b' :
message = "B" + nf(r,3) + ";";
port.write(message);
return;
case 'c' :
message = "C" + nf(r,3) + ";";
port.write(message);
return;
}

port.write(keyCode);
}

void serialEvent(Serial p) {
print((char)port.read());
}