·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:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq3tr7xuTbSiogbCQVasTEQevjLqtqhlOOVXJDmLmtmkepVT3_zraIYJXNQiY03-TM277K_zCSez5H5CeQOS5Sn-lf60mj5aSKcMbs77amRhoD3wxTiF74Zi8Mp3gERplAkLTLrt9AZZk/s320/dise%25C3%25B1o+placa+pic.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbatSkfP2r5v1MxU0c211m9oWBLXD5WQANFb1FjSsxx8hcUmCr9PLiW6Z2l2p2Yix1g4AqqNaHngxsjcU8wk3xXIECwuzj_KEQj-UNgh2ZrJdfm_3jjoNgC_z8re4aFxLLbLtXocjoseA/s320/placa+mando+3d.jpg)
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:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYHN6ws83NXp5JIfWe2UBQvoUvhkNKpWQKhRyi9mTFEYseyfozp4gXlhFFNVg7d1XZw4876HyMe2iNVuiNbHfEYJBAcOgkCaXnErSQl1TEsomZgN4iP2GDQQv4AogtDtBSOSUKvcJGPvY/s640/circuito+ard.jpg)
Diseño de la placa del robot:
Conecto la pcb con los L298N, los motores y la batería.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_gFJnS-Hhme98MnFr5daNP7TDgiRKOk1euW3SVuBe-YWxDDwX6aHNPzQfve6ayjBfF6PiYy1bpaLTTvFNdmase3ymX5NIKF17k1uRC0O_laqT2oozuGFO0Pa8FNjnefIas7IPdxplJqA/s320/rueda2.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiITFnqqEfE2n-55jgYZh7mLTVAI818jzaK43FXQl6Xk9FyZD7fCVEK9UaWUbrl07wFPmCxV7XsSFbI9cAW4bSMVCWmLUj4M1-XFX5a1igT_Y39TsCXQyuTQvVc3gZ_-cmNZLvmQVl7yIU/s400/rueda1.jpg)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAd0e1BQfuC5c0DsUO2FNy0tFteiBDGFpCkYt42R1WIlfhI7ieV_gKnb9mStD4KAjEnQLo7RmiDq9i0EIsJKIUavi5TVByuRbZdINIM1plVvCgOJ4EEh4lKgbyhQiYkq80qMRpVIyCKeQ/s320/dise%25C3%25B1o+pic2.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnbhaK7vKkAWoCC5ruubVH7LWa-wRSNYEsqf23S70xN4YI29bWi_R4v5V4geLCKeH51kLk5ZlHjL4Hd-cQSaaxQKkjeWGkH3VOriJJ0F6PuNDnT54Cz1bSRBkhyv7SFQlEU7_LHH6LAsI/s320/pic2+3d.jpg)
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:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq3tr7xuTbSiogbCQVasTEQevjLqtqhlOOVXJDmLmtmkepVT3_zraIYJXNQiY03-TM277K_zCSez5H5CeQOS5Sn-lf60mj5aSKcMbs77amRhoD3wxTiF74Zi8Mp3gERplAkLTLrt9AZZk/s320/dise%25C3%25B1o+placa+pic.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbatSkfP2r5v1MxU0c211m9oWBLXD5WQANFb1FjSsxx8hcUmCr9PLiW6Z2l2p2Yix1g4AqqNaHngxsjcU8wk3xXIECwuzj_KEQj-UNgh2ZrJdfm_3jjoNgC_z8re4aFxLLbLtXocjoseA/s320/placa+mando+3d.jpg)
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:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYHN6ws83NXp5JIfWe2UBQvoUvhkNKpWQKhRyi9mTFEYseyfozp4gXlhFFNVg7d1XZw4876HyMe2iNVuiNbHfEYJBAcOgkCaXnErSQl1TEsomZgN4iP2GDQQv4AogtDtBSOSUKvcJGPvY/s640/circuito+ard.jpg)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_gFJnS-Hhme98MnFr5daNP7TDgiRKOk1euW3SVuBe-YWxDDwX6aHNPzQfve6ayjBfF6PiYy1bpaLTTvFNdmase3ymX5NIKF17k1uRC0O_laqT2oozuGFO0Pa8FNjnefIas7IPdxplJqA/s320/rueda2.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiITFnqqEfE2n-55jgYZh7mLTVAI818jzaK43FXQl6Xk9FyZD7fCVEK9UaWUbrl07wFPmCxV7XsSFbI9cAW4bSMVCWmLUj4M1-XFX5a1igT_Y39TsCXQyuTQvVc3gZ_-cmNZLvmQVl7yIU/s400/rueda1.jpg)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAd0e1BQfuC5c0DsUO2FNy0tFteiBDGFpCkYt42R1WIlfhI7ieV_gKnb9mStD4KAjEnQLo7RmiDq9i0EIsJKIUavi5TVByuRbZdINIM1plVvCgOJ4EEh4lKgbyhQiYkq80qMRpVIyCKeQ/s320/dise%25C3%25B1o+pic2.jpg)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnbhaK7vKkAWoCC5ruubVH7LWa-wRSNYEsqf23S70xN4YI29bWi_R4v5V4geLCKeH51kLk5ZlHjL4Hd-cQSaaxQKkjeWGkH3VOriJJ0F6PuNDnT54Cz1bSRBkhyv7SFQlEU7_LHH6LAsI/s320/pic2+3d.jpg)
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