·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:
Los componentes integrados en el robot son los siguientes:
· CÁLCULOS:
El controlador Atmega 328P calcula la velocidad de cada motor según la siguiente 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
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);
}
}
Circuito de la placa del transmisor:
Diseño de la placa del transmisor:
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);
}
}
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.
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.
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:
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