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:
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.
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.
* 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...
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
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!)