Sie sind auf Seite 1von 12

Escuela Superior Politcnica

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

3. Diagrama de flujo del programa principal y subrutina


INICIO

S
I

Emparejamiento de
Bluetooth

Se encienden los
sensores

NO

Sensor 1 ON

Distancia < 50 cm

Sensor 2 ON

Distancia < 50 cm

Manda seal serial


al Pic 2

Motor y
parlante
apagado

Manda seal serial


al Pic 2

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

Manda seal serial


al Pic 2

Se Activa Motor
vibrador 2 y el
parlante a
Frecuencia alta

Manda seal serial


al Pic 2

Se Activa Motor
vibrador 1 y el
parlante a

4. Descripcin de algoritmo

Se prende el sistema y se espera a que ambos dispositivos, el Pic que


controla los sensores y el Pic que controla los motores vibradores, se

comuniquen mediante comunicacin serial.


Si el sensor 1 utilizado para detectar objetos de frente, detecta un objeto
a cierta distancia manda por el puerto serial una seal al otro Pic que

activara el motor vibrador 1.


Si la distancia se sigue acortando el primer Pic mandara una seal al
otro Pic para que aumente la frecuencia de vibracin. Este solo se
apagara una vez que el sensor este a una distancia ms lejana del

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

al otro Pic que activara el motor vibrador 2.


Si la distancia se sigue acortando el primer Pic mandara una seal al
otro Pic para que aumente la frecuencia de vibracin. Este solo se
apagara una vez que el sensor este a una distancia ms lejana del

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.

5. listado de programa fuente en lenguaje C.


PARTE 1 (PIC1) Sensores
#define TRIGGER1 PORTA.RA1
#define ECHO1 PORTA.RA2
#define TRIGGER2 PORTA.RA3
#define ECHO2 PORTA.RA4
int distancia1,distancia2,bandera,tiempo1,tiempo2,di1,di2;
unsigned short i;
int Medir_distancia1();
int Medir_distancia2();
void pulsoTrigger1();
void pulsoTrigger2();
void TiempoEcho1();
void TiempoEcho2();

void main() {
ANSEL = 0;

// Configure AN pins as digital

ANSELH = 0;
TRISA = 0b00010100;
salidas

//Configurado bit 2 y 4 como entrada y los demas como

TRISD = 0b00000000;
TRISB= 0xFF;
C1ON_bit = 0;

// Disable comparators

C2ON_bit = 0;

OPTION_REG = 0b10000110;
INTCON = 0;
TMR0

distancia1=0;
distancia2=0;
bandera=0;

// configurado el TMR0 con preescalador 1:128

// Habilitada la interrupcin por el desbordamiento en el registro

TRIGGER1=0;
TRIGGER2=0;
di1=0;
di2=0;

UART1_Init(9600);
Delay_ms(100);

while (1) {

// Initialize UART1 module at 9600 bps


// Wait for UART 1module to stabilize

// Endless loop

distancia1=Medir_distancia1();
distancia2=Medir_distancia2();

if(distancia1<=100||distancia1>50){ //Obstaculo lejos


i=1;
PORTD.RD0=1;
Delay_ms(500);
}

if(distancia1<=50||distancia1>30){ //Obstaculo distancia media


i=2;
PORTD.RD0=1;
Delay_ms(500);
}

if(distancia1<=30){

//Obstaculo muy cerca

i=3;
PORTD.RD0=1;
Delay_ms(500);
}

if(distancia2<=30){
i=4;

//Hueco o Escalera en bajada

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){

// Habilitada la interrupcin por el desbordamiento en el

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);

// Habilitada la interrupcin por el desbordamiento en el

if(INTCON.TMR0IF){
tiempo2=0;
INTCON=0;
}
else if(ECHO2==0){
INTCON=0;
tiempo2=TMR0;
}
}

PARTE 2 (PIC2) MOTORES

unsigned short i=0,bandera=0;


unsigned uart_rd;
int vibracion ;

//Variables a usarse

void main() {
ANSEL = 0;

// Configure AN pins as digital

ANSELH = 0;
C1ON_bit = 0;

// Disable comparators

C2ON_bit = 0;
TRISE= 0; // PORTB como salidas
TRISD= 0;
PORTE= 0;

UART1_Init(9600);

// Initialize UART1 module at 9600 bps

Delay_ms(100);

// Wait for UART 1module to stabilize

PWM1_Init(5000);

// Initialize PWM1 module at 5KHz

PWM2_Init(5000);

// Initialize PWM2 module at 5KHz

Sound_Init(&PORTE, 0);
en que bit de ese puerto

while (1) {

//Inicializar Sound, indicando el puerto donde saldra el sonido y

// Endless loop

if (UART1_Data_Ready()) {

// If data is received,

i= UART1_Read();

// read the received data,

if(i==1)

//El obstaculo esta lejos, a 100 cm, el dispositivo vibra suavemente.

vibracion=1;
else if(i==2)

//El estaculo esta a distancia media, a 50 cm, el dispositivo vibra normal.

vibracion=2;
else if(i==3)
vibracion=3;

//EL obstaculo esta cerca, a 30 cmn el dispositivo sibra

else if(i==4){
vibracion=4;

//Existe un agujero debajo del baston

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);

//Sonido que indica peligro

Sound_play(600,500);
PWM2_Start();
PWM2_Set_Duty(128);

// start PWM1
// Set current duty for PWM1

Delay_ms(15000);
PWM2_Stop();
}

}
}

6. Copia impresa del circuito armado en Proteus.

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.

Das könnte Ihnen auch gefallen