arduino + maxsonar + processing

salve a tutti ho fatto un progetto, per controllare la distanza con arduino e processing usando un sensore ad ultrasuoni maxsonar lz1, la parte di arduino funziona, ma non riesco a passare i dati in processing, volevo sapere se qualcuno di voi può darmi una mano:

il codice di arduino è :


//Output
int statusLed = 6;
int ledPin = 2;
int ledPin2 = 3;
int ledPin3 = 4;
int ledPin4 = 5;
//int ledPin5 = 6;
//int ledPin6 = 7;

//intput
float ez1Analog = 5;

void setup() {
pinMode(statusLed,OUTPUT);
pinMode(ez1Analog,INPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
beginSerial(9600);
}

void loop() {
int val = analogRead(ez1Analog);
if (val > 0) {
val = (val/2);
val = (val/0.39);
Serial.println(val);
//Serial.print(val,DEC);

}
if (val < 50 & val > 0) {
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
}
else if (val < 200 & val > 50){
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
}
else if (val < 500 & val > 200){
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin4, LOW);
}
else if (val < 600 & val > 500){
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
}
else {
digitalWrite(ledPin, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);

}

blinkLed(statusLed,val);
}

void blinkLed(int pin, int ms) {
digitalWrite(pin,LOW);
digitalWrite(pin,HIGH);
delay(ms);
digitalWrite(pin,LOW);
delay(ms);
}


e funziona mi riporta il valore in cm della distanza

ma non riesco a far leggere la variabile da processing

uso mac con leopard e usb/seriale

grazie in anticipo
mau

ad occhio sembra ok,guarda nel codice processing e magari posta anche quello, io avevo un problema simile e alla fine era in processing

il codice di arduino l’ho modificato con :
printInteger(val);
serialWrite(10);

e mi riporta in uscita seriale il giusto valore intero es: 155 ( cm)
ma quando con processing tento di leggere il valore intero mi riporta dei valori a caso 50, 30, 10 ripetendoli

il codice di processing per la lettura che ho usato è :


void draw() {
while(myPort.available() > 0){
value = myPort.read();
println(value);
}
}

ma non funziona come dicevo sopra, non vorrei che fosse un problema della seriale del mac

grazie grazie :slight_smile:
mauma

ci sono un po di cosette sbagliate.

non usare un float per ez1Analog, non serve... il parametro è un int (quello è il numero del piedino da cui leggere)

la linea in cui dividi per 0.39 non è corretta, val è un int percui il risultato della divisione viene troncato all'intero piu vicino.

di solito non è molto utile fare operazioni prima di mandare un valore al computer... meglio farle con il linguaggio che le riceve. cioè manda i valori grezzi e poi manipolali in p5

quando usi println() su arduino il numero viene tradotto in una stringa di caratteri ascii con aggiunti i codici 13 (acapo) 10 (nuova linea)

quando li leggi su P5 il tuo codice semplicemente stampa il valore ascii di ogni carattere che riceve, per quello che sembrano a caso.

ci sono 2 soluzioni:

  1. da arduino manda i dati con con Serial.print(val/4,BYTE); perdi risoluzione ma ogni byte che ricevi è gia pronto da usare.

  2. in p5 leggi tutti i caratteri e li metti in un buffer ignorando i codici 13 e fermandoti quando vedi un codice 10 poi trasformi il buffer in un intero usando (vado a memoria) Integer.parse();

have fun

massimo