PROYECTO SUMO
UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS
ROBOTS PERÚ
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Dedicatoria:
A toda la comunidad
Robotera del Perú.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
ÍNDICE
Página
1. Dominio de la aplicación 5
1.1. Identificación
1.2. Sistema en general (objetivo)
1.3. Generalidades del documento
4. Concepción y Realización 12
4.1. Planificación y ejecución
4.2. Documentación 13
ELECTRÓNICA
o Alimentación 16
o Lógica
o Potencia 18
o Eagle 20
MECÁNICA 21
o Forma
Motores 22
o Estructura Final 23
PROGRAMACIÓN 25
o Movimiento del Robot-SUMO
Módulo PWM 26
Función Motor 28
o Diagrama de Flujo 29
o Código en CCS 31
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
4.4. Participación 61
INTERCON 2010
III KANTUROBOT 2010
FOINTEC 2010 62
VILLATRONICA 2010
COINTEC 2010
CER 2010
5. Costo 63
6. Agradecimientos 67
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
1.1. Identificación
Se busca tener un robot sumo con un sistema robusto que cumpla con el
reglamento de la categoría. Este sistema debe ser fiable y estable en las
condiciones y ambientes de batalla. Además debe fácil de manipular y
calibrar durante la competencia.
2.1. Especificaciones
Diseñar el layout
Manejo del programa Eagle
Diseñar la Mecánica
Uso de Solidworks
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Comunicarse con la PC
Uso de Visual Basic 2010
2.2. Normas
Uso de Solidworks
Tener una mecánica solida
Tener estabilidad en el movimiento
Respetar las dimensiones
2.3. Otros
3.1. Sistema
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
3.2. Características
Modo Sumo-batalla
Control del sentido de giro y de la velocidad de los motores
Detección del color de la superficie
Detección de objetos dentro a un rango específico con filtro
Persecución de un objeto
Selector del sentido del giro inicial
Selector de inicio de operación
Modo Rastreador
Control del sentido de giro y de la velocidad de los motores
Detección de objetos dentro a un rango específico
Persecución de un objeto
Selector de inicio de operación
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
3.2.5.1 Fiabilidad
3.2.5.2 Mantenimiento
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
3.2.5.3 Disponibilidad
3.2.7. Movilidad
Para poder movilizar el robot se tiene que tener la aprobación de
director del instituto de investigación.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
4. Concepción y Realización
May Jun Jul Ago Set Oct Nov Dic Ene Feb Mar Abri
Maqueta
Diseño de la
mecánica
Diseño de la
placa
Implementación
Programación
Interfaz
Planificado
Ejecutado
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
4.2. Documentación
ELECTRÓNICA
Para la parte de la electrónica en este proyecto usamos componentes
superficiales en una placa impresa que diseñamos en el Cad Soft Eagle Layout
Designer 5.6.
Una de las principales razones para usar este tipo de componentes fue el
ahorro de espacio (ya que son más pequeños) lo que nos permitiría tener más libertad
al momento de diseñar la mecánica. Además, al ser muchos de estos componentes
también de uso industrial existe una mayor confianza en su desempeño y menos
probabilidad de que fallen en condiciones extremas como el frio y la altura.
Alimentación
Para alimentar todo el módulo usamos una batería recargable de 12v con
1.3AH, lo cual nos presentó con la necesidad de tener que reducir ese voltaje a 5V
para el funcionamiento de los demás integrados.
Lo que estábamos buscando era una forma de reducir el voltaje, sin que se
produjera una pérdida innecesaria de potencia.
Entonces el regulador trabaja con el 20.8% de eficiencia, lo que significa que casi el
80% de la potencia de entrada se desperdicia.
Fueron estos resultados los que nos llevaron a buscar un regulador de voltaje más
eficiente.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
El regulador L5973D es capaz de entregar hasta 2.5 A con voltajes de salida que
varían entre 1.235 a 35v. Trabajando con voltajes de entrada entre los 4.4 y 35v.
Cuenta con protección contra corto circuito.
Presenta un sistema de retroalimentación que ayuda a alcanzar una eficiencia del
90%.
Encapsulado D
Función de los pines:
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
El pin 5 es muy importante, ya que nos ayuda a definir el valor del voltaje de salida.
Para esto usamos la siguiente fórmula:
→ →
El pin 6 lo dejamos abierto, el voltaje de referencia solo nos sirve como un indicador de
que el regulador está funcionando correctamente.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Hay más ejemplos, pero este es el circuito que vamos a estudiar para realizar nuestro
propio diseño.
Ya hemos calculado los valores de R1 y R2. Es así que obtenemos una configuración
que trabaja de la forma deseada, que usa como voltaje de entrada 12v y nos entrega
5v de manera eficiente.
Lógica
En lo correspondiente a la parte lógica, usamos el pic 18f45550 TQFP. Al momento
de elegir, tomamos en cuenta la cantidad de pines que presenta y la versatilidad que
nos da su forma encapsulada.
Este modelo presenta entradas tanto analíticas como digitales, así como la opción de
usar los dos canales disponibles para el PWM.
Distribución de pines
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Las parejas de pines 6-7, 28-29 y 21-22 van conectados uno a tierra y el otro a fuente
(VSS= tierra y VDD=fuente) y entre ellos se coloca un condensador.
El pin 18, conocido como el Master Clear funciona como un interruptor, si se encuentra
a 0 el pic se resetea. La configuración de conexión es la siguiente:
Usamos dos pines analógicos como entrada para los sensores cny70, cuatro pines de
salida para controlar los dos puentes h, cuatro pines (2 como entrada y 2 como salida)
para los sensores ultrasonidos, los pines 1(RX) y 44(TX) para la comunicación serial y
ambos pines de PWM (35 y 36).
Teniendo en cuenta todos estos puntos, armamos la configuración final del PIC:
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Potencia
Con respecto a la parte de potencia, usamos el puente H L6203 MULTIWATT para
controlar 2 motores DC que veremos después.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Conectamos los pines 5 y 7 a una salida del pic cada uno. Es por medio de estos
pines que el pic controla al puente h.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Eagle
Eagle es un programa que nos permite diseñar placas. Para diseñar una nueva placa
primero creamos un esquema de la misma y luego diseñamos el circuito impreso.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
MECÁNICA
La estructura del modulo sumo está compuesta en su mayoría por un armazón de
aluminio, que forma un esqueleto solido sin ser muy pesado
Forma
Cuando comenzamos con el diseño de este proyecto uno de los primeros temas de
discusión fue la forma que debería tener, queríamos una distribución adecuada del
peso que a la vez nos permitiera cumplir la función principal de un robot sumo que es
empujar a su contrincante fuera del dojo.
Una rampa adelante, lo más pegada al piso y con menos inclinación posible. Y el resto
de la estructura en forma de cubo.
Para que la estructura sea estable se construyo primero un esqueleto que luego sería
cubierto con placas de aluminio:
Esqueleto
1er prototipo de Thor
Los motores, las baterías y la placa se acomodan dentro del cuerpo formando pisos,
con la placa en el piso superior para tener acceso fácil a ella.
En la parte externa superior de la estructura fijamos un botón grande que nos permite
apagar el robot sin necesidad de abrirlo o desconectar la placa.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
También cambiamos la rampa que planeábamos usar en la parte de adelante por una
pala:
MOTORES
Usamos dos motores DC de 12v, 300rpm y una reducción de 20:1, como podemos
observar en la figura:
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Estructura Final
Después de nuestra primera participación en un concurso decidimos hacer una nueva
estructura, más estable y que contenga nuestra idea original de usar una rampa.
4 puntos de
apoyo
SOLIDWORKS
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Para realizar un ensamblaje primero debemos tener las piezas, así que empezamos
con eso y luego las ensamblamos:
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
PROGRAMACIÓN
La programación fue desarrollada en lenguaje C con el compilador CCS usando el
entorno de MPLAB. Para un mejor entendimiento del código se dividió en función a los
módulos usados dentro del PIC.
Este cuadro representa los bits que tiene que enviar el pic al puente H para
poder mover los motores. Hasta este punto solo podemos controlar el movimiento del
robot más no la velocidad del mismo. Para poder controlar la velocidad de los motores
utilizaremos el módulo PWM.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Módulo PWM
Para poder utilizar el modulo PWM del pic primero hay que configurarlo, para
trabajar de una manera más ordenada crearemos una función llamada initPWM() para
configurar el PWM.
void initPWM()
{
setup_ccp1(CCP_PWM); // Definimos la primera salida de PWM para el motor 1
setup_ccp2(CCP_PWM); // Definimos la primera salida de PWM para el motor 2
setup_timer_2(T2_DIV_BY_1, 255, 1)
Prescalar: El periodo
es dividido entre éste
número para obtener
diferentes periodos: PR2: Es el máximo Se asigna
i.e. ancho de pulso: por defecto
T2_DIV_BY_1 255 100% el numero 1
T2_DIV_BY_4
T2_DIV_BY_16
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
set_pwm1_duty(127);
set_pwm1_duty(255);
TPR2 Teórico=
TPR2 simulado=
TPR2 Teórico=
TPR2 simulado=
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Función Motor
motor(velocidad)
Esta función se encarga de enviar el sentido y la velocidad a los motores
utilizando un solo número para representar ambos datos. La función motor(velocidad)
requiere que se le asigne un valor de -100 a 100, este número representa el
porcentaje de velocidad, además si el número es positivo girará en un sentido y si es
negativo girará en el sentido contrario. Cabe resaltar que el valor de -100 a 100 es el
porcentaje del valor que ingresamos en la comando set_pwm1_duty(valor).
Para entender mejor esta lógica observaremos la siguiente grafica:
motor(velocidad*) velocidad%
motor(50) 50 %
motor(-50) 50 %
motor(100) 100 %
motor(0) 0%
stop
Tabla 2
Como podemos observar es muy sencillo controlar el sentido y la velocidad del motor
haciendo uso de esta función. Ahora veremos el algoritmo de esta función en un
diagrama de flujo y luego en código.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
motor(velocidad)
valor = velocidad&0b10000000
SI NO
Si valor = 128
a=2.55*velocidad;
set_pwm1_duty(a);
FIN
Explicación:
Según lo analizado, el sentido de giro del motor depende del signo del número
dentro de la función motor(velocidad). Para poder determinar el signo analizaremos el
número como binario. La variable velocidad es un int por lo tanto puede tomar valores
desde -127 hasta 127.
int =8 bits __ __ __ __ __ __ __ __
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
i.e.
-1 == 1111 1111
1 == 0000 0000
-2 == 1111 1110
2 == 0000 0001
-3 == 1111 110
3 == 0000 0010
valor = velocidad&0b10000000
Ejemplo:
Si velocidad = 50 = 0b00110010
0 0 1 1 0 0 1 0
&
1 0 0 0 0 0 0 0
___________________________
Valor = 0 0 0 0 0 0 0 0 =0
1 1 0 0 1 1 1 0
&
1 0 0 0 0 0 0 0
___________________________
Valor = 1 0 0 0 0 0 0 0 = 128
SI
Girar en sentido anti horario Si la variable valor es igual a 128 (negativo) entonces
giramos los motores en sentido anti horario.
velocidad= -1*velocidad; Ahora convertiremos la variable velocidad (número
negativo) a un número positivo multiplicándolo por -1.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Hasta este punto el signo de la variable velocidad sólo se usó para determinar el
sentido de giro del motor. Además esta variable ya es positiva para todos los casos ya
que se multiplicó por -1 cuando era negativa.
Ahora usaremos el módulo de la variable velocidad para asignar el valor del porcentaje
de la velocidad del motor en el PWM.
100 255
velocidad a
Código en CCS
void motor(int velocidad ) // Definimos la función que tendrá la entrada de un parámetro
{
unsigned int valor,a; // Definimos la variable valor como un entero sin signo (0 a 255)
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Ahora crearemos una función motores para controlar dos motores usando la función
anterior.
void MOTORES(int velocidad1, int velocidad2) // definimos la función que tendrá la entrada de dos parámetros
{
motor1(velocidad1); // asignamos la variable velocidad1 al primer motor
motor2(velocidad2); // asignamos la variable velocidad2 al segundo motor
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Superficie negra
Superficie blanca
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Como ya habíamos señalado los casos anteriores son para casos ideales teniendo en
cuenta que:
Por tanto la salida no será 1logico (5 volts) ni 0 lógico (0 volts). Esto significa que la
salida será analógica con tensiones entre 0 y 5 volts.
En nuestro caso usamos el módulo ADC del pic 18f4550 para leer la tensión
analógica que obtenemos del sensor CNY70 y convertirla en digital dentro del pic. Esto
lo hacemos con el propósito de hacer un comparador dentro del pic.
Módulo ADC
Este módulo ADC consiste en la representación de un voltaje analógico en un
valor digital. Quiere decir que podemos saber el valor de la tensión analógica dentro
del pic. Una vez que tengamos ese valor podremos analizar ese voltaje para
determinar si el color de la superficie es negro o blanco.
Lo que haremos primero es crear una función de inicialización y configuración del
módulo ADC.
void initADC()
{ // Configuramos el ADC
SETUP_ADC(ADC_CLOCK_INTERNAL); // Usaremos el clock interno
setup_adc_ports(AN0_TO_AN9_ANALOG); // Habilitamos los pines que usaremos como entradas
// analógicas, en este caso del AN0 al AN9
}
#device adc=10
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Una vez que el módulo ADC ha sido configurado está listo para ser usado teniendo en
cuenta lo siguiente:
El módulo ADC solo puede ser usado por un pin analógico a la vez.
El valor de la tensión analógica será representada de 0 a 1024 porque estamos
usando una resolución de 10 bits.
Si un pin está siendo usado como analógico ya no será I/O digital y viceversa.
El pic necesita tener un VREF+ y VREF- para poder tener una referencia de un
máximo y mínimo valor de voltaje, en nuestro caso consideramos lo siguiente:
VREF+ = 5 volts y VREF- = 0 volts.
Como se puede observar solo se puede hacer una lectura a la vez teniendo en
cuantas los voltajes de referencia y la resolución de 10 bits. Ahora veremos los dos
comandos usados para la lectura del módulo ADC.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
SET_ADC_CHANNEL(0);
Colocamos el número
del pin analógico en el
cual queremos hacer
la lectura.
Este comando sirve para establecer que pin analógico hará la lectura.
Ejemplo.
READ_ADC()
Una vez que se ha establecido que pin analógico hará la lectura se usará este
comando para hacer la lectura propiamente dicha. Esta función es propia del
compilador y su característica es que devuelve un valor, quiere decir que tenemos que
usar una variable para asignarle el valor.
Ejemplo
lectura=READ_ADC();
Ejemplo
Estos son los valores obtenidos al hacer la lectura por ADC, pero aun no son los
valores de la tensión analógica leída. Para obtener ese valor tenemos que hacer una
transformación
Analizando estos valores podemos hallar una relación con una regla de 3 simple.
VREF+
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Diagrama de Flujo
INICIO
Establecemos que
pin analógico hará
la lectura
V F
Si voltaje <umbral
FIN
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Código en CCS
#define VREF 5
int I;
{
I=1; // Representa que el color es negro
}
else
{
I=0; // Representa que el color es blanco
}
}
if(cny70_der>=umbral)
{
I_DER=1;
}
else
{
I_DER=0;
}
if(cny70_izq>=umbral)
{
I_IZQ=1;
}
else
{
I_IZQ=0;
}
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
En esta sección abordaremos al detalle el método usado para detectar objetivos a una
determinada distancia. Para este fin usaremos el sensor ultrasónico SRF05.
Este sensor tiene 4 pines para su conexión: 5V, GND, ECO y DISPARO. De estos
pines los más importantes son los siguientes:
Para que el sensor SRF05 funcione primero debemos aplicar un pulso de 10us al pin
DISPARO, luego debemos leer el ancho de pulso del pin ECO para saber la distancia
a la que se encuentra el objeto.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Del DIAGRAMA DE TIEMPOS podemos observar que después que se envió el pulso
de inicio por el pin DISPARO el pin ECO se pondrá a 1 durante la espera. Si
detecta algún objeto en ese instante el pin ECO se colocará a 0.
Ese comportamiento del pin ECO se muestra en las siguientes graficas de ancho de
pulso tomadas con el osciloscopio para diferentes distancias.
Hasta este punto no hemos mencionado como calcular la distancia, pero para esta
aplicación no es necesario saber la distancia a la que se encuentra el objeto sino
saber si esta dentro de ese rango de distancia.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Ahora veremos cómo saber si hay o no un objeto dentro del rango. Para esto
usaremos el tiempo de espera como referencia. Calcularemos cual es el tiempo que se
demoraría la onda en llegar al objeto y regresar.
Por cinemática:
Por ejemplo
El tiempo de espera será 4060 s. Quiere decir que una vez que se haya
enviado el pulso de 10us al pin DISPARO se tendrá que esperar 4060 s para
preguntar al pin ECO si se encuentra en 0 ó 1.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
INICIO
Cada 30ms
Mandar pulso de
10μs por el pin
DISPARO
Hacemos un retardo de
segundos
En esta caso
V F
Si en pin ECO = 1
FIN
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
INICIO
Cada 30ms
Mandar pulso de
10μs por el pin
DISPARO
Hacemos un retardo de
segundos
En esta caso
F V
Si en pin ECO = 0
No detectó contador=contador+1
contador=0
U=0
V F
Si contador=2
Detecto objeto
U=1
contador=0
FIN
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Código en CCS
void PULSO()
{
output_high(disparo); // Ponemos a 1 el pin DISPARO
delay_us(10); // Hacemos un retardo de 10μs
output_low(disparo); // Ponemos a 0 el pin DISPARO
}
void distancia_filtro()
{
if(!input(eco)) // Si el pin ECO esta en 0
{
contador++; // Aumentamos en uno la variable contador
if(contador==2) // Si contador es igual a 2
{
U=1; // Aseguramos que encontró un objeto
contador=0; // Inicializamos la variable contador
}
}
else // Si el pin ECO esta en 1
{
contador=0; // Inicializamos la variable contador
U=0; // Aseguramos que no encontró ningún objeto
}
}
Según el diagrama de flujo el proceso de lectura se hará cada 30ms. Para este
propósito usaremos el modulo TIMER0 del pic 18F4550.
Módulo TIMER
El TIMER es un contador interno del pic el cual se puede configurar para que cada
cierto tiempo realice una acción. Para esta aplicación haremos que cada 30ms haga la
lectura de los sensores ultrasonidos para detectar objetos.
void initTIMER0()
{
SETUP_TIMER_0(T0_INTERNAL| T0_DIV_256);
set_timer0(64950);
enable_interrupts(INT_timer0); // Habilitamos interrupciones
enable_interrupts(GLOBAL); // Habilitamos el interruptor global
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Explicación
SETUP_TIMER_0(T0_INTERNAL | T0_DIV_256);
set_timer0(valor);
Estable un valor de
cuenteo del timer0
Donde:
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Ejemplo
Para establecer el periodo de 30ms del timer0
Despejando:
Entonces:
set_timer0(64950);
Finalmente crearemos la función interrupción para realizar la lectura cada 30ms. Cabe
resaltar que la variable tiempo_espera será asignada en una función posterior.
#int_timer0
void Interrupcion()
{
PULSO(); // Mandamos el pulso de 10μs para iniciar una nueva lectura
while(!input(eco)); // Esperamos que el pic eco esté en 1
delay_us(tiempo_espera); // Hacemos un retardo usando el tiempo de espera
distancia_filtro(); // Llamamos a la función de lectura explicada anteriormente
set_timer0(64950);
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Las funciones explicadas en esta sección se pueden extrapolar para el uso de dos
sensores.
void PULSO()
{
output_high(disparo1);
output_high(disparo2);
delay_us(10);
output_low(disparo1);
output_low(disparo2);
}
void distancia_filtro()
{
if(!input(eco1))
{
contador1++;
if(contador1==2)
{
U_DER=1;
contador1=0;
}
}
else
{
contador1=0;
U_DER=0;
}
if(!input(eco2))
{
contador2++;
if(contador2==2)
{
U_IZQ=1;
contador2=0;
}
}
else
{
contador2=0;
U_IZQ=0;
}
}
GIRO INICIAL
Según las reglas de la categoría sumo en el Perú hay 4 formas de colocar al sumo al
inicio de la pelea.
El giro inicial es muy importante porque define quien atacará primero, y eso es una
gran ventaja en esta categoría. Entonces al comienzo hay que girar en el sentido que
veamos primero al oponente.
Giraremos a la derecha
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
POSICIONES DE INICIO
Frente a frente
De espaldas
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Además de tener dos pulsadores para el giro inicial también se necesita tener un botón
para empezar a combatir.
void botones()
{
if(input(pulsador_derecha)) // Si presionamos el pulsador de la derecha (azul)
{
giro=1; // Esta variable representa el giro a la derecha
}
PERSECUCIÓN DE OBJETOS
La persecución del objetivo es uno de los puntos más resaltantes de este proyecto.
Para esto tendremos que usar los módulos expuestos en las secciones anteriores.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Principio de persecución
En el caso que ninguno de los dos sensores de ultrasonido detecte algún objeto
seguirá haciendo la rutina anterior.
Ahora plantearemos la lógica para la persecución del robot sumo tomando como base
el principio explicado.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
INICIO
V F
SI LOS CNY70s LEEN
BLANCO
Definimos estado=0b00000000
U_IZQ = 1 si detecta objeto el ultrasonido izq
RETROCEDER U_IZQ = 0 si no detecta objeto el ultrasonido izq
U_DER = 1 si detecta objeto el ultrasonido der
U_DER = 0 si no detecta objeto el ultrasonido der
STOP estado
V F
RETARDO DE 200 ms estado=0b00000001
V F
GIRAR A LA DERECHA estado=0b00000010
GIRAR A LA DERECHA V F
estado=0b00000011
GIRAR A LA IZQUIERDA
AVANZAR
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Código en CCS
void PERSEGUIR()
{
unsigned int estado=0; // Definimos la variable estado como entero sin signo
break;
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
Ahora juntaremos todas las funciones explicadas para crear la función batalla.
FUNCIÓN BATALLA
Esta función lo que hace es inicializar al sumo para que comience a luchar. En esta
función se asignará el tiempo de espera para los ultrasonidos , además de efectuar el
giro inicial y llamar a la función PERSEGUIR donde se entrará en un bucle infinito.
void batalla(unsigned long rango) // Esta función necesita la entrada del parámetro distancia del rango
// de pelea
{
tiempo_espera=rango*58; // Calculamos el tiempo de espera que se utiliza para detectar objetos
motores(0,0); // Iniciamos sin movimiento
delay_ms(5000); // Esperamos 5 segundos de acuerdo a las reglas
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
sumo.c
#include <sumo.h>
//++++++++++++++++++++++++++++++++++++++++++++++++
// declaracion de variables globales
//++++++++++++++++++++++++++++++++++++++++++++++++
unsigned int a;
int tiempo_espera;
int giro;
int U_DER,U_IZQ,I_DER,I_IZQ;
unsigned int contador1=0,contador2=0;
#int_timer0
void Interrupcion()
{
PULSO(); // Mandamos el pulso de 10µs para iniciar una nueva lectura
while(!input(eco1)); // Esperamos que el pic eco esté en 1
delay_us(tiempo_espera); // Hacemos un retardo usando el tiempo de espera
distancia_filtro(); // Llamamos a la función de lectura explicada anteriormente
set_timer0(64950);
}
//++++++++++++++++++++++++++++++++++++++++++++++++
//PROGRAMA PRINCIPAL
//++++++++++++++++++++++++++++++++++++++++++++++++
void main()
{
initSYSTEM();
for(;;)
{
botones();
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++
//DEFINICION DE FUNCIONES
//++++++++++++++++++++++++++++++++++++++++++++++++
void initPWM()
{
setup_ccp1(CCP_PWM); // Definimos la primera salida de PWM para el motor 1
setup_ccp2(CCP_PWM); // Definimos la primera salida de PWM para el motor 2
void initADC()
{ // Configuramos el ADC
SETUP_ADC(ADC_CLOCK_INTERNAL); // Usaremos el clock interno
setup_adc_ports(AN0_TO_AN9_ANALOG); // Habilitamos los pines que usaremos como entradas
// analógicas, en este caso del AN0 al AN9
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
void initTIMER0()
{
SETUP_TIMER_0(T0_INTERNAL| T0_DIV_256);
set_timer0(64950);
enable_interrupts(INT_timer0); // Habilitamos interrupciones
enable_interrupts(GLOBAL); // Habilitamos el interruptor global
}
void initULTRASONIDOS()
{
U_DER=0;
U_IZQ=0;
}
void initSYSTEM()
{
initPWM();
initTIMER0();
initULTRASONIDOS();
initADC();
giro=0;
}
void MOTORES(int velocidad1, int velocidad2) // definimos la función que tendrá la entrada de dos parámetros
{
motor1(velocidad1); // asignamos la variable velocidad1 al primer motor
motor2(velocidad2); // asignamos la variable velocidad2 al segundo motor
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
if(cny70_der>=umbral)
{
I_DER=1;
}
else
{
I_DER=0;
}
if(cny70_izq>=umbral)
{
I_IZQ=1;
}
else
{
I_IZQ=0;
}
}
void PULSO()
{
output_high(disparo1);
output_high(disparo2);
delay_us(10);
output_low(disparo1);
output_low(disparo2);
}
void distancia_filtro()
{
if(!input(eco1))
{
contador1++;
if(contador1==2)
{
U_DER=1;
contador1=0;
}
}
else
{
contador1=0;
U_DER=0;
}
if(!input(eco2))
{
contador2++;
if(contador2==2)
{
U_IZQ=1;
contador2=0;
}
}
else
{
contador2=0;
U_IZQ=0;
}
}
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
void botones()
{
if(input(pulsador_derecha)) // Si presionamos el pulsador de la derecha (azul)
{
giro=1; // Esta variable representa el giro a la derecha
}
void PERSEGUIR()
{
unsigned int estado=0; // Definimos la variable estado como entero sin signo
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
void batalla(unsigned long rango) // Esta función necesita la entrada del parámetro distancia del rango
// de pelea
{
tiempo_espera=rango*58; // Calculamos el tiempo de espera que se utiliza para detectar objetos
motores(0,0); // Iniciamos sin movimiento
delay_ms(5000); // Esperamos 5 segundos de acuerdo a las reglas
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
sumo.h
#include <18F4550.h>
#define VREF 5
#device adc=10
#FUSES NOWDT, WDT128, HS, NOPROTECT, BROWNOUT, BORV20, NOPUT, NOCPD, NOSTVREN
#FUSES NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN, NOWRTC
#FUSES NOWRTB, NOEBTR, NOEBTRB, NOCPB, MCLR, LPT1OSC, NOXINST, PLL1
#FUSES CPUDIV1, NOUSBDIV, VREGEN, NOICPRT
#use delay(clock=20000000)
//Declaracion de pines
#define disparo1 PIN_B5
#define eco1 PIN_B4
#define disparo2 PIN_B7
#define eco2 PIN_B6
#define boton_batalla PIN_A4
#define pulsador_derecha PIN_A5
#define pulsador_izquierda PIN_E0
#define IN1_MOTOR1 PIN_D3
#define IN2_MOTOR1 PIN_D2
#define IN1_MOTOR2 PIN_D1
#define IN2_MOTOR2 PIN_D0
//Declaracion de funciones
void initPWM(void);
void initTIMER0(void);
void initULTRASONIDOS(void);
void initADC(void);
void initSYSTEM(void);
void motor1(int PWM1);
void motor2(int PWM2);
void MOTORES(int PWM1, int PWM2);
void PULSO(void);
void distancia_filtro(void);
void infrarrojos(float umbral);
void botones(void);
void PERSEGUIR(void);
void batalla(unsigned long rango);
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
4.3. Logística
4.3.1. Personal
Jorge Abraham Salgado Hervias, nació en mayo del 1985, Lima Perú.
Se diplomo de Ingeniero de electrónica e informática industrial, con
un año de especialización en Sistemas embebidos, en el École
Nationale Supérieure des Sciences Appliquées et de Technologie.
ENSSAT 2011-FRANCIA, egresado de la Universidad Nacional Mayor
de San Marcos, 2008-Peru. Participò en la Copa de robótica en
Francia, 2010. Organizó y expuso sobre robótica en el Perú en la
copa robótica de Tregor, Bretagne. Realizó dos videoconferencias de
robótica entre Perú y Francia. Organizó el primer concurso nacional de robótica en la
UNMSM.Ganador de diversos concursos de robótica a nivel Nacional y un
sudamericano en la categoría Sumo. Actualmente es administrador de RobotsPeru
y asesor principal del grupo de investigación de robótica y Automatización.
(j.salgado@robotsperu.org).
4.3.2. Formación
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
4.3.2. Participación
INTERCON 2010
Este fue el primer evento en el que participamos con el modulo robot sumo
Thor. Todos los miembros del grupo viajamos en diferentes fechas, por
avión, unos días antes del inicio de las conferencias, pero nos
hospedamos en el mismo hotel. Contamos con el apoyo de la facultad para
el hospedaje, alimentación y transporte.
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
FOINTEC 2010
VILLATRONICA 2010
COINTEC 2010
CER 2010
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
5. Costo
COMPONENTES
PRECIO POR
CANTIDAD PRECIO TOTAL
UNIDAD
L5973D
REGULADOR 2 S/ 11.24 S/ 22.48
CMS
RESISTENCIA
50 S/ 0.15 S/ 7.50
de 4.7KΩ
RESISTENCIA
50 S/ 0.10 S/ 5.00
de 2.5 KΩ
RESISTENCIA
50 S/ 0.08 S/ 4.00
de 7.5 KΩ
RESISTENCIA
50 S/ 0.16 S/ 8.00
de 5.1 KΩ
RESISTENCIA
50 S/ 0.15 S/ 7.50
de 10 KΩ
RESISTENCIA
50 S/ 0.15 S/ 7.50
de 220 Ω
RESISTENCIA
50 S/ 0.12 S/ 6.00
de 10 Ω
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
RESISTENCIA
50 S/ 0.16 S/ 8.00
de 30 Ω
CONDENSADOR
10 S/ 1.12 S/ 11.20
de 330uF
CONDENSADOR
10 S/ 0.42 S/ 4.20
de 10uF
CONDENSADOR
10 S/ 0.14 S/ 1.40
de 22nF
CONDENSADOR
10 S/ 1.68 S/ 16.80
de 220pF
CONDENSADOR
10 S/ 0.14 S/ 1.40
de 0.1uF
CONDENSADOR
10 S/ 0.55 S/ 5.50
de 15nF
CONDENSADOR
10 S/ 0.46 S/ 4.60
de 15pF
CONDENSADOR
10 S/ 0.23 S/ 2.30
de 220nF
DIODO
8 S/ 0.32 S/ 2.56
RECTIFICADOR
DIODO LED
10 S/ 0.46 S/ 4.60
ROJO
DIODO LED
10 S/ 0.66 S/ 6.60
VERDE
DIODO LED
10 S/ 0.36 S/ 3.60
AMARILLO
BOBINA de
2 S/ 4.04 S/ 8.08
15uH
CRISTAL
OSCILADOR de 1 S/ 1.00 S/ 1.00
20M
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
MOLEX MACHO
10 S/ 0.73 S/ 7.30
DE 2
MOLEX MACHO
10 S/ 0.70 S/ 7.00
DE 4
MOLEX MACHO
10 S/ 0.96 S/ 9.60
DE 5
MOLEX
10 S/ 0.62 S/ 6.20
HEMBRA DE 2
MOLEX
10 S/ 0.71 S/ 7.10
HEMBRA DE 4
MOLEX
10 S/ 0.96 S/ 9.60
HEMBRA DE 5
BASE MOLEX
1 S/ 8.40 S/ 8.40
HEMBRA DE 5
BASE MOLEX
1 S/ 3 S/ 3.00
MACHO DE 5
ALAMBRE
100 S/ 1.00 S/ 100.00
PARA MOLEX
CONECTORES
DE 2 PARA 20 S/ 0.20 S/ 4.00
CNY70
CABLE
1 S/ 45.00 S/ 45.00
USB/SERIAL
PLACA
2 S/ 15.00 S/ 30.00
IMPRESA
INVERSION
TOTAL EN LOS S/ 755.18
COMPONENTES
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
MATERIALES
PRECIO POR PRECIO
CANTIDAD
UNIDAD TOTAL
LLANTAS DE
2 S/ 5.00 S/ 10.00
CAUCHO
BATERÍA 12V
4 S/ 18.00 S/ 72.00
1.3AH
BOTON DE
2 S/ 15.00 S/ 30.00
PANICO
CABLE
8m S/ 0.70 S/ 5.60
BIPOLAR
ARCO DE
SIERRA 1 S/ 18.00 S/ 18.00
MACHO
ALUMINIO
4m S/ 6.00 S/ 24.00
TIPO L
Proyecto Robot-Sumo
Universidad Nacional Mayor de San Marcos – Robots Perú
RAMPA DE
1 S/ 5.00 S/ 5.00
FIERRO
JUEGO DE
TORNILLOS Y 1 S/ 5.00 S/ 5.00
TUERCAS
CINTA
4 S/ 1.00 S/ 4.00
AISLANTE
INVERSION
TOTAL EN S/ 501.6
MATERIALES
INVERSIÓN INVERSIÓN
TOTAL EN LOS TOTAL EN INVERSIÓN TOTAL
COMPONENTES MATERIALES
6. Agradecimientos
A Flor de María Gaviria Barneto por el apoyo recibido dentro del Instituto de
Investigación.
A Hugo Eduardo Manuel Flores por hacer la primera estructura del proyecto.
Proyecto Robot-Sumo