Home » Apps » Sargal! Mi robot multifuncional!

Login with your Social Account

Sargal! Mi robot multifuncional!

Sargal es un pequeño robot móvil fabricado con piezas de madera cortadas por laser que puede desarrollar diversas funcionalidades. Entre ellas se han implementado un vehículo de Braitenberg sigue luz – evita obtáculos, un coche teledirigido controlado con una applicación en android a través de bluetooth, y un controlador de proximidad empleando un regulador proporcional.

Hardware y diseño

Este pequeño utiliza como cerebro una placa Arduino Leonardo que cuenta con el ATmega32u4, algo más versatil que el ATmega328P de la placa UNO. Este va montado sobre una base sujetada por dos ruedas conectadas a servos de rotación continua modelo FS90R y una rueda loca trasera. Además cuenta con un Buzzer, tres sensores de ultrasonidos HC-SR04 (al frente, a la derecha y a la izquierda del robot), un display Nokia LCD 5110, un módulo bluetooth BT04-A y 6 sensores de luz constituidos por un divisor de tensión con LDR’s, de fabricación propia. Todo esto alimentado con una plia de 9V a través del regulador de tensión que incorpora la placa.
    
A continución se muestran las conexiones de los distintos elementos con la placa arduino:

Software y aplicaciones

Como ya hemos mencionado anteriormente se han implementado tres aplicaciones con el hardware  descrito. A continuación se exponen dichas implementaciones, explicando ademaś de en que consisten y como funcionan, los recursos que cada una emplean para ver cuanto partido podemos sacar a los periféricos de nuestro microcontrolador.

Control de Proximidad

Para este  modo de funcionamiento emplearemos el ultrasonidos delantero. Este está controlado por una librería que utiliza la función pulseIn() para medir el pulso generado por el “echo” del sensor, que como todas las funciones de tiempo en arduino (delay, millis, micros…) emplea el Timer0.

En el loop del programa, básicamente leemos el valor del sensor, calculamos el error con respecto a una referencia y lo multiplicamos por una constante para obtener la acción de control que se debe aplicar a las ruedas. El robot se moverá hacia delante y hacia detras cuanto sea necesario para quedarse a la distancia marcada como referencia.

Esta acción de control debe ser traducida a un ancho de pulso concreto para ser aplicada a los servomotores. Para ello nos ayudamos de la librería Servo. Para generar estos pulsos se utiliza la modulación PWM a través del Timer1 con lo que ya no podemos gastar este timer para otras tareas, o dejarian de funcionar los motores.

Como extra presentamos en la LCD la medida de distancia del ultrasonidos de tal manera que se puede comprobar su correcto funcionamiento. Esta LCD se comunica con el μC  mediante el protocolo SPI, para el cual existe hardware dedicado, lo que nos permite actualizar el contenido del display a mayor velocidad y nos ahorra el uso de librerías adicionales.

 

Imagen de previsualización de YouTube

 

Coche Teledirigido

La idea es sencilla: controlar el robot como si fuera un coche RC empleando como mando una aplicación móvil que se comunique mediante bluetooth. Para desarrollar dicha aplicación hemos empleado la herramienta App Inventor 2, que permite una programación sencilla por bloques de aplicaciones android.

Con respectro a la comunicación entre el móvil y el μC tenemos de mediador al módulo bluetooth, y este se comunica con arduino usando comunicación serial (RS-232). El ATmega32u4 tiene dos puertos serie, el principal esta integrado en la comunicación USB, el segundo en los pines D0 y D1 de nuestro Arduino Leonardo. Gracias a esto nos ahorramos recurrir a la libreria SoftwareSerial si queremos usar el monitor serie del Arduino IDE para depurar.

Además se han añadido una serie de botones a nuestra app para hacer funcionar el buzzer emulando un claxon o una sirena gracias a la función tone(). Esta genera una señal PWM de la frecuencia que deseemos empleando para ello el Timer3, uno menos con el que contar si queremos seguir teniendo esta funcionalidad.

Imagen de previsualización de YouTube

Vehículo de Braitenberg sigue luz y evita obtáculos

Se trata de una aplicación autónoma en la que el robot debe dirigirse hacia donde más luz reciba, para ello hacemos uso de nustro sensor de luz. Este cuenta con 6 divisores de tensión formados por una resistencia y un LDR, de tal manera que los LDR’s estan apuntando cada uno a una dirección, por lo que obtendremos  diferentes lecturas  según haya mas luz en una dirección o en otra.

El procesamiento de la información de los sensores es mínima, solo a efectos de escalado para después enviar esa informción directamente a los actuadores, siguiendo la metodología de los vehículos de Braitenberg tal y como se observa a continuación:

 

  //Braitenberg:
  velIzq =  LDR_Delante + LDR_Del_Der - LDR_Del_Izq + 2 * LDR_Atr_Der - 2 * LDR_Atr_Izq - LDR_Atras - Ultra_Frente + Ultra_Izq  ;
  velDer =  LDR_Delante - LDR_Del_Der + LDR_Del_Izq - 2 * LDR_Atr_Der + 2 * LDR_Atr_Izq - LDR_Atras - Ultra_Frente + Ultra_Der ;

Además de la información de los sensores de luz también tiene en cuenta los sensores de ultrasonidos para evitar que colisione con los obstáculos. Para ello contamos con sensores situados al frente, al lado izquierdo y al lado derecho del robot. Los sensores laterales funcionan independientemente del resto del programa: usamos interrupciones. El disparo se realiza periódicamente con el último timer libre que nos quedaba sin usar, el Timer4, que en este caso es controlado por la librería MsTimer2. Aunque habitualmente esta libreria trabaja con el Timer2 nuestro micro no tiene dicho timer por lo que se empleará el 4.  Aprovechamos el mismo disparo para ambos ultrasonisos, así ahorramos un pin digital. Por otra parte los pines echo estan conectados a dos interrupciones externas. Estas están configuradas para calcular la duración de un pulso en nivel alto, utilizand un contador y cambiando el flanco que activa la interrupción cada vez que ésta se ejecuta. Tal que así:

volatile unsigned long  tiempo_0_D=0;
volatile unsigned long  tiempo_vuelo_D=0;
volatile unsigned int contador_D=1;
 
void Ultra_Derecha_ISR(){
    contador_D++;
    if((contador_D%2)==0){
      tiempo_vuelo_D=micros()-tiempo_0_D;
      attachInterrupt(digitalPinToInterrupt(Echo_pin_Derecha), Ultra_Derecha_ISR, RISING);
    }else{
      tiempo_0_D=micros();
      attachInterrupt(digitalPinToInterrupt(Echo_pin_Derecha), Ultra_Derecha_ISR, FALLING);
    }  
    
}

Luego solo queda calcular la distancia equivalente con la velocidad del sonido.
Y para coronar la aplicación se muestran por el LCD la información recogida por los sensores.

Imagen de previsualización de YouTube

A %d blogueros les gusta esto: