Pages: 1 [2]   Go Down
Author Topic: Ayuda con 9DOF  (Read 2701 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
#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.
« Last Edit: October 11, 2013, 02:06:44 pm by Cheyenne » Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Has vuelto a poner

Trama = Serial.read();

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

No entiendo  smiley-confuse 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  smiley-confuse

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).
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ... 
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

y debería ser

Code:
    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.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No entiendo muy bien a qué te refieres. ¿Qué código debería funcionar con cuál?
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
God Member
*****
Karma: 7
Posts: 635
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Pages: 1 [2]   Go Up
Jump to: