ARDUINO + PROCESSING problemas datos serie

Hola y muy buenas a todos!

Tengo un pequeño proyecto, en el que necesito monitorear el puerto serie en el PC con processing.
Para ello, envio las señales desde ARDUINO.
Tengo unas dudillas.

En linux (ubuntu 10.10) tanto arduino como processing tienen muchos problemas con la comunicación serie, hasta el punto de que solo una de cada 10 veces puedo mandar el código compilado a ARDUINO, el reso no me reconoce ningun dispositivo conectado ( en processing tambien pasa pero menos amenudo).

Por esto, no se si será problema de la comunicación serie o de processing mi duda:

DUDA 1:

Al enviar señales con arduino (p.e el número en decimal "0") y monitorearlas con el Serial Monitor, todo marcha perfectamente.
Pero si se lo leo con Processing, éste me lee 48 ¡ POR QUE OCURRE ESTO?

DUDA 2:

Si envio una señal que va de 0.00 a 1.00 en modo BYTE con arduino, el serial monitor solo lee o 0 o 1 como si lo redondease, ( por lo que en processing, me lee 48 o 49 ) por que pasa esto???

MUCHAS GRACIAS DE ANTEMANO!

UN SALUDO!

Hola,

Miráte http://arduino.cc/es/Serial/Print (ASCII).

Saludos

:wink:

Muchas gracias compañero!,
Alguien puede confirmarme lo de los problemas ubuntu -processing-arduino ??

thx!

Este es el programa básico para arduino:

float val;
void setup(){
Serial.begin(9600);
}
void loop(){
val=analogRead(0);
Serial.print(val/1024,4);
delay(100);
}

en processing simplemente leo de el puerto , cuando esta disponible

SERIAL MONITOR LEE: 0.1187 (p.e)
PROCESSING LEE: de 48-53 con mucha variación.

no entiendo nada ...

Hola, yo estoy empezando con este tema de processing y arduino. La condición previa es que el valor del sensor sea menor de 254, y envio este último código, desde arduino, después del valor del sensor:

Serial.print (value);
Serial.print(254,BYTE);

En processing formo una cadena, pasando antes los códigos ASCII a caracter, hasta que llegue al código que indica que ya ha terminado:

import processing.serial.*;

Serial myPort;
String buf="";

void setup() {
println(Serial.list());// List all the available serial ports:

// En Serial.list()[] poner el puerto COM correspondiente
myPort = new Serial(this, Serial.list()[0], 115200);
}

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

// une los caracteres en una cadena hasta que encuentra el código ASCII que pone fin a la cadena
void serialEvent(int serial) {
if(serial!=254) {
buf += char(serial);
}
else {
print(int(buf));
buf="";
}
}

Seguro que no es la forma mas correcta. Me gustaría conocer si hay algún protocolo cuando se envian datos de distinto tipo, por ejemplo, si quiero formar una matriz con los datos del sensor, pero que no incluya otros datos. Yo solo cambio el último byte enviado.

Teneis los mismos problemas en linux para cargar el código y reconocer los dispositivos ??

sigo sin poder mandar valores decimales ( entre 0 y 1 ) , tanto si mando un float en modo DEC o especificando los decimales ",4" o sin especificar modo el processing lee valores entre 47 y 53 . Pero si mando por ejemplo un 5 en modo byte, si que me lo reconoce como tal.

A ver si lo entiendo ...
quires mandar un float por puerto serie y que processing lo interprete como tal ?

tienes un error de conceptos, por puerto serie solo puedes enviar bytes ¡¡¡ es decir, valores entre 0 y 255 cada byte¡¡

cuando pones por ejemplo en arduino serial.print("hola") por el puerto serie envías 150, 157, 154 y 141, valores correspondientes a cada uno de los caracteres.

si quieres enviar de arduino el valor de un número decimal puedes hacerlo de 2 formas

primera, envviarlo como texto, es decir con serial.print"valor del sensor), si el valor es 12,54 por ejemplo, por serie enviará 61,62,54,65 y 64 es decir , 5 bytes, uno por cada caracter,
en processing tienes que tratar estos datos que te entran por serie para construir el float que quieres. ( para arduino hay varios ejeplo y puedes ver alguna funcion que publiqué en el foro, pásate por el playground, es para pasar de texto a número)

la otra opcion es descomponer el float ( lo componen 4 bytes ) y enviar cada uno de estos bytes, y luego en processing reconstruir el float poniendo cada byte en su sitio. de esta manera recuperas el número.

espero lo hayas entendido.

un saludo

Un pequeño apunte a lo de SrDonGato que está muy bien explicado, los ejemplos de los números que ha puesto (que los podéis ver en la lista de arriba de carácteres ASCII), ha puesto los equivalentes octales y a lo mejor es lioso...
Es decir un cero "0" en ASCII es un 48 decimal, un uno "1" es un 49, etc.
Si cuando lees el byte, le restas 48, te quedará el número, por ejemplo, si recibes un 9 (57d) tienes que 57-48=9.

Por cierto, posts relacionados con esto mismo y muy recientes:
http://arduino.cc/forum/index.php/topic,76223.0.html
http://arduino.cc/forum/index.php/topic,75826.0.html
http://arduino.cc/forum/index.php/topic,69309.0.html

Salu2

Muy buenas a todos Ardumaniacos. Sputnic el problema de conexin serie entre processing y Arduino te ocurre tan solo a la hora de cargar el codigo al Arduino? si es asi, asegurate de que cuando cargas el codigo al arduino, processing se encuentra en pausa, ya tanto para cargar el codigo al arduino como para comunicarte con processing necesitaras el puerto serie. Por otro lado, como decia SrDonGato, deberas enviar el float por bytes. Yo cuando he trabajado con processing siempre lo he enviado por ASCII realizando una conversion previa al envio.

Espero haber ayudado en algo!

Cierto, me equivoqué de columna al buscarlo, quería haber puesto el decimal.