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 Práctico para Trabajar con Multicapas en Altium.


Introducción:

La primera cuestión que podría surgir a algún lector es:  ¿Qué es eso de las multicapas?.

Bueno, la misma palabra multicapas da una idea bastante aproximada de su significado. Tradicionalmente se ha usado PCBs (y aún se sigue usando) dónde hay dos capas, los componentes van en la capa superior (top layer), y las pistas pueden ir en la capa superior, la inferior (bottom layer) o en ambas si la complejidad del circuito impreso o PCB así lo exige.

La cuestión es que hay contextos en que por espacio u otros requisitos es recomendable usar otra alternativa diferente que el avance de la tecnología ya permite desde hace ya un tiempo. Y es aquí donde entran las multicapas o el concepto relacionado con estas: “Stack-Up”.

En este tipo de diseños es posible tener más capas de manera que no sólo tenemos el top layer para soldar componentes, y el top layer y el bottom layer para las pistas, con lo que podemos aumentar la capacidad de integración en una misma placa ahorrando espacio.

Se podría decir que un diseño multicapas es una configuración de PCBs apilados unos encima de otros. Y digo “que se podría decir” porque esos PCBs en muchos casos (por no decir la mayoría), están íntimamente conectados unos con otros, así que de alguna manera forman un solo PCB.  

Por supuesto, este aumento de la integración no sale gratis, ni por el dinero ni porque aparecen ciertos desafíos como la especial consideración que hay que tener de la EMC (compatibilidad electromagnética), así como de EMI (acrónimo de Electro-Magnetic Interference).  Esto efectos no sólo pueden aparecer como resultado del mismo diseño, también por el ambiente en dónde se espera que trabaje el PCB, algo que hay que considerar también y en lo que hay personas, departamentos y empresas especializadas, pues no es un tema en absoluto trivial.

Afortunadamente los programas de diseño de PCBs cuentan con herramientas para abordar esto, y si especificas estos requerimientos del PCB a los fabricantes, los fabricantes lo tendrán en consideración. Sin embargo nada de eso excluye que el diseñador debe conocer esos conceptos y tenerlos seriamente en cuenta en el proceso de diseño.

Tras esta breve y simplificada descripción del concepto de multicapas, pasamos a nuestro ejercicio práctico que hará uso de lo hecho en la anterior publicación de este blog.


Si deseas profundiza un poco más en los conceptos de Stack-Up o Multicapas, puedes echar un vistazo a la documentación de una publicación anterior de este blog:


La documentación que puedes encontrar ahí (descargable en formato PDF), no es muy extensa y no le llevará al lector mucho tiempo echarle un ojo. No obstante,  eso es decisión suya dama o caballero  J, como usted desee.

¿Qué vamos a hacer básicamente?

Como ya dije, usaremos el diseño del anterior post para introducirnos en este  en el diseño de multicapas, para ello veo más práctico hacer uso en este caso de video-tutoriales.

En dicho diseño había dos reguladores de tensión que podían ser activados o desactivados con dos interruptores. Usaremos un diseño de cuatro capas para situar el circuito de entrada y los interruptores en la región superior, y los dos reguladores en la inferior. Es un diseño bastante sencillo pero en estos casos siempre mejor empezar con cosas sencillas ¿verdad?.

De nuevo me centraré en las cuestiones que puedan resultar más útiles en el diseño multicapas (y que he aprendido de forma auto-didacta con lo que eso implica…). De forma que en ningún caso lo que muestro en los clips se puede considerar como el diseño completo. Para tener el diseño completo hacen falta más cosas (y posiblemente un repaso de lo hecho).

Sin embargo, considero que como punto de partida para introducirse en el diseño con multicapas puede ser útil (ojalá que sí).

Come on!, go ahead!

1- Configurando el Layer Stack Manager (Administrador de Apilamiento de Capas).



2- Situando los componentes en sus capas.



3- Situando las capas y rutenado (rooting).


4- Seguimos con el diseño: introducción de planos de tierra, vías... etc.

https://www.youtube.com/watch?v=LMNbzqqc7JI


5- Puliendo lo hecho hasta ahora y últimos apuntes.



Y con esto podemos considerar terminado esta entrada. Como parece que con tanta electrónica empiezo a hablar como un autómata programable, me despediré por el momento con algo de lírica.

Por algún lugar escuche algo que me gustó mucho:

Si cultivas un pensamiento, cosechas una acción,
si cultivas una acción, cosechas un hábito,
si cultivas un hábito, forjas un carácter.

A mi se me ocurre a raíz de esto que la mejor manera de vencer dificultades es enfrentándote a ellas (tengas o no éxito luego), y la mejor manera de ser perseverante es perseverar.

A fin de cuentas, el movimiento se demuestra andando, ¿cierto?. 

Un saludo cordial al que haya "caído" por aquí y mi mayor deseo de que lo que por aquí publico sea de utilidad.



Images

Trabajando con Jerarquías (Schematic Sheet Symbol) en Altium.


¿Qué significa eso de trabajar con jerarquías en el diseño de un  PCB?

Cuando las personas nos enfrentamos a un problema de cierta complejidad, lo que a menudo hacemos es dividir el problema en partes más sencillas, resolver estas y luego relacionar todas esas partes para formar el todo.  Es la vieja táctica (pero no por eso menos útil) del “divide y vencerás”.

De igual manera para crear un diseño de un PCB en Altium Designer  de una cierta complejidad - y dónde tengamos un número mayor de componentes que en otros diseños menos complejos-, podemos ir agrupando componentes por su funcionalidad  en módulos.

 Después estos módulos se integrarán en una hoja del esquemático (schematic sheet) del proyecto para que tengamos nuestro proyecto completo.

A esta hoja dónde usamos estos módulos para que trabajen junto, es la  que consideramos de mayor jerarquía, y de ahí el nombre de jerarquía para denominar esta forma de diseñar (que nos puede ser muy útil en muchos casos).

Además, los módulos - que en el proyecto llamamos de menor  jerarquía - pueden ser replicados en el mismo proyecto (en caso de que se usen varias veces), o incluso usados en otros proyectos.

Por último se pasa lo hecho a layout del PCB.

Para esto Altium Designer tiene una herramienta magnifica que es el “shematic sheet symbol”.

Si todo lo que he explicado le suena al lector muy abstracto no hay problema, en el tutorial y la documentación adjunta que presento en este post, veremos cómo se implementa la idea en la práctica y al final tendrá una idea bastante clara de lo que significa el diseño jerárquico.

Por otro lado este post (o publicación) nos servirá como base para explicar -con un ejercicio práctico- más sobre cómo trabajar con multicapas o StackUp en una próxima publicación que ya tengo preparada.

 ¿Qué necesitas para este tutorial?

Esta vez no necesitarás gastar dinero (plata, pesos, noney…), si no tienes una versión no muy antigua de Altium, puedes descargarte un trial o versión gratuita que caducará en un tiempo suficiente para realizar este tutorial, a continuación dejo el enlace:

http://www.altium.com/free-trial

Para obtenerla sólo tendrás previamente que rellenar unos formularios para registrarte, pero no es nada difícil seguir os pasos y en la página web está perfectamente explicado.

El tutorial del que parto es para una versión más antigua de la que probablemente obtendrás con ña versión gratuita, eso implica que cambia un poco la interfaz de las distintas ventanas, pero no lo suficiente como para que el tutorial no te sea útil.

¿Qué vamos a hacer básicamente?

Como ya he dicho parto de un tutorial bastante completo e interesante que encontré en inglés en Internet, y que luego he traducido (daré los enlaces tanto en del original en inglés como mi traducción en castellano).

En ese tutorial se usa un regulador de tensión (útil para control de motores por ejemplo) como base para explicar los distintos pasos,  y ahí -entre otras muchas cosas-  se explica cómo trabajar con jerarquías y en un anexo como replicar los módulos o “schematic sheet symbols”.

En dicho tutorial se explica – excluyendo el anexo-  para un solo regulador de tensión.

Yo le he dado “una vuelta de tuerca” más y lo he hecho para un diseño dónde se trabaja con dos reguladores de tensión, de manera tal que mediante interruptores puedas poner en marcha uno (el A) o el otro (el B), o ambos a la vez (A y B). Para no complicarlo mucho he usado dos interruptores manuales.  

Para no alargar mucho el tutorial,  al final presento unos video-tutoriales dónde explico las  partes del diseño que he estimado más interesantes y dónde el lector (o lectora) no muy experimentado en jerarquías y multicapas podría encontrar más dudas.

Let´s go!

Tutoriales de los que parto encontrados en Internet:

 - Originales en Inglés:

Altium_Schematic_Tutorial.pdf

El anterior enlace tiene su continuación en el siguiente:



- Mis traducciones hechas en castellano con anotaciones añadidas para el lector:

Tutorial_Esquematicos_Altium

Tutorial_Layout_PCB_Altium

Según las preferencias de cada uno se puede seguir cualquiera de las dos opciones (inglés o español).

------------------------------------------------------------------------------------------------------------------------

Notas:

En las traducciones he procurado no hacer una traducción demasiado literal y a la vez ceñirme lo más posible al original.

Realicé una revisión rápida una vez acabadas las traducciones y me hubiera gustado hacer una segunda más, espero que el resultado sea del gusto de los lectores y eso no sea un gran impedimento para que esto resulte útil.

También cuento – tanto en las  traducciones como en los clips – que hay personas que podrían llegar a este blog y encuentren que mi castellano no es exactamente como al que suelen usar, Ojala que eso tampoco sea un impedimento serio. 

-----------------------------------------------------------------------------------------------------------------------

Cips o video-tutoriales para explicar las partes críticas del desarrollo del ejercicio:

Por ahí dicen que mi inglés se parece al loquendo traducido, ese programa que lee palabras y que suena a robot de la “Guerra de las Galaxias” (Star Wars). Seguro que el loquendo  pronuncia mejor que yo :D. En fin, se hace lo que se puede estimados lectores que hayáis llegado a este lugar recóndito de Internet.

1- Inicio: esquemáticos de punto de partida.


2- Trabajando con módulos (schematic sheet symbolos) en el esquemático y pasando al layout del PCB.


3- Seguimos con el diseño en layout del PCB. Replicando el footprint de los módulos.



Bueno, por el momento lo dejamos aquí. Usaremos este diseño en la siguiente publicación para abordar la cuestión de las multicapas o stack-up. See you soon!



Images

Manuales de ayuda para trabajar con PCBs multicapas.

Me he hecho un par de manuales sobre el concepto de "Stack-Up" o "apilamiento" (íntimamente ligado al concepto de PCBs con multicapas o multilayers).

Para ello he traducido al castellano un par de  interesantes manuales en inglés, y luego he añadido anotaciones sobre conceptos y términos que aparecen ahí.

En un principio lo hice para mí, pero creo que puede ser útil para las personas interesadas en el tema que se manejen mejor con el castellano que con el inglés (o que directamente no se manejen con el inglés).

Además, como están en formato PDF, cualquiera que lo desee lo puede tener en su disco duro sin necesidad de tener que ir a Google - o al buscador que use - .

Para el que entienda el inglés tan bien como el castellano -o mejor-, pues bueno, quizás encuentre aquí una posible traducción a parte de los links en inglés. Eso depende del uso que cada uno quiera darle a este blog.



Fuentes:

Como lo honrado es dejar las fuentes (en este caso en inglés) en las que te has basado, primero dejo los enlaces/links a esos lugares de Internet:

http://www.pcbcart.com/pcb-capability/layer-stackup.html

http://techdocs.altium.com/display/ADRR/PCB_Dlg-LayerStackConfigurationForm((Layer%20Stack%20Manager))_AD

Hay otros manuales y tutoriales magníficos sobre el tema, pero tienes que decidirte por algo porque sino puedes pasarte horas y horas navegando por Internet hasta que llega un momento en que  ni te acuerdas de lo que estabas buscando y para que.  Internet está lleno de ventajas pero también tiene sus inconvenientes.

Manuales:

A continuación dejo las traducciones hechas por mí completadas con comentarios y notas (en castellano).

Layer StackUp (apilamiento de capas).

El Layer Stack Manager de Altium

Ojalá pueda serle útil a algún lector.

En cualquier caso bienvenido sea cualquier navegante que "recale" por este puerto.


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: