Buenas,
Estoy programando un coche para controlarlo via bluetooth. He utilizado arduino y app inventor2. La duda es que me gustaría enviar dos variables desde app inventor, pero como hago k arduino diferencie cada una de las variables???
Gracias
Hay muchas maneras de hacerlo:
-
La mas simple si siempre enviarás dos, pues envias
XXX, YYY separado por coma o
XXX YYY separado por un espacio -
Le agregas un tag que ubique el comando, supongamos que tuvieras 10 comandos y no siempre envias todos
A identifica primer comando
B segundo y asi
entonces
AXXX BYYYY
esto te permite enviar por ejemplo
AXXX, DZZZ
Luego tendras que separar todo esperando leer el primer comando, y todos aquellos que siguen a la coma o espacio (algún delimitador debes usar para indicar fin de comando e inicio del siguiente).
Todo debe terminar con un '\n' que te indique fin de comandos.
Que no entiendes?
Tienes var1 y var2 var es variable
supongamos que var1 = 23 y var2 = 89
entonces puedes enviar
23 89
23,89
o cualquier cosa entre 23 y 89
O puedes decir que pondras una etiqueta para cada Variable
V023,V189
En este caso V0 es Variable 0 (cero) que corresponde a tu primer variable o var1
X puede tomar valores de 0 a 9
Claro que esto sirve para 10 variables, sino lo incrementas a dos digitos luego de la V
Uso V por usar,puedes llamarlo S o como gustes.
Ahora para interpretarlo tendrás que esperar datos por el puerto serie.
Cuando leas una V sabras que el siguiente digito te dirá que indice de variable vas a leer
y los digitos siguientes será tu dato.
El dato termina con el delimitador sea espacio, coma, tilde o una letra distinta de la que usas para identificar la variable.
y asi puedes seguir hasta el final, cuando leas '' que indica fin de linea.
int avanzar=5;
int retroceder=6;
int derecha=9;
int izquierda=10;
void setup()
{
Serial.begin(9600);
pinMode(avanzar,OUTPUT);
pinMode(retroceder,OUTPUT);
pinMode(derecha,OUTPUT);
pinMode(izquierda, OUTPUT);
}
void loop()
{
//Cuando haya datos disponibles
while (Serial.available()>0);
{
int av = Serial.parseInt();
int rt = Serial.parseInt();
int dr = Serial.parseInt();
int iz = Serial.parseInt();
if (Serial.read() == '\n')
{
analogWrite(avanzar,av);
analogWrite(retroceder,rt);
analogWrite(derecha,dr);
analogWrite(izquierda,iz);
}
}
}
he hecho este código donde controlo los dos motores del coche, ves algún error?
He comprobado que parseInt() funciona pero es extremadamente lento y aun no investigué porque.
Por lo visto enviaras 12 34 56 78 como 4 datos separados por espacios y eso funciona.
terminas con ENTER.
Creo que puede funcionar.
A ver que opinan los demás.
Surbyte. Creo que parseInt no es lento por sí, pero si lo ejecutas en cuanto hay un dato en serial, más si ejecutas varios parseInt, éstos tienen la particularidad de que si aún no ha llegado el carácter separador se queda esperándolo un tiempo de timeout. En la práctica supone que con sus respectivos timeouts, el código que puso Carchodon va a tener al arduino entretenido desde que llega el primer byte hasta que llega el \n.
En lugar de entrar en la rutina inmediatamente se puede reducir el tiempo de espera si entramos cuando serial.available sea mayor o igual a un tamaño mínimo de trama. Por ejemplo, si esperamos hacer cuatro parseInt, el tamaño mínimo sería 8 (4 números de una cifra + 3 separadores + terminador).
Por ello soy más partidario de tramas de longitud fija, o mejor aún, enviar estructuras directamente.
gracas, me puedes explicar como hacer eso?
Vino la caballería al rescate. gracias Serafín. (Lee el privado que te envie por otro tema).
Estoy de acuerdo. Yo hice algo el otro dia y dije veamos como trabaja parseint y me pareció lento y eso que pone 123 y le daba ENTER de modo que se veía como esperaba.
pero sabéis como arreglarlo o hacerlo de otra manera?
En principio tu código debería funcionar, si le estás enviando los datos de forma correcta:
a b c d \n
Pon separador también tras el último valor o bien no pongas el if serial.read==\n, porque el parseInt se come también el carácter siguiente al número (delimitador).
Y de paso cambiaría el while por un if (Serial.available()> 8 ).
Perdón por la mala redacción, estoy con teléfono.
no se si influye pero yo desde app inventor envío texto en vez de números, puede ser el problema? es decir pongo el bloque de texto pero envío numeros
No debería ser problema porque el parseInt precisamente transforma texto a número. El problema es saber exactamente qué texto le llega a arduino.