jueves, 10 de marzo de 2016

ROBOT OMNIDIRECCIONAL


·DESCRIPCIÓN:      
  
               Se trata de una base con tres ruedas omnidireccionales, capaz de moverse en cualquier dirección y rotar sobre sí mismo. Un transmisor con dos joysticks controlado con un PIC16F877 enviará por radio los datos de dirección (eje 'x' e 'y') y rotación. Se hace una conversión AD en los potenciómetros de los joysticks para transmitir la potencia a la que se moverá la estructura.




· COMPONENTES:

Los componentes integrados en el mando son los siguientes:


  • 2 x Joysticks.
  • 1 x Interruptor.
  • 1 x Diodo.
  • 1 x Condensador smd 100 uF.
  • 1 x Condensador 100 nF.
  • 1 x Resistencia smd 330 ohm.
  • 1 x Led.
  • 1 x PIC16F877.
  • 1 x Cristal 16 Mhz.
  • 2 x Condensador 22 pF.
  • 1 x Módulo Rx-Tx Radio.
  • 4 x pilas 1.5V AA.


Los componentes integrados en el robot son los siguientes:


  • 2 x Puente H L298N.
  • 2 x Leds.
  • 1 x Cristal 16 Mhz.
  • 2 x Condensador 22 pF.
  • 2 x Resistencia smd 330 Ohm.
  • 1 x Condensador 100 nF.
  • 1 x Condensador 100 uF.
  • 1 x Regulador de tensión 7805.
  • 1 x Atmega 328P.
  • 1 x Módulo Rx-Tx Radio.
  • 3 x Motores 9V.
  • 1 x Batería 11.1V 25c 1000mAh.



· CÁLCULOS:

El controlador Atmega 328P calcula la velocidad de cada motor según la siguiente matriz de movimiento:

Matriz de Movimiento

Podéis ver el documento completo en el siguiente enlace:

http://www.fing.edu.uy/inco/grupos/mina/pGrado/easyrobots/doc/SOA.pdf





-PLANIFICACIÓN-

· DIAGRAMA DE GANTT



Primero se hicieron pruebas con el PIC en una protoboard para convertir en analógico los valores de los potenciómetros.

Después se procedió al envío de los datos a través del transmisor de radio. Los datos los recibe un arduino mega el cual tiene conectado el receptor de radio. Se visualizan los datos en la pantalla del pc y se comprueban que son correctos.


PROGRAMA DE ARDUINO PARA VISUALIZAR LOS DATOS QUE RECIBE:

void setup() {
  Serial.begin(9600);
}
char val;    
void loop() {
if (Serial.available() > 0){
val = Serial.read();
Serial.println(val);
}
}
  

Procedo entonces al diseño y construcción de la placa del controlador en ARES (por entonces no sabía hacer placas a doble cara por lo que ésta no será la definitiva).


La construcción de las placas de los potenciómetros eran muy sencillas y no requirieron diseño en ARES.

 


Circuito de la placa del transmisor:



Diseño de la placa del transmisor:




Esta placa se hizo a medida para que el interruptor y el led coincidiesen en los huecos de la carcasa del transmisor.

Se termina de pulir el programa del PIC introduciendo una trama que incluye el inicio y el fin de la cadena para poder desechar tramas no válidas. Imaginemos que el valor de los potenciómetros son
1 para eje 'x', 2 para eje 'y' y -3 para rotación; la trama sería: i-3,1,2f


PROGRAMA DEFINITIVO PIC16F877:

#include <main.h>
char inicio="i";
char separacion=",";
char fin="f";
int8 pote1;
int8 pote2;
int8 pote3;

void main()

{
   
   setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
   output_b(1);
While(true){
set_adc_channel(0);
delay_us(20);
pote1=READ_ADC();
set_adc_channel(1);
delay_us(20);
pote2=READ_ADC();
set_adc_channel(2);
delay_us(20);
pote3=READ_ADC();
putc(inicio);
delay_ms(5);
putc(pote1);
delay_ms(5);
putc(separacion);
delay_ms(5);
putc(pote2);
delay_ms(5);
putc(separacion);
delay_ms(5);
putc(pote3);
delay_ms(5);
putc(fin);
}

}









Posteriormente comienzo con el programa de arduino.


Lo primero fue tratar la cadena como un array, comprobar que la cadena es correcta y extraer los datos que nos interesan.

Una vez conseguido ésto procedo a la inserción de la matriz y demás funciones.

Únicamente mostraré el SOFTWARE DEL TRATAMIENTO DE LA CADENA:

void setup() {
   Serial.begin(9600);
}

int senial[20];

int val;
int posicion;
unsigned long time_ant = millis();

void loop() {

 if(Serial.available()>0){
  val=Serial.read();
  if(val=='i'){
    posicion=0;
    senial[posicion]=val;
    posicion++;
  }
  else if(val=='f' && posicion == 6){
    //AQUÍ SE EXTRAEN LOS DATOS QUE NECESITAMOS( senial[1], senial[3] y senial[5] )Y TRABAJAMOS CON      //ELLOS
    time_ant = millis();
  }
  else{
    senial[posicion]=val;
    posicion++;
  }
 }

 if((millis() - time_ant) > 500){

  time_ant=millis();
  //AQUÍ INTRODUCIMOS EL CÓDIGO DEL COMPORTAMIENTO DEL ROBOT EN CASO DE PÉRDIDA DE SEÑAL
 }
}


Hago la primera prueba de movimiento del robot y es gratamente satisfactoria.



Diseño y construyo la placa del arduino en doble cara.

Circuito de la placa del robot:




Diseño de la placa del robot:




Conecto la pcb con los L298N, los motores y la batería.



La idea era introducir el robot en una esfera para que el efecto fuera el de controlar remotamente una esfera y no un robot omnidireccional, pero la esfera choca con la propia estructura de las ruedas. Unas ruedas menos gruesas hubieran sido más adecuadas para este propósito.



Finalmente el robot se queda así y ya está listo pero sobra tiempo para diseñar y construir una placa mejorada para el controlador, más pequeña y a doble cara.




Está diseñada a medida para que encaje el interruptor en su hueco pero esta vez el led será soldado a la placa con cables para que llegue a su hueco.



Aquí tienen un vídeo resumiendo los procesos de la creación de placas:




Aquí les dejo un vídeo de mi robot terminado:





             

No hay comentarios:

Publicar un comentario