Pages: [1] 2   Go Down
Author Topic: [RESOLU] récupérer plusieurs valeurs processing vers arduino : serial.read();  (Read 3960 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Après plusieurs heures de recherche et de tentative infructueuse je me permet de poster, pour solliciter votre aide.

Je suis entrain de tenter de gérer le RGB d'une led avec TouchOSC (pour l'iphone) + processing + arduino.

J'arrive à identifier sans soucis quel variateur de led j'active et sa valeur 1: rouge, 2:vert, 3:bleue puis la variation entre 0 et 255. La ou je bloque c'est que je tente de transferer, sans succès, la valeur de la led et la valeur qui est entre 0 et 255 de processing vert arduino. Apparament il n'est pas possible de passer de tableau

Code:
//--- code processing -----

      if(led[1] == 1){ //1 représente la rouge
           col[0] = led[1];
           col[1] = fade[1]; //valeur du fade
           arduinoPort.write(col);
    }

Mais bien évidemment je tombe sur une erreur... il n'est pas possible de faire passer de int au format tableau int[]. Donc 1ère question sous quel format puis-je faire passer plusieurs info ?
Et de l'autre coté même chose.

Code:
//--- code arduino -------
    
 if (Serial.available() > 0) { //  Check if there is a new message
    
   valeur = Serial.read();
}
j'ai fait plusieurs tentative en essayant de faire passer deux informations en une seul variable... mais sans succès, j'ai toujours des soucis pour splitter l'info à la reception sur arduino.

Donc voilà je ne sais pas si je suis bien clair... n'hésitez pas à me demander plus de précision. Je vous remercie grandement d'avance de votre aide.

« Last Edit: February 15, 2011, 11:12:16 am by chesnel » Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

tu as regardé ce post :

http://arduino.cc/forum/index.php/topic,51428.msg366940.html#new
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3567
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sur le askmanual il y a exactement ce que tu cherches (sauf pour la partie purement processing) : http://www.earthshineelectronics.com/files/ASKManualRev4.pdf
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OUi Jean-françois, j'étais tombé dessus mais je n'ai rien réussi à faire avec, peut-être parce que je suis débutant mais je n'arrive pas a voir comment tu arrives à faire passer dans un port.write();

Par contre j'ai vus qu'il était possible de passer dans le write(); ceci bytes[] alors j'ai essayer de mettre dans un tableau les données que je souhaite faire passer :

Code:
   values[0] = byte(upLED[1]);
   values[1] = byte(fade[1]);

   arduinoPort.write(values);

et coté arduino j'essaye de les récup de cette manière (surement  une mauvaise façon)

Quote
if (Serial.available() > 1) {
   
    for(int i=0;i<2;i++){
     infoLED = Serial.read();
   
    }
}

J'arrive à récuperer qu'elle led vois son fade changé mais pas la valeur fade. Est-ce une question de synchronisation, si-je puis dire ?
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu ne peux pas faire passer un tableau d'un coup, il faut faire port.write(tableau) et tu incrémentes i.

Coté Arduino c'est pareille, mais dans l'autre sens  smiley-lol
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'ai essayé sans succès :S Je me permet de mettre la totalité du code car je suis presque sur que ce n'est pas ma seul erreur :

Quote
//----------------------Arduino code-------------------------
String fadeLED = "";
char colorLED[] = "";
int upLED = 0;

void setup() { 
  Serial.begin(9600);
  pinMode(11,OUTPUT);  //led rouge
  pinMode(12,OUTPUT);  //led bleue
  pinMode(8,OUTPUT);  //led verte
}

void loop(){
 if (Serial.available() > 1) { //  Check if there is a new message
   
    for(int i=0;i<2;i++){
     colorLED = Serial.read();
    }

    if(colorLED[0] == 1){
      upLED = 11;
    }
   
    if(colorLED[0] == 2){
     upLED = 8;
    }
   
     analogWrite(upLED, colorLED[1]);
  }
}

//----------------------------end Arduino code--------------------------------


Code:
//-----------------Processing code-----------------


import oscP5.*;        //  charge la librairie OSC P5
import netP5.*;        //  charge la librairie P5
import processing.serial.*;    //  charge serial librairie

Serial arduinoPort;        //  Set arduinoPort as serial connection

OscP5 oscP5;            //  Set oscP5 as OSC connection

int redLED = 1000;  //  redLED lets us know if the LED is on or off
int greenLED = 2000;
int blueLED = 0;
int [] upLED = new int[3];
int [] led = new int [3];  //  Array allows us to add more toggle buttons in TouchOSC
int [] fade = new int[3];
byte [] values = new byte[3];
String addr = "";
//char end = "z";


void setup() {
  size(270,100);        // Processing screen size
  noStroke();            //  We don‚Äôt want an outline or Stroke on our graphics
  oscP5 = new OscP5(this,8000);  // Start oscP5, listening for incoming messages at port 8000
  arduinoPort = new Serial(this, Serial.list()[0], 9600);    // Set arduino to 9600 baud
}



void oscEvent(OscMessage theOscMessage) {   //  This runs whenever there is a new OSC message

    //led[1] =  int(theOscMessage.get(0).floatValue());



  String addr = theOscMessage.addrPattern();  //  Creates a string out of the OSC message
  if(addr.indexOf("/1/fader") !=-1) {   // Filters out any toggle buttons
    int i = int((addr.charAt(8) )) - 0x30;   // returns the ASCII number so convert into a real number by subtracting 0x30
    //print(i);
    fade[i]  = int(theOscMessage.get(0).floatValue());     //  Puts button value into led[i]
    // Button values can be read by using led[0], led[1], led[2], etc.
    //fade[1]  = int(theOscMessage.get(0).floatValue());     //  Puts button value into led[i]
    led[i] = i;
    upLED[1] = i;
   
    print(led[i]+ ": "+fade[i]+"\n");
  }




void draw() {
  background(50);        // Sets the background to a dark grey, can be 0-255
 
  values[0] = byte(upLED[1]);
   
  if(upLED[1] == 1){
    values[1] = byte(fade[1]);
  }
 
  if(upLED[1] == 2){
     values[2] = byte(fade[2]);
  }

  for(int i=0;i<2;i++){
    arduinoPort.write(values[i]);
  }
}

//----------------------------------end processing code------------------------------------


encore merci d'avance smiley
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

est ce que tu es sur que "0" est la bonne position de ton serial.list[] ?

Code:
arduinoPort = new Serial(this, Serial.list()[0], 9600);    // Set arduino to 9600 baud

Pour le savoir, tu fais ça :

Code:
// List all the available serial ports
println(Serial.list());

Ainsi tu peux voir sur quel port se trouve ton Arduino et tu remets la même position à la place de "0" (chez moi c'est "2").
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je suis certains pour pour la position du serial en vus que j'ai déjà réussir à établie un échange avec une seul valeur qui passais dans le   arduinoPort.write();
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if (Serial.available() > 0) { //  Check if there is a new message

Code:
for(int i=0;i<2;i++){
  colorLED[i] = Serial.read();
}
« Last Edit: February 14, 2011, 04:27:30 pm by Jean-François » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

toujours pas :S

J'essaye d'y aller étape par étape. Pour le moment j'ai réussi à vérifier que les informations sont bien envoyé depuis processing. Par contre je ne sait pas trop comment contrôler du coté de arduino ?

Code:
Serial.print(Serial.read());

Les valeurs ressorti sont vraiment pas ressemblante à ce que processing me sort... qqun sait comment je peux mieux contrôler les valeurs retourner sur arduino?
Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Qu'est ce que tu envoies et qu'est ce que tu t'attends à recevoir ?

Tu changes comment les valeurs de ces variables :

Code:
led[i] = i;
upLED[1] = i;
« Last Edit: February 14, 2011, 07:07:42 pm by Jean-François » Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'envoi deux valeurs.
la première est pour identifier les led 1 pour Rouge, 2 pour Bleue et 3 pour Vert. Depuis processing elle est envoyer en format int
La deuxième valeur c'est l'intensité de la led. Donc ça va de 0 à 255. Pareil elle est transmise depuis processing en int

quand je fait un print de ceci
Code:
  for(int e=0;e<2;e++){
      arduinoPort.write(values[e]);
      print(e+": "+values[e]+"\n");
    }

Quand je change l'intensité de la led 1 (rouge)  voilà ce qui apparait dans le print
Code:
0: 1
1: 50
0: 1
1: 51
0: 1
0: 52
etc..

Puis du coté de arduino je récupère les variables dans un tableau au format int

Code:
   for(int e=0;e<2;e++){
       values[e] = Serial.read();
       Serial.print(values[e]);
       Serial.print("\n");
     }

mais j'ai comme l'impression que c'est pas synchro entre processing qui envoie et arduino qui reçois...
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Enfin !!! C'est une victoire !!!

Bon si certains tombe sur ce poste ça va peut être aider donc voici comment j'ai fait..

Coté Processing j'étais capable sans soucis de récupérer la valeur d'intensité :
Code:
   
    String out = nf(fadeR,3)+ nf(fadeG,3)+ nf(fadeB,3);

    println(out);
    
    arduinoPort.write(out);      
     
  
j'ai tout simplement mis à la suite chaque valeur d'intensité Rouge + Vert + Bleue
Donc l'information est envoyé de cette manière 255255255 ( toutes les couleurs sont au max 255)

Et coté Arduino je décompose l'information :


Code:
if(Serial.available()==9)      // while there is data
  {

    r= (Serial.read()-48)*100;   // read the first byte
    r=r + (Serial.read()-48)*10; // read the second byte......
    r=r + Serial.read()-48;      // so on so forth

    g= (Serial.read()-48)*100;
    g=g+ (Serial.read()-48)*10;
    g=g + Serial.read()-48;
  
    b= (Serial.read()-48)*100;
    b=b + (Serial.read()-48)*10;
    b=b + Serial.read()-48;
    
    
    int d = Serial.read();// this is just to clear the end line character;
  
  }

  analogWrite(Red,r);          
  analogWrite(Green,g);
  analogWrite(Blue,b);


Et voilà je suis capable depuis mon iphone de gérer ma led RGB sur les trois couleurs smiley-grin

Par contre j'ai une petite question... est-ce que quelqu'un peut m'expliquer comment fonctionne séparation du serial.read() :  

r= (Serial.read()-48)*100;
r=r + (Serial.read()-48)*10;
r=r + Serial.read()-48;

Je n'arrive pas trop à comprendre :p

En tout cas merci quand même à toi Jean-françois d'avoir essayer de m'aider smiley Je pense que je n'avais pas attaquer le problème de la bonne manière.

« Last Edit: February 15, 2011, 12:33:35 pm by chesnel » Logged

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3227
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Qu'est ce que tu entends par " séparation du serial.read()"  ?
Logged

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Offline Offline
Full Member
***
Karma: 0
Posts: 174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ce que je ne comprend pas c'est du coté Arduino. Comment ceci :

r= (Serial.read()-48)*100;
permet de récupérer le premier byte

r=r + (Serial.read()-48)*10;
Celui-ci le second byte

r=r + Serial.read()-48;
Celui la le troisième

Et surtout qu'après cela recommence identique au premier, pour récupérer le 4eme byte
g= (Serial.read()-48)*100;

Je le répète je débute dans la programmation arduino et surtout en JAVA smiley
Logged

Pages: [1] 2   Go Up
Jump to: