proyecto coche 4x4 con brazo robot.

Resolvamos esos temas en los hilos abiertos y demosle solución como corresponde.
NO hace falta dar quote a algo que se lee en el mismo hilo. SI me respondes un serie de cosas o una frase si.

Perfecto.
Hoy por fin(gracias a las navidades y la gestión de correos ha llegado Bastante tarde) ha llegado mi paquete con cables a casa.
Hoy he dejado medió terminada la conexión, me quedan conectar unos pocos cables más.
Mañana espero dejarlo listo, hacer una gráfica con las conexiones, y ya empezaría a programar(que la verdad que es lo que más pereza me da, la parte electrónica y de montaje me apasiona más jeje)
Un saludo,

Buenos días,
Tengo el proyecto un poco abandonado...
Os comento un poquito.
El robot está completamente montado, aunque de momento solo se encienden los leds de luz delantera y luz trasera.

Hoy toca empezar con la APP para android, la cual la voy ha hacer mediante APP inventor.

En principio tenía en mente hacer el programa mediante sliders para poder manipular el brazo robot, pero en este tutorial de youtube veo que lo hacen mediante botónes y parece que funciona correctamente. os dejo los 3 links del proyecto de youtube.

video 1, la aplicación para android:

video 2, La programación:

video 3, Montaje y funcionamiento:

Por último os dejo el codigo que han utilizado para hacer funcionar el brazo:

#include <Servo.h>

char dato;
Servo hombro, codo, muneca, pinzas, base;
int phombro, pcodo, pmuneca, ppinzas, pbase, contador=0;

void setup()
{
  hombro.attach(13);
  codo.attach(12);
  muneca.attach(11);
  pinzas.attach(10);
  base.attach(9);
  Serial.begin(9600);
}

void loop()
{
  if(contador==0)
  {
    // Leer posicion inicial
    phombro=hombro.read();
    pcodo=codo.read();
    pmuneca=muneca.read();
    ppinzas=pinzas.read();
    pbase=base.read();
    
    //Escribir posicion inicial
    hombro.write(phombro);
    codo.write(pcodo);
    muneca.write(pmuneca);
    pinzas.write(ppinzas);
    base.write(pbase);
    contador++;
  }
  dato='x';
  dato=Serial.read();
  switch(dato)
  {
    case 'A': //HOMBRO DERECHA
    {
       while(Serial.read()!='x')
       {
          if(phombro>=175)
              phombro=175;
          if(phombro<=180 && phombro>=0)
          {
            
            phombro++;
            hombro.write(phombro);
            delay(15);
          }
       }
      break;  
    }
    
    case 'a': //HOMBRO IZQUIERDA
    {
       while(Serial.read()!='x')
       {
         if(phombro<=5)
              phombro=5; 
         if(phombro<=180 && phombro>=0)
          {
            phombro--;
            hombro.write(phombro);
            delay(15);
          }
      }
      break;  
    }
    case 'C': //CODO ARRIBA
    {
         if(pcodo>=175)
              pcodo=175;
        while(Serial.read()!='x')
        {
          if(pcodo<=180 && pcodo>=0)
          {
            pcodo++;
            codo.write(pcodo);
            delay(15);
          }
        }
      break;   
    }
    case 'c': //CODO ABAJO
    {
       if(pcodo<=5)
              pcodo=5;
       while(Serial.read()!='x')
       {
          if(pcodo<=180 && pcodo>=0)
          {
            pcodo--;
            codo.write(pcodo);
            delay(15);
          }
       }
      break;   
    }
    case 'I': //MUÑECA ARRIBA
    {
      if(pmuneca>=170)
          pmuneca=170; 
      while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            pmuneca++;
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break;      
    }
    case 'i': //MUÑECA ABAJO
    {
        if(pmuneca<=10)
              pmuneca=10;
       while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            pmuneca--;
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break; 
    }
    case 'P': //PINZA ABRIR
    {
      if(ppinzas>=165)
          ppinzas=165; 
      while(Serial.read()!='x')
       {
           if(ppinzas<=180 && ppinzas>=0)
          {
            ppinzas++;
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break; 
    }
    case 'p': //PINZA CERRAR
    {
        if(ppinzas<=15)
              ppinzas=15;      
       while(Serial.read()!='x')
       {
          if(ppinzas<=180 && ppinzas>=0)
          {
            ppinzas--;
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break; 
    }
    case 'B': //BASE IZQUIERDA
    {  if(pbase>=175)
          pbase=175;
       while(Serial.read()!='x')
       {
           if(pbase<=180 && pbase>=0)
          {
            pbase++;
            base.write(pbase);
            delay(15);
          }
       }
      break; 
    }
    case 'b': //BASE DERECHA
    {
        if(pbase<=5)
              pbase=5; 
       while(Serial.read()!='x')
       {
          if(pbase<=180 && pbase>=0)
          {
            pbase--;
            base.write(pbase);
            delay(15);
          }
       }
      break; 
    }
  }
}

Mi pregunta es la siguiente:

Hago el metodo de estos chicos y hago que se mameje el brazo mediante botones o utilizo un slider?

visualmente para la APP me parece bastante más bonito mediante botones que mediante sliders.

Que inconvenientes tienen los botones?

Un saludo

Buenas tardes,
Al final lo he hecho con botones.
Al pulsar el botón se envía un caracter en mayusculas, para dar la orden de movimiento.
Para detener el movimiento basta con soltar el botón, la APP enviará el mismo valor en minuscula indicando que detenga el movimiento, os dejo un par de fotos de como lo he hecho:

veremos como progresa el asunto.

Un saludo.

Buenas tardes,
ya hemos echo las primeras pruebas con el brazo robot y la APP.
He detectado un problema.
Cuando un servo alcanza su recorrido final, no me permite volver ha utlizar ese servo, queda desactivado hasta que desenchufo la alimentación del arduino y vuelvo ha alimentarlo.
El codigo que he utlilizado es el siguiente:

include <Servo.h>

char dato;
Servo hombro, codo, muneca, pinzas, base, postbase;
int phombro, pcodo, pmuneca, ppinzas, pbase,ppostbase, contador=0;

void setup()
{
  hombro.attach(13);
  codo.attach(12);
  muneca.attach(11);
  pinzas.attach(10);
  base.attach(9);
  postbase.attach(8);
  Serial.begin(9600);
}

void loop()
{
  if(contador==0)
  {
    // Leer posicion inicial
    phombro=hombro.read();
    pcodo=codo.read();
    pmuneca=muneca.read();
    ppinzas=pinzas.read();
    pbase=base.read();
    ppostbase=base.read();
    
    //Escribir posicion inicial
    hombro.write(phombro);
    codo.write(pcodo);
    muneca.write(pmuneca);
    pinzas.write(ppinzas);
    base.write(pbase);
    postbase.write(ppostbase);
    contador++;
  }
  dato='x';
  dato=Serial.read();
  switch(dato)
  {
    case 'I': //HOMBRO SUBIR
    {
       while(Serial.read()!='x')
       {
          if(phombro>=175)
              phombro=175;
          if(phombro<=180 && phombro>=0)
          {
            
            phombro++;
            hombro.write(phombro);
            delay(15);
          }
       }
      break;  
    }
    
    case 'J': //HOMBRO BAJAR
    {
       while(Serial.read()!='x')
       {
         if(phombro<=5)
              phombro=5; 
         if(phombro<=180 && phombro>=0)
          {
            phombro--;
            hombro.write(phombro);
            delay(15);
          }
      }
      break;  
    }
    case 'K': //CODO ARRIBA
    {
         if(pcodo>=175)
              pcodo=175;
        while(Serial.read()!='x')
        {
          if(pcodo<=180 && pcodo>=0)
          {
            pcodo++;
            codo.write(pcodo);
            delay(15);
          }
        }
      break;   
    }
    case 'L': //CODO ABAJO
    {
       if(pcodo<=5)
              pcodo=5;
       while(Serial.read()!='x')
       {
          if(pcodo<=180 && pcodo>=0)
          {
            pcodo--;
            codo.write(pcodo);
            delay(15);
          }
       }
      break;   
    }
    case 'M': //MUÑECA IZQUIERDA
    {
      if(pmuneca>=170)
          pmuneca=170; 
      while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            pmuneca++;
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break;      
    }
    case 'N': //MUÑECA DERECHA
    {
        if(pmuneca<=10)
              pmuneca=10;
       while(Serial.read()!='x')
       {
          if(pmuneca<=180 && pmuneca>=0)
          {
            pmuneca--;
            muneca.write(pmuneca);
            delay(15);
          }
       }
      break; 
    }
    case 'O': //PINZA ABRIR
    {
      if(ppinzas>=165)
          ppinzas=165; 
      while(Serial.read()!='x')
       {
           if(ppinzas<=180 && ppinzas>=0)
          {
            ppinzas++;
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break; 
    }
    case 'P': //PINZA CERRAR
    {
        if(ppinzas<=15)
              ppinzas=15;      
       while(Serial.read()!='x')
       {
          if(ppinzas<=180 && ppinzas>=0)
          {
            ppinzas--;
            pinzas.write(ppinzas);
            delay(15);
          }
       }
      break; 
    }
    case 'E': //BASE IZQUIERDA
    {  if(pbase>=175)
          pbase=175;
       while(Serial.read()!='x')
       {
           if(pbase<=180 && pbase>=0)
          {
            pbase++;
            base.write(pbase);
            delay(15);
          }
       }
      break; 
    }
    case 'F': //BASE DERECHA
    {
        if(pbase<=5)
              pbase=5; 
       while(Serial.read()!='x')
       {
          if(pbase<=180 && pbase>=0)
          {
            pbase--;
            base.write(pbase);
            delay(15);
          }
       }
      break; 
    }
    case 'G': //POSTBASE SUBIR
    {  if(ppostbase>=175)
          ppostbase=175;
       while(Serial.read()!='x')
       {
           if(ppostbase<=180 && ppostbase>=0)
          {
            ppostbase++;
            postbase.write(ppostbase);
            delay(15);
          }
       }
      break; 
    }
    case 'H': //POSTBASE BAJAR
    {
        if(ppostbase<=5)
              ppostbase=5; 
       while(Serial.read()!='x')
       {
          if(ppostbase<=180 && ppostbase>=0)
          {
            ppostbase--;
            postbase.write(ppostbase);
            delay(15);
          }
       }
      break; 
    }
  }
}

practicamente está copiado tal cual de internet salvo por que le he añadido un servo más y he modificado 4 cositas...

es normal esto que me pasa?

un saludo.

Buenas tardes,
llevo una temporada bastante liado y no he podido dedicar ni un solo segundo al arduino.
Este fin de semana quiero volver ha meterle mano.
A alguien se le ocurre que es lo que le puede estar pasando a mi robot?
no sé por donde empezar, no tengo claro si el problema reside en el sketch o reside en la propia APP y desde ahí me está fallando todo....

Alguna sugerencia de por donde debería empezar a revisar el problema que tengo?

un saludo.

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

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

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:

 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.

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.

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

surbyte:
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

surbyte:
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

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.

Hola.
Yo, basándome en lo que dices anteriormente:

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.

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.

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

/* 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

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

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.

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

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

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

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