Beruflich Dokumente
Kultur Dokumente
Del Litoral
FIEC
Laboratorio de
Microcontroladores
Proyecto
Bastn y guante electrnico
Alumno:
Miguel Sandoya
Andrs Salazar
Paralelo:
Grupo:
Fecha de presentacin: 29 de
Diciembre del 2015
2015 - 2o Trmino
1. Proyecto:
El proyecto consiste en crear un guante o brazalete con un mini-motor que
genere una vibracin en la mano del usuario cada vez que se encuentre con un
obstculo (la vibracin cambiara segn el obstculo) mediante el uso del
PIC16F887, este debe ser observado por dos sensores de distancia
(Ultrasnico o de luz) y enviado va inalmbrica al guante, la fuerza con la que
vibre el guante debe ser regulada por un potencimetro ubicado en el bastn
junto con un interruptor de encendido del sistema. Cuando se acerque a un
objeto o persona por el frente vibre a un nivel y cuando se acerque a una
escalera u orificio vibre a otro nivel y genere un sonido de alerta.
2. Diagrama de Bloques
Parlante
Sensor
ultrasnico 1
PIC
16F887
Sensor
ultrasnico 2
Motor vibrador 1
Motor vibrador 2
S
I
Emparejamiento de
Bluetooth
Se encienden los
sensores
NO
Sensor 1 ON
Distancia < 50 cm
Sensor 2 ON
Distancia < 50 cm
Motor y
parlante
apagado
Se Activa Motor
vibrador 1 y el
parlante a
Distancia < 25 cm
Motor y
parlante
apagado
Se Activa Motor
vibrador 2 y el
parlante a
Frecuencia Leve
Distancia < 25 cm
Se Activa Motor
vibrador 2 y el
parlante a
Frecuencia alta
Se Activa Motor
vibrador 1 y el
parlante a
4. Descripcin de algoritmo
objeto.
Si el sensor 2 utilizado para detectar objetos por debajo a 45 grados,
detecta un objeto a cierta distancia manda por el puerto serial una seal
objeto.
Ambos motores vibradores se prendern al mismo tiempo si solo si la
persona no vidente esta frente a una persona y tiene un hueco por
delante o si est bajando una escalera y una persona viene subiendo
frente a l.
void main() {
ANSEL = 0;
ANSELH = 0;
TRISA = 0b00010100;
salidas
TRISD = 0b00000000;
TRISB= 0xFF;
C1ON_bit = 0;
// Disable comparators
C2ON_bit = 0;
OPTION_REG = 0b10000110;
INTCON = 0;
TMR0
distancia1=0;
distancia2=0;
bandera=0;
TRIGGER1=0;
TRIGGER2=0;
di1=0;
di2=0;
UART1_Init(9600);
Delay_ms(100);
while (1) {
// Endless loop
distancia1=Medir_distancia1();
distancia2=Medir_distancia2();
if(distancia1<=30){
i=3;
PORTD.RD0=1;
Delay_ms(500);
}
if(distancia2<=30){
i=4;
PORTD.RD1=1;
Delay_ms(500);
}
UART1_Write(i);
}
}
//Ultrasonido1
int Medir_distancia1()
{
pulsoTrigger1();
TiempoEcho1();
di1=((tiempo1*128)/29)/2;
//128 ES EL VALOR DEL PREESCALADOR, SE LO
MULTIPLICA PORQUE DIVIDE LA FRECUENCIA EN 128, PARA OBTENER EL TIEMPO
CORRECTO
return di1;
}
void pulsoTrigger1()
{
TRIGGER1=1;
delay_us(10);
TRIGGER1=0;
}
void TiempoEcho1()
{
while(!ECHO1);
TMR0=0;
INTCON = 0xA0;
registro TMR0
while(ECHO1&&!INTCON.TMR0IF);
if(INTCON.TMR0IF){
tiempo1=0;
INTCON=0;
}
else if(ECHO1==0){
INTCON=0;
tiempo1=TMR0;
}
}
//Ultrasonido2
int Medir_distancia2()
{
pulsoTrigger2();
TiempoEcho2();
di2=((tiempo2*128)/29)/2;
//128 ES EL VALOR DEL PREESCALADOR, SE LO
MULTIPLICA PORQUE DIVIDE LA FRECUENCIA EN 128, PARA OBTENER EL TIEMPO
CORRECTO
return di2;
}
void pulsoTrigger2()
{
TRIGGER2=1;
delay_us(10);
TRIGGER2=0;
}
void TiempoEcho2()
{
while(!ECHO2);
TMR0=0;
INTCON = 0xA0;
registro TMR0
while(ECHO2&&!INTCON.TMR0IF);
if(INTCON.TMR0IF){
tiempo2=0;
INTCON=0;
}
else if(ECHO2==0){
INTCON=0;
tiempo2=TMR0;
}
}
//Variables a usarse
void main() {
ANSEL = 0;
ANSELH = 0;
C1ON_bit = 0;
// Disable comparators
C2ON_bit = 0;
TRISE= 0; // PORTB como salidas
TRISD= 0;
PORTE= 0;
UART1_Init(9600);
Delay_ms(100);
PWM1_Init(5000);
PWM2_Init(5000);
Sound_Init(&PORTE, 0);
en que bit de ese puerto
while (1) {
// Endless loop
if (UART1_Data_Ready()) {
// If data is received,
i= UART1_Read();
if(i==1)
vibracion=1;
else if(i==2)
vibracion=2;
else if(i==3)
vibracion=3;
else if(i==4){
vibracion=4;
if(vibracion==1){
PORTD.RD1 = 1;
Delay_ms(1000);
PWM1_Start();
PWM1_Set_Duty(128);
// start PWM1
// Set current duty for PWM1
Delay_ms(15000);
PWM1_Stop();
}
else if(vibracion==2){
PORTD.RD1 = 1;
Delay_ms(1000);
PWM1_Start();
PWM1_Set_Duty(128);
Delay_ms(15000);
PWM1_Stop();
}
else if(vibracion==3){
PORTD.RD1 = 1;
Delay_ms(1000);
// start PWM1
// Set current duty for PWM1
PWM1_Start();
PWM1_Set_Duty(128);
// start PWM1
// Set current duty for PWM1
Delay_ms(15000);
PWM1_Stop();
}
else if(vibracion==4){
PORTD.RD0 = 1;
Delay_ms(1000);
Sound_play(500,500);
Sound_play(600,500);
PWM2_Start();
PWM2_Set_Duty(128);
// start PWM1
// Set current duty for PWM1
Delay_ms(15000);
PWM2_Stop();
}
}
}
7.Conlusiones
Se utiliz las interrupciones para poder lograr una temporizacin de los
distintos procesos, as se consigui que cada proceso se realice en un
tiempo determinado. Uno de los principales problemas que tuve fue al
momento de manejar subrutinas dentro de la interrupcin ya que no
estaba sealando el fin de los procesos con banderas.
El uso de banderas para sealar el fin de los procesos fue de gran
ayuda ya que as se pudo lograr la temporizacin de cada parte e
incluso agregar ms subrutinas.
Fue muy importante el conocimiento de instrucciones bsicas como
subwf o decfsz ya que estos nos ayudaron a controlar los tiempos y
tener una mayor precisin.
En la parte de llenado de botella nos cost al principio entender como
haba que realizarlo, luego con ayuda de una variable que fuera
decrementando y cada vez que llegara a 0 pasara a la siguiente
subrutina logramos el efecto de ver que la botella se fuera llenando.
En los parmetros de siguiente y final se logro cubrir todos los posibles
aspectos es decir cuando final este activado asi se prenda siguiente o
fruta esta no se activara mientras final este activo
Lamentablemente el proceso de alarma no se pudo realizar ya que no
alcance a entender cmo poner un delay que funcione dentro de la
interrupcin sin que al ser desactivada me afecte el proceso antes
hecho.
La parte de Soda tampoco funciono bien ya que no pude realizar la
temporizacin debido a que al aumentar las instrucciones dentro de mi
interrupcin esta se me desbordaba, sin embargo el llenado de la botella
funciono bien.
8.Recomendaciones
Realizar bien las conexiones en el Proteus y colocar etiquetas para
identificar cada elemento y la funcin que realiza as se es ms fcil de
entender al momento de explicar.
Lo mismo en el cdigo poner etiquetas o comentarios en las lneas de
cdigo para que el mismo programador y personas que lo quieran
entender puedan comprender de mejor manera.
Tener pleno conocimiento de las instrucciones que se realiza para poder
hacer adecuaciones o mejoras al programa, como mas precisin o mas
elementos.