top of page

Proyecto Final

Introducción:

En en este nuevo siglo XXI se esta tratando de implementar mas inclusion hacia la sociedad en general y el tema de las personas con capacidades diferentes entra en esto mismo, por ello el tema de nuestro proyecto, el cual va dirigido hacia las personas con discapacidad visual. Nuestro proyecto consiste en un dispositivo que ayuda a la detección de objetos cercanos, aproximadamente a partir de 1 metro o menos, de manera que la persona que utilice este dispositivo no necesite de apoyo de algún objeto incomodo o pesado como lo puede ser un bastón, y de esta manera tener la posibilidad de tener las dos manos libres. Este dispositivo en general consta de sensores de ultrasónico, HC-SR04, al cual se le manda una señal de reloj desde un microcontrolador, MK64FN1M0, después de ello se procesa en el micro para designar los rangos deseados y despues de ello se le manda la informacion por bluetooth a cualquier dispositivo, ya sea un modulo reproductor de audio, un buzzer, etc. Y con ello alertando a la persona de moera auditiva de algun obstáculo.

Diagrama de Hardware:

Toda la comunicación en los dispositivos esta a un baudrate de 9600 bps, con alimentación de 5V, para su conexión se implemento voltajes salientes del microcontrolador para alimentar los sensores ultrsónicos, ya que su consumo de corriente es bajo comparado a los bluetooth´s los cuales se tuvieron que conectar a otra fuente aparte. Para el input capture se implementaron 2 canales del FTM uno para el rising edge y otro para el falling edge.

Conexiones

Hardware:

Funcionamiento del HCSR04:

HCSR04

La forma en la que este módulo funciona la siguiente: el microcontrolador crea un pulso de alrededpr de 10 uS, el cual acciona al módulo, que al detectarlo emite ocho pulsos de 40 KHz. Estos pulsos emitidos rebotan contra objectos y vuelven al módulo. Por último, el HCSR04 emite un echo proporcional al tiempo que tardo el pulso en volver al módulo. Este echo se captura en el microcontrolador, donde debera ser procesado para obtener el tiempo.

Input capture:

El FTM en la k64f fue utilizado para convertir el valor capturado del echo a tiempo, para poder crear las condiciones con las que, posteriormente, se decidiría el valor enviado por bluetooth. El FTM, operando como input capture, detecta un primer flanco de subida, y devuelve el valor de la cuenta hasta ese punto. Ya que tambien necesitamos el valor de bajada para poder obtener el tiempo completo del echo, un segundo FTM como input capture fue utilizado. Combinando los dos input capture, obtenemos la diferencia de cuenta y asi, obtenemos el tiempo del echo.

Bluetooth´s (HC05, HC06):

Estos modulos no tuvieron mayor ciencia mas que emparejarlos con comandos at uno como modo maestro y el otro nada mas ponerlo en modo para que el maestro lo empareje.

Software:

/********************************************************************************************************/

//input capture en pag 1037 //diagrama en 979 #include "derivative.h" ///includeperipheraldeclarations/ #include "stdint.h" // #include"UART_headers.h" //Para 10 us en el timer poner en el for 8 y de parametro 2 //PTE26= TRIGGER //entrada del input capture rising edge FTM0_CH0 PTC1 y PTC2 //entrada del input capture rising edge FTM2_CH0 PTB 18 y 19 //UART baud rate 9600 //unsigned char arreglo[5]={'A','T','E','0',13}; //quitar local echo unsigned char arregloRX[100]; //unsigned char arreglo[]= "paco"; unsigned char arreglo[8]={0x7E, 0xFF, 6, 0x0D, 0x00, 0, 0x01, 0xEF}; //unsigned char arreglo[2]={85,70}; unsigned char arreglo2[8]={0x7E, 0xFF, 6, 0x01, 0x00, 0, 0x01, 0xEF}; unsigned char arregloPrueba[]="izquierda"; unsigned char arregloPrueba2[]="derecha"; unsigned char cnt; unsigned int tiempo; unsigned int tiempo2; unsigned int tiempoPerron; unsigned int tiempo3; unsigned int tiempo4; unsigned int tiempoPerron2; unsigned char x=0; unsigned char temp=0; unsigned char temp2=0; void delay_60ms(int delay); void UART_init(void){ //UART3_C1 = 0; //quitar //UART3_C3= 0b01000000; UART3_BDH=0; //BUSCLK=20MHzORBUSCLK=120MHz?? UART3_BDL=133; //UART3_C4|=0b00111; UART3_C2=0x0C; //TE=1,RE=1; //UART3_C2|=0x20;//InterruptReceiver=1,TE=1,RE=1; //UART3_C2|=0x80;//InterruptTransmitter=1,TransmiterEnable=1,ReceiverEnable=1 } void Global_UART_init(void){ SIM_SCGC4= 0b10000000000000; //1<<13; //SystemClockGateofUART3 SIM_SCGC5= 0b100000000000; //1<<11; //SystemClockGateofPORTC SIM_SCGC5|= (1<<10); //1<<11; //SystemClockGateofPORTB SIM_SCGC6= (1<<24); //activar el systemclock del FTM0 SIM_SCGC6|= (1<<26); //activar el systemclock del FTM2 PORTC_PCR16 |=PORT_PCR_MUX(3); //ALT3-->UART3_RX pg 244 PORTC_PCR17 |=PORT_PCR_MUX(3); //ALT3-->UART3_TX PORTC_PCR1 |= PORT_PCR_MUX(4); //SELECCIONAR FTM0_CH0 PORTC_PCR2 |= PORT_PCR_MUX(4); //SELECCIONAR FTM0_CH1 PORTB_PCR18 |= PORT_PCR_MUX(3); //SELECCIONAR FTM2_CH0 PORTB_PCR19 |= PORT_PCR_MUX(3); //SELECCIONAR FTM2_CH1 NVICICPR1=(1<<(37%32))+(1<<(42%32))+(1<<(44%32)); //CLEARPENDINGFLAGS UART Y FTM0 FTM2 NVICISER1=(1<<(37%32))+(1<<(42%32))+(1<<(44%32)); //ACTIVAR INTERRUPCIONES DEL UART Y DEL FTM0 Y FTM2 } void port_Init(void){ SIM_SCGC5 = (1<<13)+1; //Reloj del puerto E //NVIC_ICPR(1) = (1<<26); //Borramos banderas pendientes //NVIC_ISER(1) = (1<<26); //Habilitar interrupcion LPTMR NVICICPR1 = 1<<(58%32); NVICISER1 = 1<<(58%32); // Linea para habilitar el Mux en 001 para seleccionar el GPIO PORTE_PCR26 = (1<<8); //trigger // Linea para configurar los pines como salida GPIOE_PDDR = (1<<26); } void FTM_Init(void){ FTM0_SC=0x0C; //DESactivar la interrupcion del overflow, selecciona system clock y prescalador de 4 FTM2_SC=0x0C; //FTMx_CNT= lleva la cuenta //FTM0_MOD= el valor al que quisieras llegar si no fuera input capture FTM0_C0SC= 0x44 ; //FALLING Y RISING QUITAR TAL VEZ FTM2_C0SC= 0x44 ; //FTM0_C0SC= 0x44; //activar interrupciones msb=0 msa=0 elsb=0 elsa=1 //FTM_CnV contiene el valor capturado por el input capture FTM0_CNTIN=0; //valor inicial del contador revisar de nuevo FTM2_CNTIN=0; //valor inicial del contador revisar de nuevo //FTMx_STATUS copia del bit chnf del registro cnsc //FTM0_MODE= //configuracion extra FTM0_OUTINIT=0x01; FTM2_OUTINIT=0x01; //te quedaste en pag 1008 FTM0_C1SC= 0x48; FTM2_C1SC= 0x48; } void LPTimer_IRQHandler(void) { LPTMR0_CSR|=(1<<7); //borrar pendientes //GPIOE_PTOR = (1<<26); } void FTM0_IRQHandler(void){ //arregloRX[x++]=FTM0_CNT; FTM0_CNT=0; if(FTM0_C0SC==0xc4){ tiempo= FTM0_C0V; //capturar tiempo del input capture //hacer variable tiempo1 para contador y luego tiempo2 y restar //poner cnt= 0 en la segunda entrada //hola jeje } if(FTM0_C1SC==0xc8){ tiempo2=FTM0_C1V; tiempoPerron=tiempo2-tiempo; } (void)FTM0_C0SC; (void)FTM0_C1SC; FTM0_C0SC&=0x7F; //limpiar bandera FTM0_C1SC&=0x7F; //limpiar bandera FTM0_C0V=0; } void FTM2_IRQHandler(void){ //arregloRX[x++]=FTM0_CNT; FTM2_CNT=0; if(FTM2_C0SC==0xc4){ tiempo3= FTM2_C0V; //capturar tiempo del input capture //hacer variable tiempo1 para contador y luego tiempo2 y restar //poner cnt= 0 en la segunda entrada //hola jeje } if(FTM2_C1SC==0xc8){ tiempo4=FTM2_C1V; tiempoPerron2=tiempo4-tiempo3; } (void)FTM2_C0SC; (void)FTM2_C1SC; FTM2_C0SC&=0x7F; //limpiar bandera FTM2_C1SC&=0x7F; //limpiar bandera FTM2_C0V=0; } void write_UART_1(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); UART3_D=arreglo[cnt++]; //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x80)){ asm("nop"); } } void write_UART_2(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); UART3_D=arreglo2[cnt++]; //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x80)){ asm("nop"); } } void write_UART_prueba(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); //UART3_D=arregloPrueba[cnt++]; UART3_D='p'; //delay_60ms(2); //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x40)){ asm("nop"); } } void write_UART_prueba2(){ //UART3_D=arreglo[cnt++]; (void)UART3_S1; //delay_60ms(16); UART3_D=arregloPrueba2[cnt++]; //delay_60ms(2); //UART3_D=0x0D; //UART3_D=0xB6; while(!(UART3_S1&0x40)){ asm("nop"); } } void UART3_LON_IRQHandler(void){ //flag2=1; } void UART3_ERR_IRQHandler(void){ } void null(void){ //UART3_C2|=0x80; UART3_C2|=0x20; } void delay_10(int delay){ unsigned long contador; delay = (long)(delay * 7); for(contador = 0; contador<delay; contador++) asm ("nop"); } void delay_60ms(int delay){ unsigned long contador; delay = (long)(delay * 140000); for(contador = 0; contador<delay; contador++) asm ("nop"); } void delay_2us(int delay){ unsigned long contador; delay = (long)(delay * 1); for(contador = 0; contador<delay; contador++) asm ("nop"); } void UART3_Status_IRQHandler(void){ //do{ //delay_2us(1); //contador++; //}while(BANDERAUART_RX); } void enviar_Pulso(void){ GPIOE_PDDR = (0<<26); //ON delay_10(2); GPIOE_PDDR = (1<<26); //OFF delay_10(2); } int main(void) { //680ms entre pulsos //Global_UART_init(); //UART_init(); Global_UART_init(); UART_init(); port_Init(); FTM_Init(); GPIOE_PCOR = (1<<26); //Empezar con un 0 en el puerto delay_10(2000); enviar_Pulso(); tiempoPerron=0; //UART3_D=0x0D; for(;;){ //UART3_C2|= //UART3_C2&=0x08; while(cnt<=10){ write_UART_prueba(); cnt++; } //UART3_C2&=0xF7; GPIOE_PTOR = (1<<26); //ON delay_10(2); GPIOE_PTOR = (1<<26); //OFF delay_10(2000); //PRIMER COMANDO: Entre 1 metro y medio metro if(tiempoPerron<=5800 && tiempoPerron>=2900){ temp++; } //if(tiempoPerron>=5800 && tiempoPerron<=11000 && temp==5){ //CAMBIAR ESTO A <=5800 if(tiempoPerron<=5800 && tiempoPerron>=2900 && temp>=2){ cnt=0; temp=0; tiempoPerron=0; UART3_C2&=0x08; while(cnt<=10){ write_UART_prueba(); //poner el correcto } UART3_C2&=0xF7; } /* //SEGUNDO COMANDO Menos de medio metro ftm2 if(tiempoPerron<=2900){ temp2++; } //if(tiempoPerron>=5800 && tiempoPerron<=11000 && temp==5){ if(tiempoPerron2<=2900 && temp2>=1){ cnt=0; temp2=0; tiempoPerron=0; while(cnt<=10){ write_UART_prueba2(); } } */ } return 0; }

/*******************************************************************************************************/

Resultados:

Conclusiones:

Al desarrollar este proyecto, nos dimos cuenta de algunos obstaculos, los cuales no teniamos contemplados. Uno de estos obstaculos fue el input capture para obtener el tiempo. Al no haber trabajado antes con este microcontrolador, se requirio una indagación en el manual para poder configurar adecuadamente el FTM. Al final este modulo del microcontrolador funcionó bastante bien, así como su integración al proyecto.

En general creemos que este proyecto tiene un gran potencial, no solo en el ambito en el que lo propusimos, sino en muchos otros donde el movimiento nos pueda servir de referencia. Sería interesante seguir desarrollando este proyecto, mejorando el aspecto de la comunicación entre módulos. Un sistema de alerta diferente al propuesto habría sigo preferible, así como la integración de otros módulos, como GSM y GPS.


bottom of page