recevoir 3 variables depuis Processing

Bonjour, tout le monde,
J'ai une question sûrement très récurrente, mais je n'arrive pas à trouver de post, donc je me permets de la poser.
J'envoie 3 valeurs depuis processing comme ceci:

  values[0] = int(w1*100000);
  values[1] = int(w2*100000);
  values[2] = int(phiV*100000);

  //both possible


  String out = nf(values[0], 3)+"*"+nf(values[1], 4) +"*"+ nf(values[2], 4)+"*";
  //String out1 = nf(valueW1, 3) + "*" + nf(valueW2, 4) + "*" + nf(valuephiV, 4) + "*";

  println(out); 
  //println(out1);

  arduinoport.write(out);

et j'aimerai les récupérer sur Arduino
(j'ai essayé ceci dans void loop, mais ça marche pas)

 // see if there's incoming serial data: (from processing)
 
   if(Serial.available()>0)      // while there is data
{
 
  // First read the string until the '*' in your example
   // "1;130" this would read the "1" as a String
   
  String pulsation_str = Serial.readStringUntil('*');

   // split the string on the * and convert the resulting substrings
     // into an integer array:
     int [] omega = int (split(pulsation_str, "*"));
     // if the array has at least three elements, you know you got the whole
     // thing.  Put the numbers in the omega variables:
     if (omega.length >= 3) { // if you have 3 separate values
       
       w1 = omega[0];
       w2= omega[1]; 
       phiV= omega[2];

      }

      }

mon port série est bien configuré, puisque j'ai bien reçu des données, mais des 0.

Merci

Commencez par un programme sur l’arduino qui lit et affiche tout ce qui arrive sur le;port série octet par octet et postez les 2 codes...et vaut mieux laisser tomber la classe String sur arduino et travailler en cString

Merci J-M-L,
Je comprends plus rien. Je suis revenu à la base avec le programme simple write de processing pour allumer/eteindre la LED 13 dans Arduino .
Ca fonctionne, mais je n'arrive pas à afficher les valeurs dans le moniteur d'Arduino car il est busy.
Erreur d'ouverture du port série « /dev/cu.usbmodem1411 ». (Port busy)

Quand j'allume Arduino seul, je peux voir le moniteur mais évidemment y a rien.
Si je commence par Processing, je peux contrôler la led, mais je ne peux afficher le moniteur car il est busy.

Je dois manquer de sommeil...

Le programme de Processing

* Simple Write. 
 * 
 * Check if the mouse is over a rectangle and writes the status to the serial port. 
 * This example works with the Wiring / Arduino program that follows below.
 */


import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;        // Data received from the serial port

void setup() 
{
  size(200, 200);
  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[4];
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  background(255);
  if (mouseOverRect() == true) {  // If mouse is over square,
    fill(204);                    // change color and
    myPort.write('H');              // send an H to indicate mouse is over square
  } 
  else {                        // If mouse is not over square,
    fill(0);                      // change color and
    myPort.write('L');              // send an L otherwise
  }
  rect(50, 50, 100, 100);         // Draw a square
}

boolean mouseOverRect() { // Test if mouse is over square
  return ((mouseX >= 50) && (mouseX <= 150) && (mouseY >= 50) && (mouseY <= 150));
}


/*
  // Wiring/Arduino code:
 // Read data from the serial and turn ON or OFF a light depending on the value
 
 char val; // Data received from the serial port
 int ledPin = 4; // Set the pin to digital I/O 4
 
 void setup() {
 pinMode(ledPin, OUTPUT); // Set pin as OUTPUT
 Serial.begin(9600); // Start serial communication at 9600 bps
 }
 
 void loop() {
 while (Serial.available()) { // If data is available to read,
 val = Serial.read(); // read it and store it in val
 }
 if (val == 'H') { // If H was received
 digitalWrite(ledPin, HIGH); // turn the LED on
 } else {
 digitalWrite(ledPin, LOW); // Otherwise turn it OFF
 }
 delay(100); // Wait 100 milliseconds for next reading
 }
 
 */

Le programme d'Arduino

  // Wiring/Arduino code:
 // Read data from the serial and turn ON or OFF a light depending on the value
 
 char val; // Data received from the serial port
 int ledPin = 13; // Set the pin to digital I/O 4
 
 void setup() {
 pinMode(ledPin, OUTPUT); // Set pin as OUTPUT
 Serial.begin(9600); // Start serial communication at 9600 bps
 }
 
 void loop() {
   Serial.println (val);
 while (Serial.available()) { // If data is available to read,
 val = Serial.read(); // read it and store it in val

 }
 if (val == 'H') { // If H was received
 digitalWrite(ledPin, HIGH); // turn the LED on
 } else {
 digitalWrite(ledPin, LOW); // Otherwise turn it OFF
 }
 delay(100); // Wait 100 milliseconds for next reading

 }

Vous ne pouvez pas avoir 2 "clients" sur le même port série. Soit c'est le programme Processing qui parle à l'arduino, soit c'est la console de l'IDE Arduino...

Vous ne pouvez pas avoir 2 "clients" sur le même port série.

D'accord. Mais comment faire pour visualiser les infos envoyées depuis Processing sur le moniteur série de l'Arduino? C'est pas possible alors?

il vous faut un second port série sur l'arduino... un Mega par exemple ou un adaptateur Série - USB et utiliser software Serial, ou connecter un LCD ou TFT à l'arduino

sinon vous pouvez faire clignoter la LED du UNO pour montrer ce qu'il a reçu

Bonjour,

J'ai essayé de me baser sur un autre programme pour récupérer mes 3 variables.

Des valeurs sont bien envoyés puisque mes moteurs tournent, mais quasi aleatoirement.

Je récupère mes 3 variables (des int) avec ce code Arduino depuis void loop

void loop()  {

   // read the sensor value: (the potar)
  //  int sensorReading = analogRead(A0);

   //  send sensorReading to Serial (to receive it in Processing)
   //Serial.print(analogRead(sensorReading));   
  
  
   // _____________________________________________
   // see if there's incoming serial data: (from processing)
  
    if(Serial.available()>0)      // while there is data
 {
  
      w1 = Serial.parseInt();
      w2 = Serial.parseInt();
      phiV = Serial.parseInt();
      Serial.read();
 
  
     }

     Setpoint = w1;
     stateB= w2;
     stateD= phiV;

les 3 variables sont envoyées à partir de ce code Processing depuis le void draw
(J'envoie des info de vitesses avec des variables int entres 0 et 255.)

void draw() {
  
 //int[] valueW1 = new int[1];
 //int[] valueW2 = new int[1];
 //int[] valuephiV = new int[1];
  values[0] = int(w1*1000);
  values[1] = int(w2*1000);
  values[2] = int(phiV*100);

  //both possible


  //String out = nf(values[0],0)+"*"+nf(values[1], 2) +"*"+ nf(values[2], 2)+"*"; (simpler)
  //String out1 = nf(valueW1, 3) + "*" + nf(valueW2, 4) + "*" + nf(valuephiV, 4) + "*";

  //println(out); 
  //println(out1);
  
  //arduinoport.write(out); 
  //arduinoport.write(out1);
  
  //or

  //arduinoport.write(values[0] + "*" + values[1] + "*" + values[2] + "*");
  
    // SIMPLE WAY of JB4x
    
   arduinoport.write(values[0] + ";" + values[1] + ";" + values[2] + ";");
   
  //arduinoport.write(values[1] + "," + values[2] + ","); // why not the coma? other problem 3 values seems to be assigned
  //println(values[0], values[1], values[2] );

Merci pour vos aides et conseils (les solutions toutes faites m'intéressent aussi!)

qu'est-ce qui vous dit qu'un int côté Processing sur votre PC va tenir sur 2 octets?