Images

Ejercicio Sencillo para Comunicaciones Vía Bluetooh con Microcontroladores de Arquitectura ARM7 de 32 bits.

Introducción:

Lo que vamos a ver en el tutorial de esta entrada es un ejercicio que he visto hecho con Arduino y PIC y excelentemente explicado en tutoriales en Internet. La cuestión es que no lo he visto mucho con micros de 32 bits y arquitectura ARM7, y de ahí que veo la utilidad de publicarlo.

El ejercicio consiste básicamente en encender y apagar un LED mediante un dispositivo con sistema operativo Android como podría ser una Tablet (con bluetooth) o un móvil (o también conocido en castellano como celular). En el siguiente clip se ilustra lo que acabo de decir. 





Para hacer esto usaremos un módulo hardware ampliamente conocido y de unas excelentes prestaciones considerando su bajo precio que es el HC-05.

Con el fin de no alargar mucho el tutorial daré las indicaciones necesarias que considero claves o que no se explican en otros lugares de Internet.


Como siempre vamos a lo relativamente sencillo, rápido y barato con el fin de que el lector tenga una base para realizar proyectos más complejos. 

Como viene siendo habitual últimamente dejo el tutorial en un enlace en formato PDF.

Tutorial Ejercicio Sencillo HC-05 y Micro 32 bits.

También dejo el código en C para que se pueda copiar y pegar..

//************************************************************ // Nombre: main1_BT_LED.c //Descripción: //Encendido y apagado de un LED dándo la orden // al micro mediante un dispositivo android vía bluetooth // con un módulo tipo HC-05. /* Si en nuestro celular o móvil pulsamos un 1, el led se enciende, si pulsamos un 0, el led se apaga. */ //Target: STM32F407VG //ToolChain: MDK-ARM //IDE: uVision 5 //************************************************************ #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include #include #include "stm32f4xx.h" #include "defines.h" #include "tm_stm32f4_usart.h" #include "tm_stm32f4_delay.h" #define USARTx USART2 //Puerto que se usará. /* Esta función se utiliza para trasmitir una cadene de caracteres a través * El USART especificado en USARTx * La cadena tiene que ser pasado a la función como un puntero porque * El compilador no conoce el tipo de datos string. En C una cadena es sólo * un conjunto de caracteres. */ //Función para configurar el periférico USART2 void Config_USARTx(void){ /* TX = GPIOA_Pin_2 (RX) RX = GPIOA_Pin_3 (TX) RTS = GPIOA_Pin_1 (CTS) CTS = GPIOD_Pin_3 (RTS) */ //Estructuras para configurar los puertos, el USART2 y las interrupciones NVIC GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //Activación del reloj del APB1 para el USART2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //Ativación del reloj del periférico para los pines utilizadas por la //USART2, PA3 para TX y RX PARA pa2 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //Conecta los pines a la UART //GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_USART2); //RTS (no usado) GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); //TX GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); //RX //GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_USART2); //TX //Configura los pines GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; GPIO_Init(GPIOA, &GPIO_InitStructure); //Configura la USART USART_InitStructure.USART_BaudRate = 9600; //Velocidad en buadios USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8 Bits USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USARTx, &USART_InitStructure); //Hace efectiva la configuración. //Activación de la interrupción del receptor USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //Inte del receptor de activa //Configura interrupción por el USART NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //Configura la interrupción NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //Prioridad de USART NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //Subprioridad NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //Habilitador global de inte. NVIC_Init(&NVIC_InitStructure); //La configuración se pasa a NVIC_Init() USART_Cmd(USARTx, ENABLE); //Finalmente se habilita la USART2 } void Configurar_LED(void){ //Configura pin donde está el LED (PD15) GPIO_InitTypeDef GPIO_LED; //Estructura para configurar Puerto D RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //Habilita el bus AHB1 GPIO_LED.GPIO_Pin = GPIO_Pin_15; //Pin que deseamos configurar GPIO_LED.GPIO_Mode = GPIO_Mode_OUT; //Configura como salida GPIO_LED.GPIO_OType = GPIO_OType_PP; //Configura el pin tipo push/pul //(opuesto a open drain) GPIO_LED.GPIO_Speed = GPIO_Speed_100MHz; //Configura el pin a 100 MHz GPIO_LED.GPIO_PuPd = GPIO_PuPd_NOPULL; //Desactiva los pull-up, no hacen falta GPIO_Init(GPIOD, &GPIO_LED); //Hacer efectiva configuración del puerto } //Función principal int main(void){ Config_USARTx(); //Enviar_String("Esperando datos..."); //Mensaje inicial. Configurar_LED(); //TM_USART_Puts(USARTx, "OK\n\r"); while(1){ //Espera por la interrupción } } //ISR (rutina de servivio de interrupción) para todas las interrupciones de USART2 void USART2_IRQHandler(void){ //GPIO_SetBits(GPIOD, GPIO_Pin_15); //GPIO_ResetBits(GPIOD, GPIO_Pin_15); if(USART_GetITStatus(USART2, USART_IT_RXNE)){ char caracter = USART2->DR; //El dato recibido es salvado en caracter USART_SendData(USART2, caracter); //Re-envia el dato recibido if(caracter == '1') GPIO_SetBits(GPIOD, GPIO_Pin_15); if(caracter == '0') GPIO_ResetBits(GPIOD, GPIO_Pin_15); } }


Por el momento lo dejamos aquí, espero que este tutorial resulte útil :).

-Fin-