Datos personales

Mi foto
Algun dia, las maquinas también tendrán sueños...

viernes, 26 de febrero de 2016

Robot Balancin VI: Bluetooth y Desplazamiento

Aunque para algunos el hecho de mantener un robot en vertical sin caerse será suficiente, otros desearán hacer algo un poco más complejo, mantener el equilibrio y desplazar al mismo tiempo el robot no es tarea fácil, hay que considerar que el ajuste del control PID deberá ser lo suficiente estable y fino para lograr esto, ya que me es imposible decirles el valor exacto de sus variables PID es necesario que ustedes encuentren dichos valores con la ya clásica prueba y error y siguiendo las recomendaciones que hice en la publicación anterior, asumiendo que su robot tenga una estabilidad razonable podría considerar agregar un receptor Bluetooth para enviar y recibir datos y con ello modificar la dirección de desplazamiento del robot, ademas, la adición del módulo hace más fácil ajustar el PID, el módulo que utilizaremos será el ya bien conocido HC-05(funciona también el HC-06), un modulo muy economico y facil de usar, la coneccion es la siguiente:


Ajustando el PID con ayuda del módulo Bluetooth.



Aunque pueden ajustar estos valores (PID) "manualmente" es decir, escribiendo en el IDE y cargando el código cada vez que requieran cambiar las variables, eso es muy tediosos y pueden tomarse literalmente semanas en terminar de ajustarlo de esa forma, una forma más fácil de hacerlo es valiéndonos de la comunicación serial que el módulo bluetooth nos ofrece. En el código fuente podrán observar la sección comentada que use para calibrar estos valores, para ello usaremos la aplicación gratuita BlueTerm para enviar caracteres del celular vía bluetooth al módulo, ademas BlueTerm nos permite usar nuestro celular como monitor serial, por lo que podrán imprimir datos con la sentencia Serial.print ejemplo:

Serial.print("K_p: "); Serial.print(K_p); Serial.print("\n");

y así visualizar el cambio de la variable desde su celular en tiempo real, ahora examinemos un poco más el código.

 if(estado=='1'){
      K_p = (K_p)+0.01;
     }
 if(estado=='2'){
      K_p = (K_p)-0.01;
     }

Para ajustar el valor K_p enviamos el carácter "1" vía bluetooth al módulo, el programa comenzará a aumentar la variable en cada bucle una fracción de 0.01 por bucle (recordar que un bucle dura unos cuantos microsegundos), por lo tanto el valor de K_p irá en aumento a una velocidad constante, para disminuir el valor usaremos el carácter "2" y para detenerlo bastará con presionar cualquier otro carácter que no esté en uso, el mismo proceso se repite para las variables K_i, K_d y delaytime, en el caso de delaytime y K_d que son más sensibles, habrá que hacerlo con más lentitud agregando en la suma una fracción inferior

if(estado=='5'){
      delaytime = (delaytime)+0.001;
     }
  if(estado=='6'){
      delaytime = (delaytime)-0.001;

nota: por alguna extraña razón mi código no incluye estas líneas para ajustar el K_d, no sé por qué las borre, aun así ustedes pueden agregarlas, los caracteres que use pueden ser cambiados a placer por el lector si así lo desean


 if(estado=='7'){
      K_d = (K_d)+0.0001;
     }
 if(estado=='8'){
      K_d = (K_d)-0.0001;
     }

Desplazamiento
Lo único que hay que considerar para el desplazamiento del robot son las variables AceleracionA y
DireccionA, ambas variables deben establecerse en un valor de 1500, si modificamos los valores de dichas variables el filtro de dirección cambiará los rangos PWM provocando que el robot gire sobre su propio eje o avance hacia en frente o hacia atrás, si el valor de AceleracionA es superior a 1500 el robot se desplazará hacia adelante, si es menor a 1500 se desplazará hacia atrás, si el valor de DireccionA es superior a 1500 el robot girará sobre su propio eje, si es menor a 1500 girará hacia la dirección contraria, mientras el valor este mas alejado de 1500 en ambas variables, mas agresivo sera el desplazamiento del robot por lo tanto la probabilidad de desestabilizarlo será mayor, sabiendo esto, es posible modificar ambas variables para dar  vueltas mas o menos cerradas, en mi caso lo único que hago es moverlo hacia los lados o sobre su eje con las siguientes líneas:

 if(estado=='s'){                     //adelante
       AceleracionA=1750;
      }
     if(estado=='w'){                //atras
      AceleracionA=1200;
      } 
   
    if(estado=='d'){                 //lado1(gira sobre su eje)
      DireccionA=1250;
     }
     
    if(estado=='a'){                    //lado2(gira hacia el lado contrario)
      DireccionA=1750;
     }

    if(estado=='z'){                  //detener
    AceleracionA=1500;
    DireccionA=1500;
   }

Pueden probar movimientos mas complejos como este:

if(estado=='q'){                     //vuelta
      AceleracionA=1200;
      DireccionA=1700;
     }

 if(estado=='e'){                   //vuelta2
      AceleracionA=1200;
      DireccionA=1300;
     }

Por ultimo, seria factible y completamente opcional desarrollar una app con MIT AppInventor más compleja y con una interfaz personalizada, eso quedara a consideración del lector.
La app que yo desarrolle es bastante simple pero por supuesto pueden usarla, les dejo el link

 nos vemos!




1 comentario:

  1. Gracias bro, estudio ing mecatronica y en mi materia de control tengo este proyecto, tus post serán de gran ayuda, una nota extra que me puedas compartir antes de empezar el proyecto comprando materiales y esas cosas??

    ResponderEliminar