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.
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.
El controlador de la pantalla LCD sigue un protocolo documentado y permite utilizar una interfaz de 4 u 8 bits para comunicarse con él.
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.
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.
Un puente en H es un componente que se utiliza para controlar la dirección en la que gira un motor.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
- https://www.arduino.cc/en/uploads/Main/arduino-leonardo-schematic_3b.pdf
- http://www.datsi.fi.upm.es/docencia/Informatica_Industrial/DMC/pdf/atmega32u4.pdf
- https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
- https://www.pololu.com/blog/17/servo-control-interface-in-detail
- http://www.ti.com/lit/ds/symlink/l293.pdf
- http://www.datsi.fi.upm.es/docencia/Informatica_Industrial/DMC/motores_banggood.pdf
- http://www.micropik.com/PDF/HCSR04.pdf