Envoi d'information depuis Processing

Bonjour,

J'ai fait un petit sketchup qui permet de recevoir trois valeurs d'angle afin de controler 3servo-moteurs.
La syntaxe de la trame est la suivante: 8090180153
Où 8 est le début de la trame, 090 l'angle du Pan, 180 l'angle du Tilt et 153 l'angle d'un autre servo-moteur.

Je voudrais faire une interface Processing pour controler les trois servos, histoire d'avoir un truc à peu près potable.

C'est là que ça coince: Lors de l'envoi des informations, rien ne se passe.

Voici les portions de code:

Arduino:

void loop()
{
if(Serial.read() == 56)
{
for(int i = 0; i <= 9; i++)
{
recep*= char(Serial.read());*
_ Serial.println(recep*);_
_
}*_

* for(int i = 1; i <= 9; i++)*
* {*
* if(i == 1)*
* {*
posPan = ((recep_-'0')100);
}
else if(i == 2)
{
posPan += ((recep-'0')10);
}

* else if(i == 3)
{
posPan += ((recep-'0'));
}
else if(i == 4)
{
posTilt = ((recep-'0')100);
}

* else if(i == 5)
{
posTilt += ((recep-'0')10);
}

* else if(i == 6)
{
posTilt += ((recep-'0'));
}
else if(i == 7)
{
posUtil = ((recep-'0')100);
}

* else if(i == 8)
{
posUtil += ((recep-'0')10);
}

* else if(i == 9)
{
posUtil += ((recep-'0'));
}
}
pan.write(posPan);
tilt.write(posTilt);
util.write(posUtil-3);
Serial.print("Pan: ");
Serial.println(posPan);
Serial.print("Tilt: ");
Serial.println(posTilt);
Serial.print("Util: ");
Serial.println(posUtil);
}
}
[/quote]
Processing:
> int sendTrame(int posX, int posY, int posU)
> {
> data[0] = 8;
> data[1] = ( posX / 100 );
> data[2] = ( ( posX - ( data[1] * 100 ) ) / 10 );
> data[3] = ( posX - ( data[1] * 100 ) - ( data[2] * 10 ) );
> data[4] = ( posY / 100 );
> data[5] = ( ( posY - ( data[4] * 100 ) ) / 10 );
> data[6] = ( posY - ( data[4] * 100 ) - ( data[5] * 10 ) );
> data[7] = ( posU / 100 );
> data[8] = ( ( posU - ( data[7] * 100 ) ) / 10 );
> data[9] = ( posU - ( data[7] * 100 ) - ( data[8] * 10 ) );
>
> for(int i = 0; i < 10; i++)
> {
> port.write(char(data)+'0');
> * }

> * println(data);
> * return 1;

> }
> [/quote]
> Comment faire pour que la trame envoyée par Processing soit reconnue par l'arduino?
> Merci d'avance, WillyKaze._

ça m'a l'air bien compliqué.

regarde cet article qui pourra t'inspirer : Interface en ligne de commande - PoBot

En fait pas du tout!
Le lien que tu m'as filé est justement ce que j'arrive déjà à faire, c à d communiquer avec l'Arduino via la ligne de commande.

Si j'envoie 8090180045, de la console, le 1er servo se met à 90°, le 2ème à 180° et le 3ème à 45°.

Jusqu'ici, tout va bien.
Sauf que quand j'envoie cette même trame depuis Processing, le logiciel m'affiche toutes les étapes (j'ai donc bien 8090180045 d'envoyé) mais le retour de l'Arduino est complètement aléatoire (en général ça oscille entre -1, 255 et 104).

C'est donc le format dans lequel j'envoie la trame qui n'est pas bon...
D'où ma question: Comment transtyper ma trame de Processing pour qu'elle soit correctement analysée par l'Arduino?

Merci d'avance, Willy.

transtyper ? normalement si tu es bien à la même vitesse, avec 8 bits et 1 bit de stop, Processing utilise la liaison série comme n'importe quelle ligne de commande. Je n'ai pas eu ce problème.

Je ne connais pas processing mais j'ai l'impression que tu as un problème de type dans tes données.

Ton code dans l'arduino attend des valeurs numériques codées en ASCII
Ton code en Processing semble envoyer des entiers
Donc quand tu veux envoyer 90 par exemple:
ton code en processing envoie 9 et 0
alors que ton code dans l'arduino attend 57 et 48 (les codes ASCII des caractères 9 et 0)

Pour faire ce genre de conversion, il peut être intéressant de passer par un sprintf qui permet de construire une chaine de caractères avec des valeurs numériques

Ton problème est peut être lié au délai de transmission. Tu envois une trame tout les combien de temps? car il faut savoir, que lorsque tu fais pan.write(posPan); la rotation se fait en asynchrone. Ainsi, si une autre trame est reçu avant la fin du mouvement, le servo peut dans certain cas commencer à disjoncter.

D'autre part je te conseille une détection de trame plus abouti qu'un simple 8 qui pourrait être malencontreusement détecter dans le reste de la trame, choisit quelque chose comme un caractère ASCII proche des 250).

Si avec tout ça tu craques, upload firmata sur l'Arduino (disponible d'origine dans l'IDE)