Aprende Electrónica con la placa de desarrollo STM32F411-DISCOVERY

“Me lo contaron y lo olvidé; lo ví y lo entendí; lo hice y lo aprendí.”

Confucio

En el B105 tenemos la convicción de que la mejor manera para aprender algo es haciéndolo. Además, actualmente existen en el mercado multitud de placas de desarrollo muy económicas, por lo que ya no hay escusa para no ponerse manos a la obra.

Por ello, arrancamos esta serie de publicaciones con el objetivo de guiar el aprendizaje del uso de sistemas empotrados. Para ello, hemos escogido la placa de desarrollo STM32F411-DISCOVERY de STMicroelectronics, que tiene un precio inferior a 15€ y el software necesario para desarrollar con ella es gratuito. Aun así, aunque el método variará, los conceptos o fundamentos que esperamos transmitiros con estas publicaciones son aplicables a cualquier plataforma basada en un microcontrolador.

Sin alargarnos mucho más, os dejamos una lista de tutoriales y ejemplos, que irá creciendo con el tiempo, en la que tendréis los enlaces a las distintas publicaciones de esta serie.

  1. STM32F4: Primeros pasos con el entorno de desarrollo
  2. STM32F4: Interrupción externa
  3. STM32F4: Configurar el PWM con timers
  4. STM32F4: Consideraciones para el uso de la memoria flash (Parte I)
  5. STM32F4: Depuración con OpenOCD de programas con múltiples hebras
  6. STM32F4: Configuración y uso básico del ADC
  7. STM32F4: Configuración del ADC con un timer
  8. STM32F4: Cómo utilizar el ADC con DMA

¡Suerte y ánimo!

The Twelve of B105: Wireless Neural Networks

Un mes más aquí llega la entrega de …
theTwelveOfB105En este nuevo post hemos decidido introducir una temática que llevamos unos años tratando, la cual nos sirve a modo de introducción en el tema de la Bioingeniería. Comenzaremos abarcando aspectos relacionados con la actividad cerebral.

Hemos realizado un estudio en el que hemos tratado el diseño de técnicas para redes neuronales artificiales, y que también está basado en Redes de Sensores Inalámbricas. Dicho estudio tiene el objetivo de obtener, transmitir y generar señales neuronales como lo hace el cuerpo humano. Hay que ser especialmente cuidadoso con estas redes debido a que van a formar parte del cuerpo humano. Se debe prestar especial atención a la absorción de energía o al daño térmico que se puede generar debido al contacto constante entre el sensor y la piel. Por lo tanto, la potencia radiada debe estar limitada en este tipo de redes.

Se busca implementar un sistema no invasivo, en el cual se obtenga la información neuronal de la médula espinal, se procese localmente y se transmita un impulso al nodo receptor, colocado en una extremidad. Dicho nodo generaría un impulso eléctrico para la estimulación artificial del tejido nervioso. Esto permite que el cerebro se comunique con cualquier parte del cuerpo a pesar de los nervios disfuncionales. Un ejemplo aplicado en primates es el que puede verse en la imagen. El diseño del sistema tendrá en cuenta el bajo costo y el tamaño reducido, de cara a su implementación práctica sobre las personas.

primate

Básicamente, la neurona genera un potencial de acción o “pico” cada vez que propaga información. En este contexto, este estudio apunta a detectar un pico en la señal de una neurona y transmitir a otro nodo la existencia de esa señal. Una vez que el receptor recibe los datos, genera una estimulación eléctrica en otra parte del cuerpo humano.

Se puede separar este proyecto en tres partes diferenciadas:

  1. El módulo de adquisición para obtener la información neuronal, que debe tener una sensibilidad muy alta, ya que la señal obtenida en la superficie de la piel tiene una amplitud muy pequeña y gran cantidad de ruido.
  2. La transmisión del impulso está influenciada por la frecuencia, la distancia entre el transmisor y el receptor, la permitividad relativa de las capas del cuerpo humano o la línea de visión.
  3. La generación del impulso eléctrico depende de la forma de onda utilizada, del material de los electrodos o de la intensidad. En este punto, parámetros como la sincronización entre nodos son fundamentales para saber que el pulso que se ha recibido se corresponde con el impulso que se ha enviado.

Por lo tanto, la tesis propuesta supone un gran avance en el tratamiento de las lesiones de la médula espinal y en los sistemas neuronales no intrusivos en general.

En este link  os dejamos las temáticas de los meses anteriores. Podéis seguirnos a través de las redes sociales (@elb105) para conocer más sobre nosotros. Y todo lo que queráis saber no dudéis en consultarnos.

¡Os esperamos!

The Twelve of B105: Energy Efficiency

¿Ávidos por conocer más sobre nuestro trabajo? No esperéis más, aquí llega una nueva entrega de…

theTwelveOfB105En esta ocasión nos espera un nueva pero como siempre atractiva temática: IoT aplicado a la eficiencia energética. En este campo abordaremos dos de nuestros proyectos, RS y SONRISAS, gracias a los cuales hemos podido observar y poner nuestro grano de arena en el sector de la domótica.

En el primer proyecto, la red de sensores y actuadores permite optimizar el consumo energético del hogar, infiriendo a raíz de las medidas de temperatura, luminosidad, presencia, etc., parámetros de uso y confort de los ocupantes. El sistema se compone de dos nodos especializados, Prometheus y Boucherot, y para las comunicaciones emplea el protocolo SimpliciTi sobre bandas libres ISM.

Por otro lado, con SONRISAS abordamos la eficiencia energética como uno de los campos con potencial para impulsar el mercado de IoT. Los diseños de bombilla, enchufe y termostato inteligente desarrollados en esta ocasión, implementados en FreeRTOS sobre procesadores STM32Lx, permitirían realizar mediciones de consumo, ajustar la temperatura e iluminación, desconectar o alimentar dispositivos de forma remota, etc. Por otro lado el despliegue, con un sistema de comunicaciones interno a 868 MHz, ofrece un simple acceso vía WiFi e interfaces de usuario disponibles para las plataformas más usuales (ordenador, telefono móvil, etc.)

g3701

Antes de despedirnos, recordad que podéis consultar aquí otras temáticas abordadas en meses anteriores, e información de nuestro día a día a través de las redes sociales. Y por supuesto, si hay algo de vuestro interés, no dudéis en acercaros. ¡Os esperamos!

¡Nos vemos en breve!

STM32F4: Configurar el PWM con Timers

Un timer no es más que un contador. Es como un reloj que se usa para medir eventos temporales. Se configura a través de unos registros especiales y se puede elegir, entre otras cosas, su modo de funcionamiento.

En el ejemplo de hoy vamos a trabajar con la placa de desarrollo 32F411-DISCOVERY y nuestro objetivo va a ser aprender a configurar el TIM4 en modo PWM para controlar la intensidad de luz del led Naranja que viene integrado en la placa.

Esta placa está basada en el microcontrolador STM32F411 el cual dispone de hasta 11 Timers, de los cuales 6 pueden ser de 16 bits, y 2 de 32 bits, cada uno con hasta 4 canales de IC/OC/PWM o contador de pulsos. Además de 2 timers watchdog y un Systick Timer.

A través del software CubeMX activaremos el PWM Generation CH2 del TIM4 en la pestaña Pinout. Además de que asociaremos el pin PD13 la función alternativa de TIM4_CH2 (Channe2 PWM Generation CH2).

timers1

Con esto habremos conseguido dos cosas: por un lado configurar el canal 2 del Timer4 en modo PWM, y por otro lado asociar la salida del PWM al pin PD13, que es donde se encuentra el led naranja.

Tras esto pasamos a la pestaña Configuration y ahí configuramos el control del TIM4. Dentro de la pestaña de Parameter Settings hay 3 parámetros numéricos que debemos entender para configurarlos correctamente.

Prescaler (PSC – 16 bits value).

Con este valor podemos fijar la frecuencia del reloj asociado al Timer dividiendo la frecuencia del reloj de sistema.

Counter Period (AutoReload Register – 16 bits value).

Será el valor en el cual nuestro Timer saltará y nos avisará de alguna forma, ya sea reiniciándose o lanzando una interrupcion, etc.

Pulse (16 bits value).

Con este valor podemos fijar el ciclo de trabajo de nuestro PWM.

  • FreqTimer = FreqClock / (Prescaler + 1)
  • Prescaler = (FreqClock / FreqTimer) – 1
  • FreqPWM = FreqTimer / (CounterPeriod + 1)
  • Period = (FreqTimer / FreqPWM) – 1
  • Pulse = ((Period + 1) * DutyCicle) / 100 – 1
Queremos llevar a cabo dos ejemplos, por un lado queremos ver parpadear el led a varios ciclos de trabajo diferentes, y por otro lado queremos configurar un dimmer del led.

A grandes rasgos, lo que hacemos con esta técnica es fijar el periodo de la señal utilizando la frecuencia del PWM, y utilizar la frecuencia del timer para poder modular el ancho del pulso. Siendo esta frecuencia del timer una división de la frecuencia de reloj de nuestro microcontrolador.

Ejemplo 1. Parpadeo del led.

Para el parpadeo del led queremos un periodo de trabajo lento para que nos de tiempo a ver esa conmutación entre encendido y apagado del led. Es por ello que hemos fijado la Frecuencia del PWM a 1Hz. Luego, para hacer el resto de operaciones más fáciles hemos fijado la FreqTimer a 10 Khz. Con estos datos y usando las ecuaciones anteriores obtenemos:

  • APB2 timer clocks = 96 Mhz
  • Objetivo de PWM Freq = 1 Hz
  • Prescaler = 9599
  • Period = 9999

Para poder ver el cambio de parpadeo del led usaremos estos tres valores de Pulse (% Duty cicle).

  • Pulse: 99 (1%), 4999 (50%), 9899 (99%)

Ejemplo 2. Dimmer del led.

En este caso queremos que el periodo de trabajo sera muy pequeño para que las transiciones sean fluidas para el ojo humano. Es por ello que en este ejemplo hemos fijado la Frecuencia del PWM a 10 Khz. Luego, para hacer el resto de operaciones más fáciles hemos fijado la FreqTimer a 2 Mhz. Con estos datos y usando las ecuaciones anteriores obtenemos:

timers2

  • APB2 timer clocks = 96 Mhz
  • Objetivo de PWM Freq = 10 Khz
  • Prescaler = 47
  • Period = 199

Para poder ver un dimmer en el led recorreremos todos los valores posibles de Pulse (% Duty cicle).

  • Pulse: 0 (0%)-199 (100%)

Ejecución de los ejemplos

Una vez hemos generado la plantilla de código con CubeMX es momento de continuar en Eclipse.

Ahora debemos tener en cuenta que para que el PWM se ponga en funcionamiento tenemos que llamar a la función

Y para poder hacer cambios en el valor de Pulse desde Eclipse debemos llamar a la macro

STM32F4: Interrupción externa

En el ejemplo de hoy veremos como asociar la generación de una interrupción externa al botón de usuario que hay en la placa de desarrollo 32F411-DISCOVERY. Después vincularemos a la atención de esa interrupción el toggle del led rojo.

Empezaremos configurando CubeMX, donde ya por defecto nos han puesto el GPIO PA0 configurado como GPIO_EXTI0 que indica que ese pin está configurado como interrupción externa. 

Para ello en la pestaña Configuration, dentro de la configuración de GPIO seleccionamos el pin PA0-WKUP y lo configuramos en modo External Interrupt Mode with Rising edge trigger detection, No pull-up and no pull-down.

Ahora debemos activar dicha interrupción bajo la pestaña Configuration, en la configuración de NVIC, debemos activar la línea EXTI line0 interrupt

Activando estas opciones en CubeMX nos generará el código correspondiente a la inicialización del sistema y activará la interrupción asociada a la linea 0, que en nuestra placa está vinculada al botón de usuario.

Si abrimos el fichero main.c y pinchamos sobre la definición de la función MX_GPIO_Init() podemos ver dos líneas al final del método que fijan la prioridad y activan la interrupción.

Si abrimos el fichero stm32f4xx_it.c podemos ver como ha aparecido una función para la gestión de la interrupción EXTI line0. Si pulsamos sobre la definición de HAL_GPIO_EXTI_IRQHandler(), nos lleva a otro método que limpia el flag de interrupción asociado al GPIO que ha generado la interrupción y llama a su callback asociado HAL_GPIO_EXTI_Callback(). Si vamos a la definición de esta última función vemos que está definida como tipo __weak y en un comentario nos dicen que debe ser implementada en espacio de usuario.

Como nosotros somos muy obedientes copiamos la definición de la función y nos lo llevamos al fichero gpio.c donde dentro del USER CODE 2 pegamos:

A este callback acudirá nuestro programa cuando se detecte una pulsación del botón. Ya que es recomendable hacer el mínimo de operaciones dentro del callback de una interrupción, en este callback sólo realizaremos la operación de toggle del led.

Para ello, dentro de este callback haremos la llamada a HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14). De esta forma cada vez que se pulse el botón de usuario el led rojo de la placa debe conmutar.

Se deja al lector la resolución de varios problemas tales como el sistema antirebotes software que habría que poner asociado a las interrupciones que se generan a través del botón, o el problema asociado a que dentro del callback habrá que distinguir entre los diferentes GPIOs que generen interrupción.

Solo nos falta compilar, y debuguear en Ac6 STM32 C/C++ Application. Y con eso podremos ver conmutar el led rojo de la placa cada vez que pulsamos el botón de usuario.