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