Pages: [1]   Go Down
Author Topic: Envoi d'information depuis Processing  (Read 703 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Quote
void loop()
{
      if(Serial.read() == 56)
      {
            for(int i = 0; i <= 9; i++)
            {
                  recepchar(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 == smiley-cool
                  {
                        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);
      }
}

Processing:
Quote
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;
}


Comment faire pour que la trame envoyée par Processing soit reconnue par l'arduino?

Merci d'avance, WillyKaze.
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

regarde cet article qui pourra t'inspirer : http://www.pobot.org/Interface-ligne-de-commande-pour.html
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 10
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

France
Online Online
Faraday Member
**
Karma: 23
Posts: 3031
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: November 05, 2009, 06:59:55 am by fdufnews » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Pages: [1]   Go Up
Jump to: