Universidad
de Chile
Facultad de Ciencias Físicas y Matemáticas
Departamento de Ingeniería Eléctrica
INFORME
FINAL
TALLER DE DISEÑO EN SISTEMAS DIGITALES I
“VEHÍCULO
AUTOCONTROLADO
TODO
TERRENO”
|
PROFESOR |
: |
Mauricio Bahamonde |
|
INTEGRANTES |
: |
Claudio Garretón |
|
|
|
Mauricio Casanova |
|
|
|
Cristian Monges |
|
|
|
Patricio Arzola |
|
|
|
Andrés Ramírez |
|
|
|
Alonso Fernández |
|
|
|
Alfredo Nuñez |
|
Fecha |
: |
15 de julio 2005 |
Índice
Esquema del Circuito de Control
Conexión
de Brújula Digital mediante I2C a un PIC
Diagrama de bloques algoritmo de control con
faros IR
Diagrama de bloques algoritmo de control con
temporizador
En el presente
informe se bosqueja el trabajo realizado por alumnos del curso EL54D (Taller de Diseño en Sistemas Digitales I)
sobre el desarrollo de un prototipo de vehículo todo-terreno a escala con
navegación automatizada.
Este escrito consta de tres secciones principales. En
la primera parte se relatan los problemas
de carácter técnico y de gestión que debieron enfrentarse a lo largo del
desarrollo del proyecto. Luego, en la segunda, se explica esquemáticamente el
resultado final del diseño realizado y, finalmente en la tercera sección, se detalla cada uno de los bloques de trabajo (uso de brújula, diseño del
controlador, etc) necesarios para la creación del modelo completo.
Se espera que la lectura de este informe
sea útil y de agrado para el lector. Se
ha intentado reflejar y transmitir toda
la experiencia de éxitos y fracasos adquirida por el grupo de trabajo durante
este desarrollo.
Antes que todo, anunciamos que en la redacción de
esta sección del informe nos hemos eximido de usar el habitual narrador en
tercera persona, con el objetivo de expresar con mayor claridad y fluidez
ciertos conceptos y observaciones personales que aquí ameritan mencionarse.

Viendo convertido todo nuestro trabajo semestral en
unas cuantas líneas apuradas en un editor de texto, cabe la inquietud de
preguntarse el por qué. ¿Por qué el vehículo comenzó a fallar justo en el
momento de la verdad? ¿Cómo llegamos a terminar en el parque O’Higgins con la
cabeza gacha y los calcetines mojados? A continuación recapitularemos nuestras
decisiones pasadas y trataremos de analizarlas en términos de los resultados
obtenidos.
Las bases de la competencia declarada por el profesor,
parecían tan claras como difíciles de seguir:
-
Carrera de vehículos
todo-terreno a escala con navegación automática por una pista de recorrido
triangular (perímetro de 90 mts), definida el mismo día de la carrera.
-
Posible utilización de
dispositivos externos que ayuden en la navegación.
-
Robustez ante
obstáculos y situación climática
Con estas tres leyes nos devanaríamos los sesos por
varias semanas pues, para resolver inequívocamente estos requerimientos, se
hacía necesario implementar intrincadas tecnologías. Se pensó en utilizar
sistemas de localización como GPS o triangulación por radiofaros, se propuso
levantar un trazado de pista detectable por el vehículo, se planteó la
demarcación del circuito mediante “boyas” de emisores infrarrojos, entre otras
varias soluciones de avanzada técnica.

Afortunadamente, de un momento a otro los
requerimientos de competencia se “relajaron” pues la pista pasó a ser rectangular(ángulos sencillos y definidos). Lamentablemente,
por nuestra parte, no nos habituamos rápidamente
al nuevo escenario de competencia y, en lugar de pensar en la solución más
simple posible, se decidió utilizar complicados faros infrarrojos para marcar
los vértices del circuito.
Si bien habían
buenas intenciones, los resultados con los faros infrarrojos al aire libre
fueron paupérrimos. Era extremadamente difícil que un sensor en el automóvil
alcanzase a percibir un faro a una distancia mayor que 30 cms en un día soleado
y la detección se hacía prácticamente imposible a cualquier distancia en un día lluvioso.
Además, el tiempo utilizado en la implementación de estos faros fue enorme,
absurdo en comparación con todos los métodos que se nos ocurren ahora para
resolver el circuito de la pista.

Por estas circunstancias, concluimos que los objetivos
y requerimientos de un proyecto deben estar siempre bien especificados para
poder elaborar la solución más sencilla.
Planificación:
Cuando apenas quedaban días para la carrera, nuestro
equipo de trabajo repletaba el laboratorio de electrónica con problemas,
soluciones, dudas, esperanzas y desafíos irresolutos. Daba gusto ver tanto
trabajo tan bien hecho, sin embargo el tiempo apremiaba y los plazos se vencían
rápidamente.
Evidentemente nos faltó una buena etapa de diseño
donde las variables del problema fueran enumeradas y resueltos todos los
problemas previsibles. Además habría sido de inmensa utilidad haber
identificado los puntos críticos del proyecto y haber reservado tiempo para
realizar pruebas de funcionamiento.
Otro beneficio de planificar bien un proyecto es la
posibilidad de obtener versiones incompletas pero funcionales del producto, de
modo de que si no se alcanza a terminar completamente el desarrollo, se tiene
de todas maneras algún prototipo presentable.
Pastelero a tus Pasteles:
Si bien nuestro vehículo era el más rápido de la
competencia, la elección de éste, muy económica pues es de propiedad del
departamento, fue algo apresurada. Debido a fallas detectadas al comienzo del
semestre, se tuvieron que hacer varias reparaciones en las cuales no se tenía
mucha experiencia pues el motor que se usó es de combustión. Ahora, a finales
del semestre, los integrantes del equipo conocemos al dedillo su funcionamiento
y podemos hacerlo funcionar fácilmente, sin embargo este dominio costó mucho
esfuerzo, dedicación y, sobre todo, tiempo. Todo esto podría haberse ahorrado
usando motores eléctricos, para los cuales en esta misma universidad ya hemos
aprobado varios cursos teóricos y prácticos. En resumen, es recomendable usar
los conocimientos que se tienen a priori, si es que sirven para solucionar el
problema.
Bueno, también hay que reconocer las virtudes de
nuestro trabajo. A pesar de los resultados (que tampoco son tan malos), hemos
coincidido en que el grupo trabajó bastante bien organizacionalmente, es
decir, hubo comunicación buena y
constante entre los integrantes y casi todos aportaron lo mejor de sí al
trabajo.
Finalmente, a pesar de todos los esfuerzos, nuestros errores costaron caro en el parque O’Higgins. Un engranaje maltrecho terminó por romperse a instantes de la carrera final, dejando impotente a nuestro todo-terreno frente a la pista mojada. Los sistemas de control expectantes y sensibles se volvieron fútiles ante la impavidez de la tracción mecánica. Todo el trabajo se había convertido en una situación ridícula a mitad del parque, en medio de los charcos de agua. Eso sí, la próxima carrera no la perdemos
El vehículo usado fue un Duratrax Nitro Evader BX,
el cual contaba con las siguientes características:
Para el funcionamiento de la dirección, el auto
contaba con servos en el tren delantero, los que regulando su paso mediante una
señal de control se puede doblar en el sentido que se desee, un dibujo de estos
es el siguiente:


En estas imágenes se pueden ver todos los componentes
que son necesarios para el correcto funcionamiento de los servos, desde los
tornillos, pasando por los brazos de los servos, los que se conectan al eje
delantero, hasta el modulo de control de dichos servos.
Además de este tipo de servo, el auto cuenta con un
servo para manejar el acelerador o freno según sea necesario, cabe señalar que
este auto solo puede circular hacia delante, al girar este servo en una
dirección se acelera el auto, y al moverlo en sentido opuesto se frena, este
servo es el que se ve a continuación:



Mediante la mariposa puesta en el servo se logra
controlar tanto el acelerado del auto como el freno.
El control de la aceleración se puede ver en la
siguiente figura:

En las próximas figuras se puede ver que esta misma
mariposa controla el freno



También se debe decir que ya que este auto poseía un
motor a combustión era necesario la instalación de un filtro de aire para poder
suministrarle al motor aire lo mas limpio posible de impurezas (pequeñas
piedras, trozos de palo, etc.). Las partes constitutivas de este se pueden
apreciar a continuación:

Como es de esperarse para este tipo
de motores se cuenta además con un carburador, el que es el encargado de
proveer al motor la mezcla exacta entre combustible (en este caso una
combinación entre alcohol y nitro metano) y aire, una foto de este es la que se
ve luego:



Se puede ver en las figuras que la cantidad de combustible
y la cantidad de aire que se mezclan en el carburador se pueden regular de
forma separada, pudiéndose llegar a más de un punto óptimo de carburación.
Dado que este auto no cuenta con bujías para su
puesta en marcha, se cuenta con una bujía incandescente junto a un partidor el
que le permite a la bujía incandescente prenderse, con la cual puede poner en
marcha el motor, esta bujía junto al motor se puede ver en la figura.

Se tiene que este motor es uno de dos tiempos con un
solo pistón, para poderle enviarle la potencia a el eje trasero (solo a este ya
que el auto no es del tipo tracción integral, solo cuenta con tracción trasera,
la que basta para un correcto funcionamiento), cuenta con un sistema de
transmisión y embrague, los que le permiten traspasar en el mejor grado posible
la potencia desde el motor al eje, para esto se cuenta con un sistema de
engranajes, esto se puede ver en la siguiente figura:




En las figuras anteriores se pueden ver las partes
constitutivas más importantes del sistema de transmisión como son: el
diferencial, la caja de cambios, el embrague del slipper, y el sistema motor –
embrague.
Además se debe decir que el sistema de suspensión con
el que se cuenta es del tipo independiente con amortiguadores y resortes, los que
pueden ser regulador para darle una mayor o menor altura al vehiculo para así
adecuarlo a las condiciones de los caminos por los que se le haga circular.

Por ultimo también hay que decir que el auto cuenta
con un estanque de combustible el que le permite tener un rango de autonomía
bastante bueno.

Para finalizar se debe decir que la forma de poner en
marcha el vehiculo es una vez puesto el partidor, junto al motor se tiene una
cuerda la que al tirarla se acciona el motor.
Un esquema con todas las piezas que componen el auto
se puede ver en la siguiente figura:


Los servos son un tipo especial de motor que se caracterizan por su
capacidad para posicionarse de forma inmediata en cualquier posición dentro de
su rango de operación.
Para ello, el servo espera un tren de pulsos que se corresponden con el
movimiento a realizar. Están generalmente formados por un amplificador, un
motor, la reducción de engranaje y la realimentación, todo en un misma caja de pequeñas dimensiones. El resultado es un
servo de posición con un margen de operación de 180° aproximadamente.

Se tienen
tres conexiones eléctricas: Vcc (roja), GND(negra)
y entrada de control (amarilla). Estos colores de identificación y el orden de
las conexiones dependen del fabricante del servo. Es importante identificar las
conexiones ya que un voltaje de polaridad contraria podría dañar el servo.
El control
de un servo se limita a indicar en que posición se debe situar. Estas ordenes consisten en una serie de pulsos. La duración del
pulso indica el ángulo de giro del motor. Cada servo tiene sus márgenes de
operación, que se corresponden con el ancho del pulso máximo y mínimo que el
servo entiende. Los valores más generales corresponde
con valores entre 1 [ms] y 2 [ms], que dejarían al motor en ambos extremos. El
valor 1,5 [ms] indicaría la posición
central, mientras que otros valores del pulso lo dejan en posiciones
intermedias. Estos valores suelen ser los recomendados, sin embargo, es posible
emplear pulsos menores de 1 [ms] o
mayores de 2 [ms], pudiéndose conseguir ángulos mayores de 180°. Si se
sobrepasan los límites de movimiento del servo, éste comenzará a emitir un
zumbido, indicando que se debe cambiar la longitud del pulso.
El periodo
entre pulso y pulso no es crítico, e incluso puede ser distinto entre uno y
otro pulso. Se suelen emplear valores entre 10 [ms] y 30 [ms]. Si el intervalo entre pulso y
pulso es inferior al mínimo, puede interferir con la temporización interna del
servo, causando un zumbido, y la vibración del brazo de salida. Si es mayor que
el máximo, entonces el servo pasará a estado dormido, entre pulsos. Esto
provoca que se mueva con intervalos pequeños.
Es
importante destacar que para que un servo se mantenga en la misma posición
durante un cierto tiempo, es necesario enviarle continuamente el pulso
correspondiente. De este modo, si existe alguna fuerza que le obligue a
abandonar esta posición, intentará resistirse. Si se deja de enviar pulsos (o
el intervalo entre pulsos es mayor del máximo) entonces el servo perderá fuerza
y dejará de intentar mantener su posición, de modo que cualquier fuerza externa
podría desplazarlo.

Tren de pulsos para control del servo
PWM
(Pulse Width Modulation) o lo que es lo mismo "Modulación por Anchura de
Pulso", es uno de los sistemas más empleados para el control de servos.
Este sistema consiste en generar una onda cuadrada, donde se varía el tiempo
que el pulso está a nivel alto, manteniendo el mismo periodo (normalmente), con
el objetivo de modificar la posición del servo según se desee.
Para la
generación de una onda PWM en un microcontrolador, lo más habitual es usar un
timer y un comparador (interrupciones asociadas), de modo que el
microcontrolador quede libre para realizar otras tareas, y la generación de la
señal sea automática y más efectiva. El mecanismo consiste en programar el
timer con el ancho del pulso (el periodo de la señal) y al comparador con el
valor de duración del pulso a nivel alto. Cuando se produce una interrupción de
overflow del timer, la subrutina de interrupción debe poner la señal PWM a
nivel alto y cuando se produzca la interrupción del comparador, esta debe poner
la señal PWM a nivel bajo.

PWM para recorrer todo el rango de operación del servo
En
el proyecto del vehículo se ocupó un servo para control de velocidad, y otro
para controlar la dirección. Esto consistió en utilizar una señal modulada para
la entrada de Enabled del puente en H que controla el motor. Lo que se hizo fue
poner la señal de activación a nivel activo durante un tiempo, que es el ciclo
de trabajo, e inactiva durante el tiempo que reste para completar un periodo
fijo, por ejemplo de 5[ms]. Si la señal está activa durante los 5[ms], entonces
no estará inactiva nunca y el motor irá al 100% de su velocidad. Si el ciclo de
trabajo es del 50% (activa 2.5[ms], inactiva 2.5[ms])
el motor estará al 50% (como si le introdujésemos la mitad del voltaje). Si el
ciclo de trabajo es del 10% (500[us] activo 4.5[ms] inactivo) el motor estará al 10%, y así
sucesivamente. Lo ideal para los motores es usar un PWM con una frecuencia de más
de 1KHz (así no se descarga la bobina y los picos de corriente son menores, es
por tanto más efectivo), pero el problema es que a esta frecuencia los motores
pitan, pues la frecuencia está dentro de la banda audible. No pasa nada porque
piten, pero es molesto. Por ello se suelen utilizar frecuencias de más de
20KHz.
El PWM sirve en este caso para modular la velocidad de los motores sin tener que recurrir a un DAC y un transistor, método mucho más inefectivo en cuanto al consumo
En este documento se muestra la
implementación de la lectura de una brújula digital CMPS03, que está basada en
el sensor magnético Philips KMZ51. La disposición de pines se muestra en la ¡Error! No se
encuentra el origen de la referencia..

Imagen de brújula CMPS03
Por el pin 4 se puede observar la salida analógica
del módulo. Esta señal es una señal de ancho de pulso variable, que se rige por
la siguiente expresión:
ancho_pulso = (65 + (ángulo en grados)*100) [us].
El período de la señal es el ancho
del pulso más 1 [ms]. Un diagrama se muestra en

Diagrama de pulsos de salida de
brújula
Esta señal es útil para realizar acciones de
depuración una vez que la brújula ya esté conectada, por ejemplo, para revisar
perturbaciones frente a campos magnéticos
Para
conectar la brújula a un bus I2C es necesario realizar resistencias pullup de
1.2K (hacia 5V) en los pines 3 y 2. En la ¡Error!
No se encuentra el origen de la referencia. se
muestra un esquemático de las conexiones con un microcontrolador PIC18F242.

Esquema de Conexiones de Brújula con microcontrolador
PIC mediante I2C
La brújula
siempre trabaja como esclava (slave). En caso que esté sólo conectado el
microcontrolador y la brújula, el primero debe estar configurado como maestro
(master). La secuencia de bits que se observa en una comunicación entre la
brújula y el microcontrolador se observa en

Figura 1
Secuencia de valores para la comunicación I2C con la brújula
La secuencia anterior se puede
resumir como la siguiente:
Start bit
Enviar_dirección brujula, bit lectura en 0 (en este caso 0xC0)
Enviar_instrucción
Start bit
Enviar_dirección_brújula, bit lectura en 1 (en este caso 0xC1)
Recibir_datos
Stop Bit
La brújula tiene un total de 16
bytes de registros, algunos de los cuales forman registros de 2 bytes tal y
como puede verse en la siguiente tabla:
|
Registro |
Función |
|
0 |
Numero de
Revisión del Software |
|
1 |
Dirección.
en 1 byte 0-255 para 0 - 360º |
|
2,3 |
Dirección.
en 2 bytes 0-3599 para 0 - 359,9º |
|
4,5 |
Test
interno señal diferencial sensor 1 |
|
6,7 |
Test
interno señal diferencial sensor 2 |
|
8,9 |
Test
interno, valor de calibración 1 |
|
10,11 |
Test
interno, valor de calibración 2 |
|
12 |
Sin usar,
devuelve 0 |
|
13 |
Sin usar,
devuelve 0 |
|
14 |
Sin usar,
devuelve 0 |
|
15 |
Comando
de calibración, escribir 255 para calibrar |
Este documento no se realizará la revisión de
calibración de la brújula, pues es necesaria una brújula “analógica” para
realizar esto.
El código para ser compilado con PICC se muestra a
continuación
#include <18F242.h>
#use delay(clock=20000000)
#fuses NOWDT,WDT128, HS,
BORV20, STVREN, NOLVP, NODEBUG, NOBROWNOUT
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
int main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
i2c_start(); //
Condición de inicio
i2c_write(0xc0); // Dirección de brújula, data bit 0
i2c_write(0x01); //
Instrucción
i2c_start();
i2c_write(0xc1); //
Dirección de brújula, data bit 1
data1 = i2c_read(0);
// recepción de datos
i2c_stop(); // detener comunicación
delay_ms(200); // delay para refresco
}
Debido a que el objetivo que persigue la carrera es que el auto se comporte
de manera autónoma y siga un determinado circuito, es necesario que se produzca
una señal que indique el momento y lugar donde el auto debería doblar para
seguir este circuito, debido a esto se diseñaron faros de emisión infrarroja,
que se ubicarían en las cuatro esquinas del trazado y actuarían sobre el
receptor ubicado en el circuito controlador.
Como ya se ha dicho, la comunicación infrarroja se
divide en dos etapas, la emisión y la recepción:
El elemento principal de este circuito es el receptor
de luz infrarroja IS1U60 de Sharp, que se muestra en la figura 1, este
componente se activa cuando recibe una luz infrarroja modulada a una frecuencia
de 38 Khz. (el haz infrarrojo se apaga y enciende 38000 veces por segundo).
Esto los hace compatibles con un gran numero de mandos
a distancia de electrodomésticos.


Fig. 1. Esquema de pines del IS1U60 y vista física
Junto al IS1U60, el circuito se compone de una
resistencia y un condensador para filtrar señales no deseadas que interfieran
con el normal funcionamiento del circuito, tal como se muestra en la figura 2.

Fig. 2. Filtro para el IS1U60
Experimentalmente se obtuvo que el receptor entregaba 5[V] en ausencia
de luz infrarroja, y un valor cercano a 2.5[V] cuando
se le acercaba una fuente de este tipo de luz. Para hacer compatible este tipo
de voltajes con la lógica binaria TTL del circuito microcontrolador, se diseñó
un circuito adicional consistente en un comparador cuya salida ingresaba a un
inversor TTL con el objetivo de eliminar los ruidos que habían logrado
sobrepasar el filtro del receptor, así como también lograr un perfecto
acoplamiento con el microcontrolador PIC. El esquema aparece en la figura 3.

Figura 3. Módulo adicional para el receptor.
Finalmente el circuito receptor completo está dado
por:

Figura 4. Esquema receptor Completo
Para activar el receptor se necesita enviar una señal de 38[KHz] de
frecuencia a través de un diodo emisor de luz infrarroja. Esta tarea se logró
utilizando el conocido circuito integrado LM555.
Figura
5. Circuito transmisor infrarrojo
La frecuencia de salida del circuito está dada por
0.693*C1*(R1+R2). Como C1 = 1[nF] y R1=15[K], el valor de la
resistencia de ajuste R2 deberá estar en un valor cercano a 3.979[K].
En este caso la salida no está tomada directo del pin 3 del LM55, este pin se
conecta a resistencia limitadora de corriente que ingresa a un transistor con
el objetivo de aumentar la potencia de salida. Otro punto que será importante
mas adelante es el interruptor S1, que inhibe la salida cuando esta cerrado, es
decir el reset esta en “
Para evitar interferencias con los otros equipos, y
poder ajustar el alcance del transmisor, se decidió hacer dos cambios con
respecto al circuito original:
-
Agregar una resistencia
de ajuste en serie con R3 para ajustar la potencia de salida.
-
Generar un código
simple a través de otro LM555 como multivibrador astable que actuará sobre el
reset del circuito de la figura 5 evitando interferencias con otros equipos.

Fig. 6. Esquema completo del transmisor
La parte inferior del circuito es un LM555 conectado como multivibrador
astable, que proporciona aproximadamente 100[Hz] al reset del transmisor, es
decir, se están enviando 100 pulsos de 38[KHz] al receptor, que en el programa
del microcontrolador deben ser interpretados como la señal infrarroja
perteneciente a los faros de nuestro equipo.
Al tener los dos circuitos armados y soldados en
placas universales se procedió al testeo de los circuitos. Se probó el alcance
del transmisor cuando el receptor estaba fijo y también cuando el receptor iba
en el interior del auto en movimiento, sin embargo estas pruebas siempre se
hicieron en entornos cerrados o cuando el sol no presentaba tantas
interferencias cómo el día de la primera carrera, en el momento se trató de
cubrir el emisor y receptor para que la luz solar tuviera menos efectos, pero
sólo se logró un alcance aproximado de 30[cm] por lo que había


La programación de los controles de velocidad y
navegación, pasó por cuatro etapas distintivas, a saber:
Los distintos códigos tienen varias partes comunes;
la que trata sobre la comunicación I2C con la brújula, el control del Display
LCD y los timers para formar los
pulsos PWM de los controles de velocidad y giro.
Las diferencias fundamentales se ven en la parte main del código.


El código anterior se puede dividir en tres etapas:
el encendido de la brújula, la inicialización de la brújula y el régimen
permanente. El PIC actúa como Maestro,
la señal de reloj se envía por el PIN C3 y la señal de datos por el PIN C4.
En el encendido de la brújula (líneas
En la inicialización (líneas
En operación en régimen permanente (líneas
El delay es necesario para retrasar el procesador de
la brújula y así obtener una correcta
sincronización con la velocidad del PIC.
Para realizar un debug rápido y fácil se utilizó una
librería para control de un LCD.

Para el control del LCD se debe primero y antes que
todo, inicializar el LCD (línea 5). Para escribir en él se usa el comando lcd_putc el que escribe las variables
entregadas. Los strings \f y \n tienen significados especiales, el primero es
para limpiar el display y el segundo salta al comienzo de la segunda línea.
El control de los servos de la dirección y el paso de
aire al motor de combustión se hace mediante PWM, para construir esta señal se
utilizó un timer del PIC.

El control envía un high por el PIN B7 del PIC (PIN para el control del servo de la
dirección) cada vez que el timer es
menor o igual que el valor de control de la dirección a (el cálculo de a se
explica más adelante), y envía un low
en caso contrario (líneas
I. Control
de navegación proporcional con giros de 90º hacia la derecha en las
esquinas al detectar faros y control de velocidad según estado.
1
... ... ... 2
int1 CC; 3
int1 CC2; 4
int16 a; 5
int16 vel; 6
int16 s; 7
int valor; 8
int16 data1; 9
int aux1; 10 int aux2; 11 int aux3; 12 int flag = 0; 13 ... ... ... 14 void main(){ 15 setup_adc_ports(NO_ANALOGS); 16 setup_adc(ADC_OFF); 17 setup_psp(PSP_DISABLED); 18 setup_spi(FALSE); 19 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); 20 setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); 21 setup_timer_2(T2_DIV_BY_1,215,1); 22 lcd_init(); 23 //enable_interrupts(INT_TIMER1); 24 enable_interrupts(INT_TIMER2); 25 enable_interrupts(global); 26 CC=0; 27 data1 = 0xc0; 28
ref=0xc0; 29
i2c_start(); //
Condición de inicio 30
i2c_write(0xc0); //
Dirección de brújula, data bit 0 31 i2c_write(0x01); //
Instrucción 32 i2c_start(); 33
i2c_write(0xc1); //
Dirección de brújula, data bit 1 34
ref = i2c_read(0); // recepción de datos 35
i2c_stop(); //
detener comunicación 36
delay_ms(100); //
delay para refresco 37
while(ref==255){ 38
i2c_start(); //
Condición de inicio 39
i2c_write(0xc0); //
Dirección de brújula, data bit 0 40
i2c_write(0x01); // Instrucción 41
i2c_start(); 42
i2c_write(0xc1); //
Dirección de brújula, data bit 1 43
ref = i2c_read(0); // recepción de datos 44
i2c_stop();
// detener comunicación 45
delay_ms(100); 46
}
47
while (1){ 48
i2c_start(); //
Condición de inicio 49
i2c_write(0xc0); //
Dirección de brújula, data bit 0 50 i2c_write(0x01); //
Instrucción 51 i2c_start(); 52
i2c_write(0xc1); //
Dirección de brújula, data bit 1 53
data1 = i2c_read(0); // recepción de datos 54
i2c_stop();
// detener comunicación 55
delay_ms(100); //
delay para refresco 56 a=29; 57 vel=31; 58 if(input(PIN_B6) && flag == 0){ 59 ref+=64; 60 flag = 1; 61 vel=30; 62 } 63 aux1=data1; 64 aux2=ref; 65 if(aux1<aux2){ 66
a=29+((aux2-aux1)/5); 67 } 68 else if(aux1>aux2){ 69
a=29-((aux1-aux2)/5); 70 } 71 else{ 72 a=29; 73 flag=0; 74
vel=31; 75
} 76
printf(lcd_putc,"\f data1=%u ",aux1); 77
printf(lcd_putc,"\n ref=%u a=%u",aux2,a); 78
}//while(1) 79
}
En este esquema, la navegación se realiza mediante un
control proporcional a la diferencia entre la referencia (aux2) y el dato
actual (aux1) de la brújula (líneas
II. Control
de navegación proporcional con giros de 90º hacia la izquierda en las
esquinas al detectar faros y control de velocidad según estado y ajustable.



En este esquema se usó un tipo de
navegación similar al usado en el esquema anterior con la diferencia de que el
control proporcional es más sensible para doblar a la izquierda que para doblar
a la derecha, esto fue implementado así ya que el servo motor de la dirección
no reaccionaba de manera simétrica (líneas
Para el control de la velocidad se agregó
un control externo que permite modificar las dos velocidades utilizadas
poniendo los PINES B2, B3 y B4 en high
o low, según la fórmula calib (líneas
III. Control
de navegación binario con giros de 90º hacia la izquierda en las
esquinas al detectar faros y velocidad
constante.
En este esquema se trabajó la navegación igual que en
el esquema anterior. La diferencia se presenta en el control de velocidad que
ya no se realiza de manera digital sino mecánica.
IV. Control
de navegación binario con giros de 180º hacia la izquierda en las
esquinas al finalizar timer y velocidad
constante.


Es este esquema se utilizaron timers para determinar
los momentos en que debían realizarse los giros. Se determinó que para un
correcto funcionamiento la referencia debía ser modificada en 92 en vez de 128
(línea 36). Se implementó un sistema que permite incrementar y decrementar los
timers en 15 ciclos while a través de los PINES B1 y B2 del PIC (línea 29). Las
variables timerflag sólo sirvieron de
ayuda para debbugear el programa.