Hola, he buscado en muchos foros, he leido mil resultados en google y no he llegado a nada. Estoy desarrollando una interfaz grafica en python para controlar cinco servomotores con mi arduino (dispongo de un Arduino UNO y un Arduino Mega 1280) con controles deslizantes de 0 a 180 grados. El tema es que arduino no me recibe numeros de dos digitos o mas, ejemplo si yo envio un 56, recibe un 5 primero y luego un 6, pero no el numero de dos digitos, no se si me explico. Ademas necesito poder identificar cada servo con una letra, para asi enviar la letra seguida de el angulo deseado a traves de python, alguien me puede ayudar?
Tienes varias opciones: o montarte siempre el mismo mensaje, o montarte un "protocolo" de "inicio-fin" de mensaje, o esperar a recibir la letra, etc.
Por ejemplo, dices que tienes que recibir desde arduino diferentes mensajes. Las 3 soluciones serían:
- Siempre el mismo mensaje: Letra+ 3 numeros. p.e. A123, A045, B003, etc..... (siempre letra+3 numeros del angulo, rellenando con 0).
- Montar un protocolo de "inicio-fin": crear un inicio de linia y un final de linia, para saber cuando empieza y acaba el mensaje. p.e Inicio: letra Final: \r Mensaje: A120\r B042\r, etc.....
- Esperar a recibir la letra para saber cuando empieza-acaba. p.e. mandar A123B038A003C093 puedes separarlos por: A123/B038/etc.
No se si me he explicado, piensa cual te va mejor (o cual prefieres) y cualquier cosa vuelve aquí!
esa fue mi idea, pero soy algo novato con esto y no se como pasarlo a codigo, utilize uno que encontre por la web pero me daba numeros desorbitantes.
int i = 0; //variable de acarreo, utilizada con el array
int digitos = 0; //número de dígitos del número escrito
int numero = 0; //el número que hemos escrito
int exponente = 0; //el exponente al que se elevarán los dígitos
const int maxDigitos = 10; //Máximo de dígitos del número
int num[maxDigitos]; //array con los dígitos de nuestro número
void setup(){
Serial.begin(9600); //Iniciamos el Serial
}
void loop(){
digitos = 0;
numero = 0;
/Primero, se comprueba que el Serial esté disponible. Si es así,
al enviar un número al Arduino desde el ordenador, se almacenarán
los dígitos individuales en las variables num[]. Además, muestra el
valor de los dígitos en el ordenador.
Hay que restar 48, ya que los números son enviados en formato ASCII
/
if (Serial.available() > 0){
for (i = 0; i < maxDigitos; i++){
num = Serial.read();
num = num - 48;
_ Serial.print(i);
* Serial.print(" = ");
Serial.println(num);
}
/Determinamos los dígitos del número. En todas las variables_
del array se almacena información, siendo un -49 si no contiene
un número. Por tanto, se cuentan las variables num[] con contenido
_diferente de -49, y se pasa el resultado a la variable digitos/
for (i = 0; i < maxDigitos; i++){
if (num != -49){
digitos++;
}
}
Serial.print("digitos = ");
Serial.println(digitos);
/En esta parte del programa se toman los dígitos por separado, y,
en función de su posición (unidades, decenas, centenas...) son
elevados a un exponente determinado por el número de dígitos
/
for (i = 0; i < maxDigitos; i++){
if (i < digitos){
exponente = digitos - 1;
exponente = exponente - i;_
numero = numero + (num _ pow(10, exponente));
* }
}
/Por un motivo que no entiendo, cuando los números son de 3 dígitos_
o más, se le resta 1 a las unidades. Después de corregir esto último
se muestra el número
_/
if (digitos >= 3)
numero++;
Serial.print("El numero que has escrito es ");
Serial.println(numero);
}
}*
*extraido desde http://juan.aguarondeblas.es/2010/07/unificador-de-numeros-por-serial-para-arduino.html*_
Creo que se puede hacer algo parecido mas facilmente y con codigo mas eficiente:
char letra;
String codigo;
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available() > 0 ) {
letra = Serial.read();
codigo.concat(letra);
delay(10);
}
if (codigo.length() > 0) {
Serial.println("Has escrito el codigo:" + codigo);
codigo="";
}
}
Con esto tienes el codigo recogido del serial,te faltaria separar cada parte de la cadena para obtener lo que te interesa teniendo e cuenta que la funcion codigo.charAt(0) te devuelve el primer caracter,codigo.charAt(1) el segundo,etc,etc y que seguramente tengas
que hacer una conversion a tipo numerico para poder usarlos como numericos ya que codigo es de tipo String ,pero eso te lo dejo para ti si crees que te puede servir ,claro.
Creo que deberías echar un vistazo a la referencia de Serial en inglés (en español está incompleta).
Si defines cómo quieres enviar las tramas de datos, creo que por ejemplo parseint podría ser uno de tus amigos.
Si tienes dudas, expón ejemplos de cómo van a ser las tramas de comunicación.
gracias c: