Go Down

Topic: proyecto coche 4x4 con brazo robot.  (Read 5022 times) previous topic - next topic

aitorGTI

Buenas tardes,

Sigo investigando acerca de mi problema con el robot, es posible que el problema resida en el bluetooth que se me bloquea? (Es la única explicación lógica que se me ocurre ahora mismo)
Quizá sería más efectivo hacerlo mediante wifi?

Un saludo

aitorGTI

Buenos días,
tras muchos quebraderos de cabeza y no saber por donde actuar,
finalmente me he decantado por rehacer mi APP y hacerla mediante sliders como habiamos comentado inicialmente.
el resultado de la app es el siguiente:


Ahora me pondré con el sketch.

Otro de mis mayores problemas era hacer parpaderar de forma continua un Led, finalmente lo haremos con un circuito independiente y no mediante el propio arduino.

ire actualizando a medida que vaya progresando.
No tengo demasiado tiempo libre y la cosa va muy pero que muy lenta.

un saludo..

aitorGTI

Buenos días,

hacía mucho tiempo que no tocaba este proyecto.
Por fin lo he retomado y vamos a ir por partes. primero haremos que funcione lo más simple que es la funcion del coche, que giren las ruedas, pero me ha surgido un problema:
utilizando el siguiente scketck:
Code: [Select]

 int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;
int vel = 255; // Velocidad de los motores (0-255)
int estado = 'g'; // inicia detenido

void setup() {
Serial.begin(9600); // inicia el puerto serial para comunicacion con el Bluetooth
pinMode(derA, OUTPUT);
pinMode(derB, OUTPUT);
pinMode(izqA, OUTPUT);
pinMode(izqB, OUTPUT);
}

void loop() {

if(Serial.available()>0){ // lee el bluetooth y almacena en estado
estado = Serial.read();
}
if(estado=='G'){ // Forward
Serial.println(estado);
analogWrite(derB, vel);
analogWrite(izqB, 0);
analogWrite(izqA, vel);
analogWrite(derA, 0);
}
if(estado=='J'){ // right
Serial.println(estado);
analogWrite(derB, vel);
analogWrite(izqB, vel);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
if(estado=='K'){ // Stop
Serial.println(estado);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
}
if(estado=='I'){ // left
Serial.println(estado);
analogWrite(derB, 0);
analogWrite(izqB, 0);
analogWrite(izqA, vel);
analogWrite(derA, vel);
}

if(estado=='H'){ // Reverse
Serial.println(estado);
analogWrite(derB, 0);
analogWrite(izqB, vel);
analogWrite(izqA, 0);
analogWrite(derA, vel);
}
if (estado =='f'){ // Boton ON se mueve sensando distancia

}
if (estado=='g'){ // Boton OFF, detiene los motores no hace nada
}
}


el skecth lo he sacado de internet y la aplicación para el movíl tambén.
primero probé con la misma app que el que hizó el scketch pero la aplicación a los pocos segundos se bloqueaba y el coche dejaba de responder.

al principio creia que el probloema podría residir en la propia app, por lo que me hicé mi propia app desde el app inventor.
Después de hacer la prueba el problema persiste, a los pocos segundos la app se bloquea y el coche deja de responder.
Creo que el problema está en que la señal bluetooth se pierde y deja de conectar el movil con el coche.
El problema podría ser que utilizo un modulo HC-05 en vez de el mítico HC-06?

Un saludo.

surbyte

Ese sketch no puede bloquearse, eso ya te lo aseguro.

Respecto de la app no se que decirte porque no esta.

Si luego hablas de que usas un sensor HC-05  no pones el sketch que lo utiliza entonces para que posteas el código anterior?

Si se pierde el enlace considera entonces informarlo de algún modo en el Arduino, con un led, o bien haciendo que la aplicación envíe algo de manera continua. Supongamos que la aplicación envie siempre el estado del contador digamos cada 500 mseg por sugerir algo. Si no recibes ese cambio de contador en 500 mseg en el arduino, lo informas via el LED y eso te servirá para comprender que pasa.

Ahora has leido sobre el alcance de BT? Tomate un tiempo e investiga si estas o no en rango cuando ocurre lo que comentas.
 

aitorGTI

Buenas noches surbyte,
gracias por tu respuesta.
vamos por partes.

Si luego hablas de que usas un sensor HC-05  no pones el sketch que lo utiliza entonces para que posteas el código anterior?
no entiendo esta pregunta...

el código que estoy planteando es el que utilizo con el HC-05


Si se pierde el enlace considera entonces informarlo de algún modo en el Arduino, con un led, o bien haciendo que la aplicación envíe algo de manera continua. Supongamos que la aplicación envie siempre el estado del contador digamos cada 500 mseg por sugerir algo. Si no recibes ese cambio de contador en 500 mseg en el arduino, lo informas via el LED y eso te servirá para comprender que pasa.

Ahora has leido sobre el alcance de BT? Tomate un tiempo e investiga si estas o no en rango cuando ocurre lo que comentas.
 
Pondré un led que esté encendido mientras la conexión esté activa. Investigaré un poco, así podré introducir un código que me avise mediante el led si se pierde la conexión.
respecto al rango, no me he alejado más de 2 metros el emisor y el receptor....


Nuevamente muchas gracias por tu respuesta.

un saludo

surbyte

#20
Dec 08, 2017, 10:16 pm Last Edit: Dec 08, 2017, 10:16 pm by surbyte
Code: [Select]
no entiendo esta pregunta...

el código que estoy planteando es el que utilizo con el HC-05

No me di cuenta que la parte del SoftwareSerial involucraba el HC-05.
Disculpa!!!

Tienes que armar un timer desde la APP que envie a intervalos regulares un contador por ejemplo o un flag.
Ese contador o flag será leido del mismo modo en el arduino y si no cambia es porque enlace roto

Si usas APP Inventor es fácil.

noter

#21
Dec 08, 2017, 10:57 pm Last Edit: Dec 08, 2017, 10:58 pm by noter
Hola.
Yo, basándome en lo que dices anteriormente:
Quote
Después de hacer la prueba el problema persiste, a los pocos segundos la app se bloquea y el coche deja de responder.
Creo que tienes un problema en la propia app, pues la comunicación es unidireccional, al menos en lo que al programa de arduino se desprende.
Me decanto por que tu app está enviando datos con demasiada frecuencia, llenando el buffer de transmisión.
No conozco el app inventor, pero te diría que intentes que tu aplicación sólo envíe datos a intervalo regular, como te decía surbyte (por ejemplo cada 200 ms), y de inmediato si cambia el estado de los mandos.

surbyte

APP Inventor envia cuando presiona, pero si mantiene presionado es posible que haga lo que dice Noter, no lo había pensado pero tiene lógica tu argumento.

En todo caso habría que cambiar del lado arduino que si envia tanto que ignore todo lo que sea igual y listo.

Mirando el código APP Inventor, veo que se envia la letra mayúscula cuando esta presionado y la minúscula cuando se suelta, supongo que una vez.
Pero si se mantiene presionado entonces envia siempre? Verifica con un Serial.print que muestre por monitor Serie.

aitorGTI

Buenos días,
gracias por vuestra respuesta. 

Estoy pensando, que si es problema de la aplicación, que envía demasiados datos, podríamos solucinarlo con una función antirebote similar a esta no?:
Code: [Select]
/* Practica 6 - Función antirebote
 Funcion antirebote para leer correctamente
 el estado del boton */

const int boton= 4;            // boton conectado al pin 4
const int tiempoAntirebote =10;

int cuenta =0;          //Guarda el numero de veces que el boton ha sido presionado
int estadoBoton;
int estadoBotonAnterior;

/*Función antirebote*/
boolean antirebote  (int pin ) {
  int  contador =0;
  boolean estado;            // guarda el estado del boton
  boolean estadoAnterior;    // guarda el ultimo estado del boton

  do {
    estado = digitalRead (pin);
    if (estado != estadoAnterior ){  // comparamos el estado actual
      contador = 0;                   // reiniciamos el contador
      estadoAnterior = estado;
    }
    else{
      contador = contador +1;       // aumentamos el contador en 1
    }
    delay (1);
  }
  while (contador < tiempoAntirebote);
  return estado;
}

void setup (){                     
  Serial.begin(9600);   //Iniciamos la comunicacion serial
  pinMode(boton,INPUT); //declaramos el boton como entrada
}

void loop () {
  estadoBoton =digitalRead (boton);              //leemos el estado del boton
  if (estadoBoton  != estadoBotonAnterior) {     //si hay cambio con respeto al estado
    if (antirebote (boton)){                    //checamos  si esta preionado y si lo esta
      cuenta++;                                //aumentamos la cuenta
      Serial.println (cuenta);       
    }
  }
  estadoBotonAnterior = estadoBoton;      // guardamos el estado del boton
}



un saludo

surbyte

#24
Dec 09, 2017, 04:05 pm Last Edit: Dec 09, 2017, 05:23 pm by surbyte
Estas usando APP Inventor no C++ ni JAVA ni otra cosa. Es una programación gráfica.
Yo creo que debes hacer lo que te dije. Olvida los motores  monitorea en el arduino que recibe y cuantas veces lo hace.

Investigué el tema y es APP Inventor que no para.
Pero tienes esta opción que si

No hay mucha mas información de un comentario en un foro de APP Inventor pero dejo el link

Siguiendo la idea aportada por Taifun, he probado cambiando el aspecto del botón.



el efecto  es el siguiente:

Botón sin pulsar




Mientras se pulsa el botón



Cuando se suelta


aitorGTI

#25
Dec 09, 2017, 04:45 pm Last Edit: Dec 09, 2017, 04:51 pm by aitorGTI
Estas usando APP Inventor no C++ ni JAVA ni otra cosa. Es una programación gráfica.
Yo creo que debes hacer lo que te dije. Olvida los motores  monitorea en el arduino que recibe y cuantas veces lo hace.
perfecto.
probaremos a ver que pasa cuando pulso el botón, a ver que nos dice al monitorearlo.
de todas formas, lo de la función anti rebote era para implementarla en el propio scketch del arduino, no en la app...

por otro lado... hace poco adquirí un modulo wifi, crees que será mejor utilizar este? o se comportará igual que el modulo bluethoot? en cuanto alcance, el modulo wifi si que tendrá mejor alcance, pero no necesito un largo alcance ya que es para utilizarlo en distancias cortas...
me refiero a mejor  respuesta en cuanto a velocidad y que no se me quede "colgado" como el modulo bluetooth.


muchisimas gracias por tu respuesta.
un saludo

aitorGTI

Surbyte, no había leído el link que habías dejado.
Este fin de semana lo probaré y veremos si funciona... si lo hace bien también debería de operar correctamente el brazo, ya que tenía el mismo problema.
Os voy manteniendo informados
Muchísimas gracias.
Un saludo

aitorGTI

Buenas tardes,
he monitorizado lo que ocurre cuando pulso un botón de la aplicación y resulta que empieza ha recibir datos sin parar incluso después de soltar el botón de la app....

por lo tanto procederemos ha realizar lo que me has comentado surbyte.

un saludo y felices fiestas

aitorGTI

#28
Dec 23, 2017, 04:45 pm Last Edit: Dec 23, 2017, 04:51 pm by aitorGTI
Buenas tardes,
he vuelto ha hacer una app nuevamente para comprobar los resultados y sigue fallando de la misma forma.
esta es la app que he hecho en la web:





Como podéis ver, al pulsar botón envía dato, pero cuando soltamos el botón no envía nada... aún así, cuando presionas el botón envía y al monitorizarlo, veo que sigue haciendo lo mismo que me hacía hasta ahora...

empiezo a desesperarme jeje

se os ocurre que es lo que estoy haciendo mal???


un saludo

surbyte

#29
Dec 23, 2017, 06:39 pm Last Edit: Dec 23, 2017, 06:42 pm by surbyte
Ya vi cual es el problema.
Mira la variable estado que defines como global!!
Como esta definida como global al recibir un valor via BT, se queda siempre con ese valor hasta recibir otro.
Deberías ponerla a 0 una vez ejecutada la orden.

Code: [Select]
estado = "";

te dejo el código

Code: [Select]
int izqA = 5;
int izqB = 6;
int derA = 9;
int derB = 10;
int vel = 255; // Velocidad de los motores (0-255)
int estado = 'g'; // inicia detenido

void setup() {
Serial.begin(9600); // inicia el puerto serial para comunicacion con el Bluetooth
pinMode(derA, OUTPUT);
pinMode(derB, OUTPUT);
pinMode(izqA, OUTPUT);
pinMode(izqB, OUTPUT);
}

void loop() {

  if (Serial.available()>0){ // lee el bluetooth y almacena en estado
      estado = Serial.read();
  }
  if (estado=='G'){ // Forward
      Serial.println(estado);
      analogWrite(derB, vel);
      analogWrite(izqB, 0);
      analogWrite(izqA, vel);
      analogWrite(derA, 0);
  }
 
  if (estado=='J'){ // right
      Serial.println(estado);
      analogWrite(derB, vel);
      analogWrite(izqB, vel);
      analogWrite(derA, 0);
      analogWrite(izqA, 0);
  }
 
  if (estado=='K'){ // Stop
      Serial.println(estado);
      analogWrite(derB, 0);
      analogWrite(izqB, 0);
      analogWrite(derA, 0);
      analogWrite(izqA, 0);
  }
 
  if (estado=='I'){ // left
      Serial.println(estado);
      analogWrite(derB, 0);
      analogWrite(izqB, 0);
      analogWrite(izqA, vel);
      analogWrite(derA, vel);
  }

  if (estado=='H'){ // Reverse
      Serial.println(estado);
      analogWrite(derB, 0);
      analogWrite(izqB, vel);
      analogWrite(izqA, 0);
      analogWrite(derA, vel);
  }
 
  if (estado =='f'){ // Boton ON se mueve sensando distancia

  }
 
  if (estado=='g'){ // Boton OFF, detiene los motores no hace nada
  }
  estado = "";
}

Go Up