El control del robot, es una combinación de la aplicación del control Proporcional Integral Derivativo (PID) y el uso oportuno de la capacidad de frenar que nos brinda el Driver TB6612FNG.
Antes de continuar con la publicación del código, esbocemos algunos conceptos importantes para el control de robots velocistas.
1. ¿Qué es el Control PID?
Un PID es un mecanismo de control por realimentación que calcula la desviación o error entre un valor medido y el valor que se quiere obtener, para aplicar una acción correctora que ajuste el proceso. (http://es.wikipedia.org/wiki/Proporcional_integral_derivativo)
La explicación del uso de sus parámetros se basa en:
- Proporcional: La proporcional tiene que ver con el error directo, es la respuesta que se tiene que entregar de manera inmediata.
- Integral: La integral tiene como propósito el disminuir y eliminar el error en estado estacionario provocado por el modo proporcional.
- Derivativo: La función de la acción derivativa es mantener el error al mínimo corrigiendo proporcionalmente con la misma velocidad que se produce, de esta manera evita que el error se incremente.
2. ¿Y como se aplica esté en robots velocistas?
La mayaría de los robots velocistas usan tracción diferencial, es decir varían la velocidad de alguna de las dos ruedas para conseguir un giro hacia un determinado lado, de allí la importancia del uso del Control PID, esté nos permite obtener un valor apropiado para asignarle al PWM de los motores según el estado del robot sobre la línea, aplicando un correctivo necesario en su dirección de desplazamiento para que esté no se salga de la línea.
Para velocistas la "Integral" de este control no se utiliza porque tiene que ver con errores acumulativos ocasionados por estados estacionarios, es decir cuando el robot esta totalmente detenido o en movimiento con velocidad constante. Debido a que a lo largo de la trayectoria en su recorrido por la pista se esta acelerando y desacelerando, el robot experimenta cambios dinámicos que imposibilitan el uso de este parámetro haciéndolo tender a 0. (es decir no lo usaremos).
Nota: En muchos caso se le llama Control PD
3. Frenos y su Importancia
Los frenos son sin duda alguna muy importantes cuando se trata de obtener un mayor control en los robots velocistas, nos permiten tener una segunda opción cuando nos salimos del rango de visión que nos muestran los sensores infrarrojos (estos eventos tienen mucha probabilidad de ocurrir en curvas obtusas o de 90°, haciendo de verdad muy difícil el control sin la opción de los frenos).
Cuando se aplican, es necesario tomar en cuenta que debemos hacerlo dándole dirección a la inercia que ocasiona el frenado hacia la toma correcta de la curva, para ello debemos frenar la rueda interna y liberar la rueda externa.
Nota: El frenado del robot Lenin, se hace de manera acumulativa usando una espera de un microsegundo, liberándose una vez que vuelve a la línea.
Recomiendo la publicación de Robot Zero en el año 2012
(http://webdelcire.com/wordpress/archives/1330)
La libreria QTRSensors.h la puede descargar de este lugar.
La libreria QTRSensors.h la puede descargar de este lugar.
NOTA: Este código puede no funcionar en tu robot velocista. Recuerda que debes modificar los pines de dirección, sensores, etc. También los valores de P, D y la potencia aplicada a los motores varían según el peso y su distribución, el centro de masa, la potencia de los motores, el largo y ancho, la distancia entre las ruedas, el alto de los ejes, la vibración generada por los motores, la rigidez de la parte delantera (cabeceo de los sensores). Incluso debes modificar estos valores dependiendo del tipo de pista en el que corra el robot.
El código funcional lo pueden conseguir por acá:
https://github.com/abrahamjoc/robot-lenin
El código funcional lo pueden conseguir por acá:
https://github.com/abrahamjoc/robot-lenin
muy buen proyecto. quiero aplicar el mismo controlador para un robot con cabeza móvil. Seria un control de posición (angulo ),y tengo 4 sensores, por favor si me podridas guiar un poco
ResponderEliminarEl algoritmo no variaría mucho. El giro de la cabeza móvil se puede tomar como un error secundario que se le suma al pid
Eliminarme pueden ayudar con el codigo ya que lo ejecuto y dice problemas y casi no se programar en arduino
ResponderEliminarQue tal! Buen proyecto. Oye como estuviste el valor de Rangebrake? Espero me puedas responder mi pregunta gracias! Saludos.
ResponderEliminarEso depende mucho del tipo de robot (peso, tamaño, etc) No hay un método establecido, solo intenta intenta e intenta hasta que consigas uno que te funcione
EliminarComo funciona el comando max?
ResponderEliminarEs una variable
Eliminarhola. muchas gracias por el programa. mi pregunta es sobre la ubicacion de los sensores. en el robot lenin sobre la linea negra entra un solo sensor o dos? espero puedas responderme. gracias
ResponderEliminarhola.amigo buen proyecto.tengo una pregunta veo q usas un sensor qtr analógico ¿se puede usar uno digital para la misma funcion?
ResponderEliminarHola. El digital te dará muy poco rango de lecturas. Este código está hecho para el sensor analógico y funcionaria muy mal en uno digital
EliminarAMIGO QUE SIGNIFICA, O QUE HACE "STANDBY
Eliminar"
amigo felicidades esta bien el robot.. olles no me podrias ayudar para linea blanca?, ya tengo todo los componente mencionados arriba estaba pensando en utilizar un inversor para invertir las señales ejemplo 74ls04 mi correo es luminosamayo1954@hotmail.com
ResponderEliminarme aparece este error
ResponderEliminarqtr.ino: In function 'void setMotors(int, int)':
qtr:91: error: 'setMotorRigh' was not declared in this scope
qtr.ino: In function 'void setup()':
qtr:122: error: 'MOTORRIGH_DIR_A' was not declared in this scope
qtr:123: error: 'MOTORRIGH_DIR_B' was not declared in this scope
qtr:124: error: 'MOTORRIGH_PWM' was not declared in this scope
qtr.ino: In function 'void loop()':
a mi tambien me salio ese error es muy simple esta mal escrito derecha es RIGHT
Eliminarmuy buen post amigo arme un robot con todos los materiales aplicados , pero en el caso de los qtr use cny, claro que la configuración de mi lectura es inversa de los a los qtr de pololu ,,, se que me entiendes, la complicación esta en que el robot sigue linea blanca con fondo negro, he intentado modificar la programación pero aun no tengo resultados, me gustaria poder contar con tu ayuda para modificar mi robot y poder compartir los videos en este mismo foro, de ante mano gracias
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarHola, estoy creando el mismo seguidor de linea con los componentes ya mencionados, mi duda es si necesito otro programa para programarlo o con arduino lo pasteo y lo cargo? lo que pasa esque no estoy familiarizado con el, y me intereso mucho este post! ya que se me hizo muy facil conseguir componentes pololu de antemano gracias!
ResponderEliminarsoy la misma persona que hizo esta pregunta...si llegas a leer esto porfavor contactame al siguiente correo seria de mucha ayuda de antemano gracias rrf360@gmail.com
Eliminartengo una duda ya tengo armado y programdo mi seguidor de linea con un codigo un poco parecido ya lo eh estado probando y funciona solo que tengo unos problemillas, mi seguidor lleva unos motores pololu 10:1 hp la placa baby orangutan un elevador de voltaje XL6009 un regulador de voltaje 7805 smd una bateria li-ion 3.7v 4.51Whr y los sensores qtr8a el elevador de voltaje lo tengo ajustado a 7.5v, cuando en el codigo pongo los motores a 80 y calibro el PID funciona bien pero el problema es cuando lo llevo mas alla de 90 al momento de ponerlo en pista y que inician los motores solo se escucha donde intentan iniciar los motores pero el codigo se reinicia, ya puse unos capacitores ceramicos 104 (ya que los de tantalio no los manejan) en paralelo con la alimentacion de los motores y otro mas en la alimentacion de la baby orangutan y hace lo mismo no puedo llevarlo mas alla de 80 :( algun consejo
ResponderEliminarhola alejandro!
Eliminarlo que podrias hacer es poner capacitores electrolíticos de no menos de 1000
uF con unos 16 v, conectados en paralelo a la alimentación de tu baby orangutan y a la alimentación del puente H, que es el driver para invertir el giro de los motores, ya que los cambios superiores a 90 pwm afectan bastante en el consumo de corriente y puede provocar reinicio de la placa.
Primeramente felicitarte por este buen proyecto, pero me podrias explicar como podria hacer un control PID pero con los Cny70. Saludos
ResponderEliminary si quiero usar los valores que me de cada sensor, cual es el codigo.
ResponderEliminarSolo tendrias que leer el vector que se llama sensors o sensorValues
EliminarTengo una duda es posible responderme?
ResponderEliminarQ dudas tienes quizas te pueda ayudar :)
EliminarOh muchas gracias, es por el tema del codigo porque veo que pone...
Eliminar#define ENCODERPIN 10 // pin del encoder
y luego no se usa para nada..el codigo esta completo? le falta algo? es que estamos haciendo el proyecto de mi clase y estamos basándonos en este.
Hola buenas tardes!
ResponderEliminarDisculpe como puedo hacer que siga líneas blancas?
Estaba checando el código pero no encuentro el comando donde se declare esa orden.
Aqui nadie te contesta colega..esta gente poco mira ya el blog
Eliminarya me di cuenta pero ya logre encontrar lo que necesitaba para cambiar de linea negra a blanca. y sobre el encoder deje comentada la función y así funciona mi carrito solo me falta regulara el control pd por que en curvas cerradas se sale.
EliminarHola jessie, perdona has conseguido que funcione con los mismos componetes que este coche? me gustaria hacerte una serie de preguntas porque estamos algo atascados en una parte
EliminarClaro y disculpa la tardanza salí fuera de la ciudad.
EliminarHola jessie, me podrias ayudar diciendome que modifico para que cambie a linea blanca
EliminarEste comentario ha sido eliminado por el autor.
EliminarEste comentario ha sido eliminado por el autor.
EliminarEste comentario ha sido eliminado por el autor.
EliminarA la funcion le falta la letra t:asi debes escribirla:
EliminarsetMotorRight(right);
A la funcion le falta la letra t:asi debes escribirla:
EliminarsetMotorRight(right);
Hola jessie ne podrías ayudar para que funcione en línea blanca porfa
EliminarHola jessie ne podrías ayudar para que funcione en línea blanca porfa
EliminarUNA DUDA COMPAÑEROS, COMO SE REGULA EL PD, LEEI QUE DE ACUERDO A LAS CARACTERISTICAS FISICAS DEL VEHICULO, PERO MI DUDA ES POR EJEMPLO EN LA RELACION PESO- VALOR A ASIGNAR, SI ES PESADO DEBO AUMENTAR EL VALOR DE LAS CONSTANTES O DISMINUIRLO?
ResponderEliminarHe colocado el código funcional que usamos en la última competencia, lamento mucho no poder responder, lo del RIGH fue un diminutivo para que quedara del mismo tamaño que LEFT, saludos a todos.
ResponderEliminarLa funcion AvanzarsiguientePatron como va?
ResponderEliminar