Comunicación con 9 DOF Razor (solucionado)

Sigo aprendiendo con Arduino, ampliando las opciones que da.

Tengo una 9 DOF Razor de Sparkfun http://www.sparkfun.com/products/10736
Tras algún que otro quebradero de cabeza he conseguido instalarle el código AHRS. Ahora ya puedo enviar por puerto serie los datos que quiera, los ángulos e incluso los datos de salida de los sensores.

Mi consulta es sobre el tratamiento de la comunicación. Tras estudiar el tema os explico a las conclusiones que he llegado de cómo hacerlo a ver si voy por el buen camino.

Envío una serie de datos estilo: !ANG:23.7,89.67,124.56
Y lo último el CR.
Ahora en Arduino tengo que leer esa secuencia. Primera duda, ¿siempre tengo que comprobar primero el puerto con .available? Si directamente ejecuto .read si no hay nada en el buffer Arduino se queda congelado esperando sin ejecutar nada del resto de programa, ¿es así? Otra cosa, ¿hay posibilidad de salir de un .read cuando se queda porque no hay nada en el buffer?

Sigo. Cuando vaya leyendo los datos la sentencia .read me va leyendo los datos de un byte en un byte, ¿no? Por tanto tengo que leer todos los bytes de uno en uno hasta que lea el CR. Una vez leídos tengo que recomponerme los datos, ¿no? Es decir, tengo que detectar cuándo empieza la primera cifra, en el primer caso detectar el byte ":" y empezar a leer los siguientes detectando el "." y el final del número. Lo mismo hasta el final de la cadena. A continuación tengo que reconstruirme los números para que arduino los entienda como tales haciendo: AnguloX = 3 + 210 + 70.1

¿Es más o menos éste el método que tengo que seguir?

Hola,

Ojea http://arduino.cc/forum/index.php/topic,75826.0.html y http://arduino.cc/forum/index.php/topic,69309.0.html

Puedes sacar ideas para resolver tu problema.

Saludos

Igor R.

Gracias por los enlaces, los leeré detenidamente ya que no imaginaba que la máquina de estados pudiera aplicarse a mi caso.

Bueno, una trama ASCII es el típico ejemplo... primero recibes !, luego ANG, luego el número,etc y acabas con un CR... Como bien lo has descrito... es una secuencia.
Puedes ver que hice un ejemplo de algo similar con la librería FSM... ya que es una de las clásicas preguntas del foro. El ejemplo que he hecho es una trama que empieza por S, luego un unsigned long y termina con una E. (S viene de Start y E de End).

También hace tiempo escribí otro básico: Tinkering with Electronics...: LINKDUINO: Linksys + Arduino + Excel-Telnet

//Mini protocolo serie
//Igor Real

int luz1= 13;
int el1;
int estado=0;
byte dato_recibido;

void setup() {
   pinMode(luz1, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(12,LOW);
   Serial.begin(9600);
}

void loop()
{
  //trama a recibir --> S1F o S0F
  //S inicio
  //1 ENCENDIDO Y 0 APAGADO
  //F fin
  while (Serial.available() > 0)
  {
    //Significa que has recibido algo y lees el primer byte
    dato_recibido=Serial.read();
    if (dato_recibido=='S' && estado==0){
      estado=1;
    }
    if (((dato_recibido=='1')||(dato_recibido=='0')) && estado==1){
      estado=2;
      if (dato_recibido=='1')  el1=1;
      if (dato_recibido=='0')  el1=0;
    }
    if (dato_recibido=='F' && estado==2){
      estado=0;
      digitalWrite(luz1,el1);
      if (el1==0)  Serial.println("APAGADO");
      if (el1==1)  Serial.println("ENCENDIDO");
    }
    
  }
}

Espero que te sirva para entender la idea de lo que tienes que hacer.... También puedes hacerlo con switch....
Vaya, yo te digo como lo plantearía personalmente. Me resulta fácil coger boli y papel, y pensar que es lo que debería hacer mi Arduino. Luego picar el código son 5 minutos si lo tienes claro.

:smiley:

Creo que entiendo, de hecho el diagrama del dibujo es básicamente la idea que llevaba y que pretendía explicar. Solo que veo dos diferencias fundamentales.
La trama que yo voy a recibir no es de un número fijo de bytes para cada estado puesto que un ángulo puede ser 23.67 grados o puede ser 114.23 grados. O incluso puede no tener decimales.
La otra diferencia es que yo no tengo que comparar los bytes para cada estado con otros para ejecutar una acción u otra si no que necesito la información numérica que me envía los propios bytes. Es decir, yo tengo en el AHRS una variable que me está midiendo un ángulo en el eje X de 23.67 grados. A continuación para enviar esa información por el puerto serie lo que hace es enviar 5 bytes: "2" "3" "." "6" "7". Cuando los recibo en Arduino no tengo el dato de la variable que yo quiero, tengo 5 bytes con los que tengo que recomponer la variable original.

Mírate el ejemplo con la librería FSM!! No me lo creo que te lo has mirado/probado con lo que acabas de escribir!!

=(

No tienes que creer que lo he leído puesto que no lo he leído :smiley: y menos probado, no he tenido tiempo.
Vamos, no por nada, tal como te había puesto "los leeré con detenimiento" y los probaré en cuanto pueda. Lo que pasa es que te he contestado a lo que he visto en tu siguiente mensaje guiándome sólo por lo que has puesto en él guiándome fundamentalmente por el gráfico.

Ya me he podido meter a estudiar los enlaces e información que me has puesto. Ya tengo claro cómo hay que hacerlo. A mí el código me llevará más de cinco minutos que no tengo tanta práctica en programación pero lo importante es que ya sé el método a seguir. Gracias por la información Igor.

jajajaja
Cinco minutos es una expresión que se me ha pegado... suelen ser más bien horas!!

:wink:

Jeje, me alegra oir eso :wink: