martes, 29 de octubre de 2013

Control del Robot Velocista Lenin

El control del robot Lenin, 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.

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

42 comentarios:

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

    ResponderEliminar
    Respuestas
    1. El 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

      Eliminar
  2. me pueden ayudar con el codigo ya que lo ejecuto y dice problemas y casi no se programar en arduino

    ResponderEliminar
  3. Que tal! Buen proyecto. Oye como estuviste el valor de Rangebrake? Espero me puedas responder mi pregunta gracias! Saludos.

    ResponderEliminar
    Respuestas
    1. Eso 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

      Eliminar
  4. hola. 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

    ResponderEliminar
  5. hola.amigo buen proyecto.tengo una pregunta veo q usas un sensor qtr analógico ¿se puede usar uno digital para la misma funcion?

    ResponderEliminar
    Respuestas
    1. Hola. 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

      Eliminar
    2. AMIGO QUE SIGNIFICA, O QUE HACE "STANDBY
      "

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

    ResponderEliminar
  7. me aparece este error
    qtr.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()':

    ResponderEliminar
    Respuestas
    1. a mi tambien me salio ese error es muy simple esta mal escrito derecha es RIGHT

      Eliminar
  8. muy 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

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  11. Hola, 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!

    ResponderEliminar
    Respuestas
    1. soy 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

      Eliminar
  12. tengo 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

    ResponderEliminar
    Respuestas
    1. hola alejandro!
      lo 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.

      Eliminar
  13. Primeramente felicitarte por este buen proyecto, pero me podrias explicar como podria hacer un control PID pero con los Cny70. Saludos

    ResponderEliminar
  14. y si quiero usar los valores que me de cada sensor, cual es el codigo.

    ResponderEliminar
    Respuestas
    1. Solo tendrias que leer el vector que se llama sensors o sensorValues

      Eliminar
  15. Tengo una duda es posible responderme?

    ResponderEliminar
    Respuestas
    1. Q dudas tienes quizas te pueda ayudar :)

      Eliminar
    2. Oh muchas gracias, es por el tema del codigo porque veo que pone...
      #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.

      Eliminar
  16. Hola buenas tardes!
    Disculpe como puedo hacer que siga líneas blancas?
    Estaba checando el código pero no encuentro el comando donde se declare esa orden.

    ResponderEliminar
    Respuestas
    1. Aqui nadie te contesta colega..esta gente poco mira ya el blog

      Eliminar
    2. ya 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.

      Eliminar
    3. Hola 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

      Eliminar
    4. Claro y disculpa la tardanza salí fuera de la ciudad.

      Eliminar
    5. Hola jessie, me podrias ayudar diciendome que modifico para que cambie a linea blanca

      Eliminar
    6. Este comentario ha sido eliminado por el autor.

      Eliminar
    7. Este comentario ha sido eliminado por el autor.

      Eliminar
    8. Este comentario ha sido eliminado por el autor.

      Eliminar
    9. A la funcion le falta la letra t:asi debes escribirla:

      setMotorRight(right);

      Eliminar
    10. A la funcion le falta la letra t:asi debes escribirla:

      setMotorRight(right);

      Eliminar
    11. Hola jessie ne podrías ayudar para que funcione en línea blanca porfa

      Eliminar
    12. Hola jessie ne podrías ayudar para que funcione en línea blanca porfa

      Eliminar
  17. UNA 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?

    ResponderEliminar
  18. He 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.

    ResponderEliminar