Go Down

Topic: Ayuda con 9DOF (Read 3061 times) previous topic - next topic

Cheyenne

#15
Oct 11, 2013, 08:57 pm Last Edit: Oct 11, 2013, 09:06 pm by Cheyenne Reason: 1
Procedimiento: pegar ese código en una ventana del IDE, click sobre el botón verificar (el del símbolo "tick") y comprobar los errores de compilación que informa en la parte inferior de la ventana. Ir leyendo uno a uno los errores, entenderlos e intentar solucionarlos.

Errores que marca:

- En la línea 40: incompatible types of "int" to "byte [17]"

Efectivamente, es la línea

Trama = Serial.read();

Estás asignando una variable "Trama" que por defecto es int para leer del puerto serie que lo que entran son bytes. La variable creada como byte es un array por lo que te has dejado de poner la posición dentro del array. En el código original que te dije de descargar sí está, cambiarías cosas y lo borrarías. Resumiendo la instrucción a poner es:

Code: [Select]
Trama [i] = Serial.read();

- Dos errores iguales en la línea 74: expected "}" at end of input.

Es decir, que faltan dos símbolos "}" de poner al final. Efectivamente, no has cerrado las llaves correspondientes a las aperturas de "void loop() {" y "if (Serial.available() > 16) {"

Aunque no marca error también veo que te has dejado de activar el puerto serie. En void setup() hay que poner Serial.begin(57600); ya que al menos en mi código original en el Razor la velocidad que puse en el código era 57600 bps.

Con estas pocas cosas el código queda:

Code: [Select]

#include <Servo.h>

Servo servo;

unsigned long TiempoControl1 = 0;
unsigned long TiempoControl2 = 0;

byte Trama[17];
boolean Error9DOF = false;
boolean Signoroll = true;
boolean Signopitch = true;
boolean Signoyaw = true;
int roll = 0;
int pitch = 0;
int yaw = 0;
boolean SignoAccelX = true;
boolean SignoAccelY = true;
boolean SignoAccelZ = true;
int AccelX = 0;
int AccelY = 0;
int AccelZ = 0;

void setup() {

 Serial.begin(57600);
 servo.attach(9);

}

void loop() {

 if (Serial.available() > 16) {
   
   
while (Serial.available() > 16) {
 Trama[0] = Serial.read();

 if (Trama[0] = '!' && Serial.available() > 15) {
   
   for (int i=1; i < 17; i++) {
     Trama [i] = Serial.read();
   }
   
 if (Trama[15] == '\r' && Trama[16] == '\n') {
   Error9DOF = false;
 }
 else {
   Error9DOF = true;
 }
 
 }

}

 
 if (Error9DOF == false)
 
 
 if (Trama[1] == 111 || Trama[1] == 101 || Trama[1] == 11 || Trama[1] == 1 ) {
   Signoyaw = true;
 }
 else {
   Signoyaw =false;
 }
 
 
 if (Signoyaw == true) {
   yaw = word(Trama[6],Trama[7]);
 }
 else {
   yaw = - word(Trama[6],Trama[7]);
 }
 }
}


Compila bien, ahora hay que comprobarlo imprimiendo en la consola la variable yaw y comprobando que los valores son acordes a lo que mueves el Razor.

A continuación tienes tu valor yaw y lo mapeas para el rango que quieres mover el servo.
http://cuadricopterodiyarduino.blogspot.com/

sergimk

Bueno primero de todo quiero darte las gracias por toda la ayuda que me estas dando y por coregirme los errores.

He intentado seguir con el programa que lo que quedaría sería coger el valor del yaw, leerlo, mapearlo, y escribir este nuevo valor en el servo.
Lo que yo creo que sería esto:

int yaw val = Serial.read;
val = map (val,0,17999,0,179);
servo.write(val);
delay(15); 

y el código quedaría :

Quote
#include <Servo.h>

Servo servo;

unsigned long TiempoControl1 = 0;
unsigned long TiempoControl2 = 0;

byte Trama[17];
boolean Error9DOF = false;
boolean Signoroll = true;
boolean Signopitch = true;
boolean Signoyaw = true;
int roll = 0;
int pitch = 0;
int yaw = 0;
boolean SignoAccelX = true;
boolean SignoAccelY = true;
boolean SignoAccelZ = true;
int AccelX = 0;
int AccelY = 0;
int AccelZ = 0;

void setup() {

  Serial.begin(57600);
  servo.attach(9);

}

void loop() {

  if (Serial.available() > 16)
  {while (Serial.available() > 16)
  {Trama[0] = Serial.read();

  if (Trama[0] = '!' && Serial.available() > 15)
  {for (int i=1; i < 17; i++)
  {Trama = Serial.read(); }
   
  if (Trama[15] == '\r' && Trama[16] == '\n')
  {
    Error9DOF = false;
  }
  else {
    Error9DOF = true;
  }
 
  }

}

 
  if (Error9DOF == false)
 
 
  if (Trama[1] == 111 || Trama[1] == 101 || Trama[1] == 11 || Trama[1] == 1 ) {
    Signoyaw = true;
  }
  else {
    Signoyaw =false;
  }
 
 
  if (Signoyaw == true) {
    yaw = word(Trama[6],Trama[7]);
  }
  else {
    yaw = - word(Trama[6],Trama[7]);
  }
  }
int yaw val = Serial.read;
val = map (val,0,17999,0,179);
servo.write(val);
delay(15);

}


y no funciona me vuelve a dar error, creo que el error esta a la hora de  declarar el valor del yaw

Cheyenne

Has vuelto a poner

Trama = Serial.read();

cuando es
Code: [Select]
Trama [i]= Serial.read();

No entiendo  :~ si te lo puse todo en el código. Además si lo verificas te vuelve a dar el mismo error tal y como te lo expliqué en la anterior respuesta  :~

Después estás haciendo

int yaw val = Serial.read;

que tal y como te está marcando el error el pobre programa no tiene ni idea de lo que significa. La verdad que yo, aparte de estar mal, tampoco sé lo que querías hacer.

Lo que tienes que hacer es declarar por ejemplo la variable val donde se declaran todas las variables, al principio junto al resto de declaraciones.

int val = 0;

y al final, una vez que ya tienes leído desde el puerto serie el valor de yaw justamente en la variable yaw, la mapeas sobre val y la escribes en el servo.

val = map (yaw, -18000, 18000, 0, 180);
servo.write (val);
delay (15);

Además en este caso no haría falta el delay puesto que los valores nuevos de yaw se reciben cada 20 ms (si no lo has modificado en el código del Razor, que si interesa se puede modificar). Por tanto no se le mandarán posiciones distintas al servo como mínimo cada 20 ms independientemente del delay (15).
http://cuadricopterodiyarduino.blogspot.com/

sergimk

Vale supongo que quedaria así :

Quote
#include <Servo.h>

Servo servo;

unsigned long TiempoControl1 = 0;
unsigned long TiempoControl2 = 0;

byte Trama[17];
boolean Error9DOF = false;
boolean Signoroll = true;
boolean Signopitch = true;
boolean Signoyaw = true;
int roll = 0;
int pitch = 0;
int yaw = 0;
boolean SignoAccelX = true;
boolean SignoAccelY = true;
boolean SignoAccelZ = true;
int AccelX = 0;
int AccelY = 0;
int AccelZ = 0;

int val = 0;

void setup() {

  Serial.begin(57600);
  servo.attach(9);

}

void loop() {

  if (Serial.available() > 16) {
   
   
while (Serial.available() > 16) {
  Trama[0] = Serial.read();

  if (Trama[0] = '!' && Serial.available() > 15) {
   
    for (int i=1; i < 17; i++) {
      Trama = Serial.read();
    }
   
  if (Trama[15] == '\r' && Trama[16] == '\n') {
    Error9DOF = false;
  }
  else {
    Error9DOF = true;
  }
 
  }

}

 
  if (Error9DOF == false)
 
 
  if (Trama[1] == 111 || Trama[1] == 101 || Trama[1] == 11 || Trama[1] == 1 ) {
    Signoyaw = true;
  }
  else {
    Signoyaw =false;
  }
 
 
  if (Signoyaw == true) {
    yaw = word(Trama[6],Trama[7]);
  }
  else {
    yaw = - word(Trama[6],Trama[7]);
  }
  }

val = map (yaw, 0, 18000, 0, 180);
servo.write (val);
delay (15);
}


lo único que e creído que tenia que cambiar a sido el mapeo de los datos del sensor que tu me as puesto de -18000 a 18000 y yo solo quiero que vaya de 0 a 180º
Bueno el código ahora me lo da por bueno pero lo único que hace el servo es vibrar no modifica su posición y no entiendo porque ... 

Cheyenne

Pues no entiendo cómo te lo puede cargar porque por enésima vez en el código que has puesto sigue sin estar corregido el Trama = Serial.read ();

Después de eso si no te funciona tendrás que ir testeando las variables imprimiéndolas en el monitor comprobando si son coherentes hasta averiguar dónde está el fallo.

Por cierto, si sólo mapeas entre 0 y 18000 tendrás que tener cuidado de no colocar el Razor en posición de un ángulo yaw negativo porque entonces le llegará a la instrucción servo un valor negativo y lógicamente no lo admite. Comprueba no te esté pasando ya.
http://cuadricopterodiyarduino.blogspot.com/

sergimk

No entiendo donde se supone que sigue puesto Trama = Serial.read(); porque de verdad que pensaba que lo había corregido y lo e buscado y  no lo encuentro

Cheyenne

Seguido a la instrucción for. En el código que has puesto yo veo

Code: [Select]

    for (int i=1; i < 17; i++) {
      Trama = Serial.read();


y debería ser

Code: [Select]

    for (int i=1; i < 17; i++) {
      Trama [i] = Serial.read();


Si dices que tú lo habías corregido se me ocurre que podría ser que se lo come la web por poner el código como "quote". Pon siempre los códigos como "code". Si es así mis disculpas.
http://cuadricopterodiyarduino.blogspot.com/

sergimk

Pues si creo que es eso porque en el código que tengo en el programa de arduino esta todo bien.
Ahora miraré haber que es lo que pasa que no funciona y si lo puedo solucionar.
Por cierto este código debería funcionar para la segunda y tercera versión que subiste a tu blog no?

Cheyenne

No entiendo muy bien a qué te refieres. ¿Qué código debería funcionar con cuál?
http://cuadricopterodiyarduino.blogspot.com/

sergimk

me refiero a que este codigo:
Quote
#include <Servo.h>

Servo servo;

unsigned long TiempoControl1 = 0;
unsigned long TiempoControl2 = 0;

byte Trama[17];
boolean Error9DOF = false;
boolean Signoroll = true;
boolean Signopitch = true;
boolean Signoyaw = true;
int roll = 0;
int pitch = 0;
int yaw = 0;
boolean SignoAccelX = true;
boolean SignoAccelY = true;
boolean SignoAccelZ = true;
int AccelX = 0;
int AccelY = 0;
int AccelZ = 0;

int val = 0;

void setup() {

  Serial.begin(57600);
  servo.attach(9);

}

void loop() {

  if (Serial.available() > 16) {
   
   
while (Serial.available() > 16) {
  Trama[0] = Serial.read();

  if (Trama[0] = '!' && Serial.available() > 15) {
   
    for (int i=1; i < 17; i++) {
      Trama = Serial.read();
    }
   
  if (Trama[15] == '\r' && Trama[16] == '\n') {
    Error9DOF = false;
  }
  else {
    Error9DOF = true;
  }
 
  }

}

 
  if (Error9DOF == false)
 
 
  if (Trama[1] == 111 || Trama[1] == 101 || Trama[1] == 11 || Trama[1] == 1 ) {
    Signoyaw = true;
  }
  else {
    Signoyaw =false;
  }
 
 
  if (Signoyaw == true) {
    yaw = word(Trama[6],Trama[7]);
  }
  else {
    yaw = - word(Trama[6],Trama[7]);
  }
  }

val = map (yaw, 0, 18000, 0, 180);
servo.write (val);
delay (15);
}


deberia funcionar con el código para el 9DOf que subiste a tu blog pero no se si para la segunda o tercera version

Cheyenne

Si estabas funcionando el Razor con el código de la entrada 1 no te lo recomiendo. Ponle el código de la entrada 2.

El código para el Razor de la entrada 3 no te funcionará con tu código ya que como indico en el blog está modificado para que envíe por el puerto serie los datos sólo cuando recibe la petición por el mismo puerto.
http://cuadricopterodiyarduino.blogspot.com/

sergimk

he intentado mirar los datos que se imprime en el monitor seire, y no me funciona :smiley-eek:
no acabo de entender que ha ocurrido los programas los he vuelto a descargar de tu blog y sigue sin funcionar, e probado a leer los datos directamente del razor utilizando este programa : https://code.google.com/p/sf9domahrs/ y esto si que lo he conseguido, de manera que he deducido que el razor funciona y se que el arduino tambien por ello no entiendo porque ha dejado de funcionar

Cheyenne

Cuando tienes funcionando el Razor y el Arduino te en cuenta que el puerto serie está conectado entre los dos por lo que en principio no puedes ver nada en la consola. Yo lo que hago es conectar la transmisión del Razor a la recepción del Arduino y la transmisión del Arduino al FTDI que de ahí va al ordenador y a la consola.
En las versiones que se establece petición, al necesitar comunicación bidireccional entre Razor y Arduino, la comunicación de Arduino hacia la consola la hice habilitando un puerto virtual con SoftwareSerial.
http://cuadricopterodiyarduino.blogspot.com/

Go Up