[RESOLU] récupérer plusieurs valeurs processing vers arduino : serial.read();

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

tu as regardé ce post :

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

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 :

   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)

if (Serial.available() > 1) {

for(int i=0;i<2;i++){
infoLED = Serial.read();

  • }*
    }
    [/quote]
    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 ?

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 XD

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 :

//----------------------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--------------------------------
    [/quote]
    ```
    *//-----------------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 :slight_smile:

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

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

Pour le savoir, tu fais ça :

// 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").

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();

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

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 ?

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?

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

Tu changes comment les valeurs de ces variables :

led[i] = i;
upLED[1] = i;

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

  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

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

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

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é :

    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 :

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:

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 :stuck_out_tongue:

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

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

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 :slight_smile:

Imagine que ta liaison série soit un tuyaux, tu envoies des billes depuis un bout... les billes ressortent une à une de l'autre coté.
Pour récupérer ces billes l'Arduino à un tapis roulant avec des gobelets, chaque gobelets ne peux avoir qu'une bille à la fois (Serial.read()).
Par contre tu peux ensuite vider les gobelets dans une bouteille (string)....

Et tu peux faire ainsi :

r += Serial.read()-48;

C'est pareille que :

r=r + Serial.read()-48;

si j'envoie par exemple 145 depuis processing, arduino va les recevoir en miroir
Donc en premier le 1100 = 100
Le deuxième 4
10 = 40
troisième

100+40+5 = 145 ! et la valeur est reconstitué :slight_smile:

ahh super ! merci à toi :slight_smile:

Dans le principe c'est ça :wink:

Bonjour,

je me suis un peu perdu dans ce post, et je n'ai pas eu le "déclic" de compréhension :

j'ai deux capteurs, le premier capte 25 et le second 12 (c'est un exemple)
j’envoie 2 valeurs avec une entête pour les différencier depuis arduino, pas de soucis ...

A25
B12

je récupère ça dans processing : (oui tout va bien)

A25
B12

ce que je ne sais pas faire c'est virer l’entête pour réaffecter les valeurs a chacune de mes variables

Variable1 = 25
Variable2 = 12

en pseudo code ça donnerais ça :

{
    //on lit le premier caractère 
    char choseLue = Serial.read();
 
    if(choseLue == A) //si c'est A
    {
        Variable1 = PAS le premier caractere mais les autres et ce n'est plus une chaine mais un INT ;
    }

    if(choseLue == B) //si c'est B
    {
        Variable2 = PAS le premier caractere mais les autres et ce n'est plus une chaine mais un INT ;
    }
   
}

Si vous pouvez m’éclairer un peu ça serait magique.
Merci