Mostrando entradas con la etiqueta MICROCONTROLADORES 32 bits. Mostrar todas las entradas
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-
Images

Ejercicio sencillo con sensor de luz y micro de 32 bits.

Introducción:

La idea de esta entrada al blog -con la que adjunto un enlace a un PDF al final-, es hacer un ejercicio con un sensor de luz tipo LDR (Light Dependent Resistor) modelo GL5528, que cumpliera los siguientes requisitos:

- Que sea sencillo para las personas que empiezan a introducirse en esto.

- Que sea lo más barato posible.

- Que no sea un plagio de otras cosas que hay por Internet.

- Que se pudiera hacer en un lapso de tiempo no muy largo. Tenga en cuenta el lector que entre explorar que cosas son factibles en poco tiempo a la vez que interesantes (buscar la idea), y en documentar se me va más tiempo que en realizar este tipo de ejercicios y también tengo que contar con eso.

El tutorial completo lo dejo en formato PDF a través de un enlace al final de esta introducción.

¿Qué necesitas para realizar este ejercicio práctico?.

•Hardware:

- Una placa de desarrollo STM32F4-Discovery. Precio aproximado 18,72 euros (aproximadamente 20 dólares USA al cambio del día que en que escribo esto).

- Un sensor de luz LDR modelo GL5528. Precio aproximado 1,36 euros (1,45 dólares USA).

- Dos resistencias de orificio pasante de unos 220 ohmios. Precio aproximado de la unidad 0,059 euros (0,06 dólares USA).  Las dos unidades unos 0,118 euros (0,12 dólares USA).

- Un LED normal para protoboard. Precio aproximado unos 0,18 euros o menos (0,19 dólares USA).

- Un protoboard. Precio aproximado 8,36 euros (8,92 dólares USA).
Monto total: 28,738 euros o 30,66 dólares USA. Redondeando puede salir todo por unos 30 euros o 32 dólares.

•Software:

- IDE para programar la placa STM32, preferentemente el Keil µVision 5 que es el que yo uso en este tutorial.

- Una aplicación para desarrollo de PCBs, la que yo uso en este tutorial es el Altium Designer.

¿Qué hará exactamente el sistema que desarrollaremos?.

Nuestro sistema será sensible a la luz –que será el Input del sistema – de manera que a mayor cantidad de luz detectada un LED (Output del sistema) parpadeará con una frecuencia menor, esto es, más lentamente, y a menor cantidad de luz el LED parpadeará con mayor frecuencia (más deprisa).


Gráficamente:

   
A mayor luz registrada parpadeo del LED más lento.
A menor luz registrada parpadeo del LED más rápido.

Para ilustrarlo mejor y de paso dar fe de que funciona, dejo un clip:




Este ejercicio ya lo hice con un Arduino Uno, ¿entonces que novedoso tiene esto si se puede hacer con un micro de 8 bits?, pues la novedad es que no encuentro tantos tutoriales sobre micros de 32 bits sobre este tipo de ejercicios (menos aún en castellano), por eso me parece interesante para el que quiera introducirse en la programación de micros de 32 bits.

Además, al final aprovecho todo esto para hacer un ejercicio de desarrollo de PCBs que -dada las limitación de tiempo que me he impuesto- se considerará como sólo eso, un ejercicio que me sirve además de excusa para hacer hincapié en conceptos que considero fundamentales en el desarrollo de un PCB, algo con lo que hubiera tenido menos tiempo si lo hubiera elaborado más.

Por otro lado, para el que se está introduciendo en este tipo de temas es siempre mejor empezar de lo sencillo para ir a lo complejo.

Aquí va el enlace al tutorial:


Images

Mostrando por display la entrada en tensión regulada por un potenciómetro.


En esta entrada vamos a ver un ejemplo muy sencillo para aprender a manejar la placa STM32F4-Discovery. Dicha tarjeta de desarrollo puede ser una excelente herramienta para introducir al lector en la programación de microcontroladores de 32 bits (con arquitectura ARM).

Básicamente en primer lugar se trata de hacer lo que se muestra en el siguiente clip.



Además en este tutorial se incluye un posible diseño de un circuito impreso (o PCB por su acrónimo en inglés). El layout del mencionado PCB implementaría este sistema sin la tarjeta de desarrollo STM32F4-Discovery, con los elementos esenciales para realizar lo que el ejercicio propone.

 Viene a ser algo así como un voltimetro sencillo que mide la tensión entre los terminales del potenciómetro. Recordemos que el potenciómetro no es más que una resistencia que podemos variar entre cero y el límite máximo de ohmios de dicho potenciómetro. 

He pensado que tal y como trabajo las publicaciones de este blog, quizás es más interesante que deje enlaces para que se pueda ver la mayor parte en PDF, de forma que no resulte tan largo y más legible.

El post lo he dividido en dos partes, Una intraducción y el tutorial en sí. 

En la introducción comento principalmente el hardware y el software que se necesita así como una aproximación del dinero que te puede costar. 

En el tutorial se da las indicaciones de como ir  realizando este ejercicio que propongo. Aviso que se hace más hincapié en la parte de programación del micro que en el diseño del PCB que tan sólo se esboza.

Si haces clic o pulsas los siguientes enlaces lo verás:



Espero que resulte útil y más cómodo de leer. ¡Hasta la próxima!.
Images

Uso de Simulink como herramienta de simulación de sistemas basados en microntroladores de 32 bits, y para programarlos.

Introducción.

Últimamente estoy en este blog casi en exclusiva con los FPGAs, pero lo cierto es que también he estado siempre muy interesado en los microcontroladores (y probablemente sepa más de microcontroladores que de FPGAs). Para que esto no se convierta en el blog del tipo obsesionado con las FPGAs, voy a introducir esta entrada basándome en un un ejercicio sencillito que hice ya hace tiempo. En esta ocasión –además- es una nueva oportunidad de mostrar un posible uso más de Simulink para trabajar con la electrónica.

Normalmente los dispositivos electrónicos trabajan dentro de otros sistemas dónde también se incorporan dispositivos, mecánicos, hidráulicos, sensores… etc.

Es por eso que desde hace mucho tiempo que estoy interesado en software que permita simular sistemas electrónicos trabajando con otro tipo de sistemas. Matlab y su interfaz gráfica Simulink es una de las soluciones óptimas (no la única). Una de las opciones que baraje en su día y que vi bastante ventajosa y asequible es mediante lo que se muestra en este link.


Lo que voy a mostrar a continuación es un ejercicio que me hice ya hace tiempo y que afortunadamente documenté y no se perdió en el recuerdo. Espero que ayude un poco a introducirse en este software, o  al menos a motivar a investigar lo.

Descripción  ejercicio.

Simulación mediante SIMULINK de un sistema sencillo basado en un microcontrolador de 32 bits de arquitectura ARM7 y posterior prueba hardware.


- Descripción del sistema:




    • Inputs (entradas o fuentes):

Hice pruebas con dos tipos de entradas:

1           -  Tren de pulsos de periodo 2 sg y pulso de 1 sg (50% del periodo).
               
-            -  Interruptor o pulsador.

  • Microntrolador:

Microcontrolador de 32 bits de arquitectura ARM7 (más concretamente el STM32F407VGT) que controla 4 leds mediante la entrada (Input) por un pin digital (pin PA0):

  • Outputs (salidas):

- Led1 (salida pin PD12) -> Encendido si Input =estado alto o 1 lógico (normalmente del orden de 3,3 o 5 voltios).  Apagado si input 0 (normalmente GND o tierra).

                            Input= 1,0 -> Output = 1,0 (reproduce entrada)

- Led2 (salida pin PD13) -> Encendido si Input =estado alto o 1 lógico (normalmente del orden de 3,3 o 5 voltios). Es decir lo mismo que el anterior.

                             Input= 1,0 -> Output = 1,0 (reproduce entrada)

- Led3 (salida pin PD14) -> Apagado siempre (entrada constante 0 lógico).

                            Input= 1,0 -> Output = 0 siempre.

- Led14 (salida pin PD15) -> Encendido si entrada en 0 lógico, apagado si entrada 1 (implementado mediante puerta lógica NOT).

                            Input= 1,0 -> Output = 0,1 (NOT Input).

--------------------------------------------------------------------------------------------------------------------------
Nota importante: como en las librerías de mi Matlab-Simulink no hay bloques para simular leds, yo usé bloques para displays y los configuré para que manejaran información de tipo boolean, si marcan un 1 simula un led encendido, si  marca un 0 es led apagado.
Los bloque Scope son para analizar las señales en el tiempo, especialmente en el caso del tren de pulsos como input o fuente.
--------------------------------------------------------------------------------------------------------------------------

Por cuestiones de tiempo y para no cansar al lector en lo sucesivo haré uso del “una imagen vale más que mil palabras”, y trataré de introducir poco texto. Lo he dividido en los siguientes apartados:

Parte1: Implementación del microcontrolador mediante SIMULINK.

Parte2: Implementación del sistema completo mediante SIMULINK.

Parte3: Simulaciones.

Parte4: Grabación y prueba hardware.

Observaciones finales.

Parte1: Implementación del microcontrolador mediante SIMULINK.

Implementación en SIMULINK del microcontrolador:



Para crear un subsistema (Subsystem en SIMULINK) con lo anterior y poder simular con el modelo completo, se introducen 3 cosas:

1         1-      Una puerta OR, para hacer posible la simulación de la fuente. Si no fuera así la entrada (pin                 PA0 del microcontrolador de 32 bits, sería por defecto siempre cero).

2         2-      Puertos de entrada.

3         3-      Puertos de salida.



Ahora ya podemos crear el modelo completo con un subsistema llamado microcontrolador de una entrada y cuatro salidas. Dicho subsistema aparece en las siguientes figuras recuadrado en amarillo, mis disculpas si no se resalta bien con el fondo blanco.

Parte2: Implementación del sistema completo mediante SIMULINK.


- Con una entrada de tren de pulsos (como dije uso displays para simular leds):


 - Con una entrada que simula un pulsador o interruptor (interesante para cuando más adelante hice la prueba en hardware).

Haciendo clic en el subsistema microcontrolados (que aunque no se aprecie con claridad está recuadrado de amarillo), se obtiene algo como esto:

------------------------------------------------------------------------------------------------------------------------------
Parte3: Simulaciones.

- Con tren de pulsos:

Simulación subsistema:

- Con interruptor o pulsador:

1- Pulsador sin oprimir, o interruptor abierto.


Se observa que

- Display_PD12 (LED1) y Display_PD13 (LED2) están a 0 (apagados),

- Display_PD14 (LED3) a 0 apagado también (siempre lo estará),

- Display_PD15 (LED4) encendido (NOT input) o a 1 lógico, lo contrario de la entrada.

Todo tal y como pretendíamos.

2- Pulsador oprimido, o interruptor cerrado.

Se observa que:

 - Display_PD12 (LED1) y Display_PD13 (LED2) están a 1 (encendidos), el pulsador los enciende.

-  Display_PD14 (LED3) a 0 apagado (siempre estará apagado, la idea era sólo introducir una              constante,  dentro del subsistema aunque en la práctica esto no tenga mucho sentido),

- Display_PD15 (LED4) apagado (NOT input) o a 0 lógico  lo contrario de la entrada.

De nuevo todo tal y como pretendíamos.

La simulación funciona.

Parte4: Grabación y prueba hardware.

Grabación del micro:

Nota: Para los que empezamos hace años programando microprocesadores (como el 8086) y micros (como por ejemplo el 8051) en ensamblador, y luego pasamos a C y C++ como vulgarmente se dice “picando código a mano”, esto no sé si es una buena noticia que se pueda generar código de forma tan fácil, aunque en honor a la verdad en determinadas circunstancias puede ser útil.

No obstante trataré de publicar más adelante algún proyecto dónde ahí si hago el código tecleando en el Keil µVision 5 “a mano”.


Si el micro está de alguna manera conectado al PC (en mi caso mediante la placa STM32-Discovery que yo uso para pruebas hardware y como grabadora de otros micros), debe salir algo como:

Prueba hardware:

Para probarlo usé una placa STM32-Discover que funciona con un micro STM32f407VG.

Antes de mostrar las fotos haré algunas aclaraciones:

- Los dos LEds rojos cerca de la conexión micro-USB no cuentan, sólo están señalando que hay alimentación (PWR) y que hay conexión con el puerto COM.

- LED verde -> LED1 conectado al pin PD12 del micro.

- LED naranja -> LED2 conectado al pin PD13 del micro.

- LED que no se enciende del rombo -> LED3 conectado al pin PD14 del micro.

- LED azul -> LED2 conectado al pin PD15 del micro.

1- Pulsador sin oprimir, o interruptor abierto.


LED1 apagado (0 lógico) -> se activa con el pulsador

LED2 apagado (0 lógico) -> se activa con el pulsador

LED3 apagado (0 lógico) -> lo hemos programado para que esté siempre apagado.

LED4 encendido (1 lógico) -> se activa con el pulsador no oprimido

y se desactiva con el pulsador oprimido (NOT Input). Siempre lo contrario que los LED1 Y LED2.

2- Pulsador oprimido, o interruptor cerrado.


 LED1 apagado (1 lógico) -> se activa con el pulsador

LED2 apagado (1 lógico) -> se activa con el pulsador

LED3 apagado (0 lógico) -> lo hemos programado para que esté siempre apagado.

LED4 encendido (0 lógico) se desactiva con el pulsador oprimido y se activa con el pulsador no oprimido (NOT Input). Siempre lo contrario que los LED1 Y LED2.

Se pueden hacer cosas más complejas, pero hubiera necesitado más hardware.  Con este ejercicio basta con la placa.

Dejo un clip demostrativo de lo que acabo de explicar.



Observaciones finales:

Matlab+SIMULINK, no es la única herramienta para simular sistemas electrónicos (también se puede sistemas basados en FPGAs), existen otras diseñadas para técnicos del sector de la electrónica como son Altium, Proteus, Eagleconectado + LT Spice, Pspice, Orcad, Workbench…  Especialmente si los tienes completos y debidamente registrados… Muchos de estos tienen la ventaja de que puedes simular en el esquemático y casi inmediatamente al layout para hacer el diseño del PCB y la obtención de los archivos gerber para la fabricación.

Ni siquiera es la única forma fácil de generar código, de hecho no hace mucho descubrí el STM32CubeMX, que no sólo te puede generar código sino que junto STMStudio se puede llegar a incluso hacer simulaciones.

Una última cosica que no quería dejar pasar, hace muy poco descubrí que también se puede programar micros y hasta FPGAs con MicroPython. MicroPython se basa en un lenguaje de programación llamado Python que es bastante "amigable" en comparación con otros lenguajes.

A decir verdad mi nivel de Python hoy por hoy es tan bajo (oí hablar de él hace tiempo pero me he empezado a enterar de sus bondades y sus aplicaciones en la electrónica hace poco), que hoy por hoy no me puedo considerar ni siquiera con nivel de iniciado.

Para el que le interese esto tan interesante del Python y del MicroPython dejaré por el momento un enlace de un congreso que se celebra en España cada año (en otros países me consta que se celebran congresos y hay comunidades similares y muy interesantes):

http://2016.es.pycon.org/es/

También he descubierto con regocijo sin igual que empieza a haber hardware y software libre (tipo Arduino) para FPGAs también. Pero todo esto mencionado ya ocuparía otra entrada más elaborada.