/arduinoRobot

Robot that follow walls

Primary LanguageArduinoMIT LicenseMIT

Resumen

Se trata del proyecto de un robot cuya funcionalidad consiste en avanzar hasta que encuentra una pared y, una vez la encuentra, seguirla, girando a la derecha o la izquierda en función de qué haya seleccionado el usuario.

Componentes físicos

Arduino Leonardo (ATMega 32u4)

Arduino Leonardo es una placa de desarrollo basada en el chip ATMega 32u4. Las características más relevantes para este proyecto son:

  • 4 timers con capacidad para PWM (dos de ellos de 16 bits)
  • Soporte para interrupciones
    • Externas: Flanco o nivel en un pin.
    • De timer: Interrupción periódica.
  • Conversor analógico-digital de 10 bits.

Pantalla LCD con controlador hd44780u

El controlador de la pantalla LCD sigue un protocolo documentado y permite utilizar una interfaz de 4 u 8 bits para comunicarse con él.

Servomotor

Un servomotor es un motor que se coloca y mantiene una posición que se le comunica mediante un pulso de duración variable a una frecuencia de 50Hz.

https://a.pololu-files.com/picture/0J3288.250.jpg?125f7d4d55b005d1b9e048b12a88fed7

Dicho pulso debe tener una duración entre 1 ms y 2 ms. Si el pulso tiene una duración de 1 ms, el servomotor se coloca en la posición 0º. El ángulo aumenta proporcionalmente a la duración del pulso hasta llegar a los 180º correspondientes a una duración de 2 ms.

Puente en H (L293D)

Un puente en H es un componente que se utiliza para controlar la dirección en la que gira un motor. http://www.geekbotelectronics.com/wp-content/uploads/2014/07/l293d-3.png

De esta forma, si el enable está activado y los dos inputs valen 1 y 0, respectivamente, el motor girará en una dirección, mientras que si valen 0 y 1, girará en la otra.

Motor con encoder

Se han utilizado dos motores iguales,con reductora de forma que tienen una velocidad de 100rpm y con encoders acoplados que aportan 823 pulsos por revolución.

Medidor de distancia (HC-SR04)

El sensor HC-SR04 utiliza ultrasonidos para medir la distancia que le separa de un cuerpo.

El módulo consta de dos pines para comunicación, llamados trigger y echo. Para iniciar una medición, se envía un pulso de 10 microsegundos a nivel alto al pin de trigger y a continuación se mide la duración del pulso a nivel alto que envía el pin de echo. Para traducir esta duración a una distancia en centímetros se divide la duración en microsegundos entre 58.

Conexión y montaje

rsc/esquema_conexion.png

Componentes lógicos

Máquina de estados

rsc/estados.png

Inicialmente,el robot está parado y pide en la pantalla que el usuario seleccione una sentido de giro. A continuación el robot se desplaza hacia el frente hasta que encuentra una pared. Una vez la encuentra gira en el sentido que se ha seleccionado y entra en un bucle en el que sigue la pared a una distancia fija y en línea recta hasta que encuentra una esquina, gira la esquina y vuelve a seguir la pared.

Control de los motores

La velocidad de cada motor se controla, en principio, mediante un controlador PID. Este controlador trata de conseguir y mantener un número de pulsos de encoder mediante la modulación del ancho del pulso que se aporta a la alimentación del motor.

rsc/motores.png

Como se puede observar en el diagrama, se utiliza otro controlador PID para modificar la velocidad de uno de los motores de forma que el robot se mantenga a la misma distancia de la pared. Además, este controlador sirve para girar cuando se encuentra una esquina convexa, ya que se interpretaría que la distancia ha aumentado mucho y se daría más velocidad al motor para que girara.

Medición de la velocidad

Un encoder de cada motor se conecta a uno de los pines de interrupción externa de Arduino Leonardo. Así, manejando la interrupción de flanco en estos pines e incrementando una variable global en ella, se puede contar el número de pulsos que se han recibido entre dos instantes dados. En nuestro caso esos instantes son el principio y el final del bucle.

Generación del PWM

Como ya se ha explicado, la velocidad de los motores se controla mediante la modulación del ancho del pulso que se aporta a la alimentación del motor.

Estos pulsos siguen una frecuencia de 20KHz y se generan utilizando el modo correcto en fase y frecuencia de uno de los timer/counter de 16 bits del chip ATMega32u4 y configurando el mismo timer/counter para que genere la forma de onda por los pines de salida en lugar de habilitar interrupciones.

Control del servomotor

El servomotor hace girar al medidor de distancia, de forma que se pueda controlar la distancia a la pared que está en el lado y la que está al frente. Por esta razón, tiene que alternar entre mirar a 90º y 0º/180º (en función de qué pared siga) y comunicarse con el medidor de distancia para que sepa a cuál de las direcciones corresponde la medición que toma.

Medición de la distancia

Para medir la distancia se utiliza el sensor HC-SR04. Para medir la duración del pulso de echo se utiliza una interrupción de flanco de subida en uno de los pines de interrupción externa. En su manejador, se activa uno de los timer/counter del chip ATMega32u4 en modo “Clear on compare match”(CTC) para medir el tiempo y en el manejador de la interrupción que genera el timer se incrementa la variable que mide el tiempo.

Referencias