I2C & UART con Analizador Lógico

En la actualidad es mucho más sencillo y barato que antes, fabricar dispositivos electrónicos. La mayoría de los equipos que se fabrican ahora son de tecnología digital, y si requieren algún ajuste, casi siempre se realiza mediante un software…  los ajustes internos han desaparecido.

La tecnología digital ha permitido también abaratar los costes de desarrollo y producción, hasta el punto que ahora cualquier aficionado a la electrónica pueda disponer de algunos equipos de medida que antes sólo estaban al alcance de los fabricantes.

Ahora es posible disponer de un analizador lógico de 8 canales por menos de 10€, aprovechando como interface gráfico un PC. El uso de un PC en los equipos de medida permite de forma muy sencilla actualizar sus prestaciones, sólo hay que actualizar el software de control en el PC.

Analizador Lógico USB LA1002 de 8 canales 24 MHz

Este analizador lógico permite grabar las secuencias digitales que transmiten los equipos en tiempo real, pudiendo analizar posteriormente los protocolos que utilizan, medir la velocidad de las comunicaciones, comparar señales, etc. Con un analizador lógico se reducen notablemente los tiempos dedicados al desarrollo, y al mismo tiempo sirve para entender mejor los protocolos utilizados en las comunicaciones digitales.

Analizador Lógico USB LA1002

Hace unos meses monté un receptor de radio controlado por Arduino. Este receptor de radio es totalmente digital. Todos sus ajustes y control se realizan mediante el bus de comunicaciones I2C. Para comprender mejor el funcionamiento de un analizador lógico, voy a utilizar este receptor de radio como ejemplo, y voy a grabar las comunicaciones I2C entre el módulo receptor de radio y Arduino, y al mismo tiempo las señales RX/TX de la UART de Arduino.

Receptor de radio FM-RDS conectado al Analizador Lógico

Bus I2C

Hace unos años publiqué un video dedicado al Bus I2C. En este caso sólo voy a hacer un resumen.

Bus I2C

El bus I2C es un protocolo de comunicaciones bidireccional compuesto por 3 hilos, Datos, Reloj y masa (GND). Al ser esta una señal síncrona, controlada por los impulsos del reloj, la velocidad es variable y sólo en casos especiales se superan los 100 KHz.

Ambas líneas permanecen conectadas a nivel alto, mediante resistencias Pull-Up, y son los dispositivos los encargados de cargar las líneas para generar los impulsos. El dispositivo que hace de máster es el encargado de generar la señal de sincronismo (Clock). El dispositivo que envíe los datos, ya sea máster o esclavo, es el encargado de generar la señal de datos.

Los cambios de nivel en el hilo de datos siempre suceden cuando el nivel del hilo del Clock está a nivel bajo. Cuando esto no se cumple, es porque se está generando el bit de Start o el de Stop. Las comunicaciones I2C siempre comienzan con un bit Start, y finalizan con un bit Stop. Cuando el hilo del Clock está en nivel alto y cambia de estado el hilo de datos: si cambia de 1 a 0, es un bit Start y si cambia de 0 a 1 es un bit Stop.

Bus I2C, direccionamiento y datos

La información se transmite en formato de 8 bits, salvo la dirección que se compone de 7 bit, utilizando el octavo bit como indicación del dispositivo máster,  para indicar al esclavo o receptor, si va a transmitir datos a continuación o espera recibirlos de él. En ambos casos, el dispositivo máster genera la señal de reloj y el primer Byte con la dirección.

Con el fin de mantener la comunicación activa, el dispositivo que hace de receptor carga la línea de datos cuando recibe un Byte correctamente, generando así el bit ACK a nivel bajo.

Si el dispositivo transmisor detecta un nivel bajo al finalizar el envío de cualquier Byte, puede continuar con el siguiente, y si  recibe el bit ACK a nivel alto, podría reenviar de nuevo la información o finalizar la comunicación generando un bit Stop.

Software: PulseView

El software PulseView es el complemento necesario para controlar el analizador lógico USB LA1002 de 8 canales, y se puede descargar desde el siguiente link: https://sigrok.org/wiki/PulseView

Software PulseView

UART y RS232

Las  comunicaciones de una UART también es de 3 hilos y bidireccional, pero a diferencia del I2C, la comunicación de la UART es asíncrona. La UART utiliza un hilo para transmitir, otro para recibir y el tercero es el hilo de referncia o GND. Al no disponer de una señal de sincronismo (clock), en el dispositivo receptor es necesario configurar la velocidad y formato de las comunicaciones que utiliza el dispositivo transmisor.

Bit: START/STOP

Para que el dispositivo receptor pueda sincronizar el inicio de cada Byte que recibe, el dispositivo transmisor inserta un bit de inicio y otro de fin, son los bit de Start y Stop. El bit de Stop se puede considerar como un tiempo de inactividad, o pausa entre Bytes. Así el tamaño del bit de Stop puede ser del tamaño de 1 bit de datos, de 1,5 o 2… y no se puede omitir.

Este tiempo de inactividad del bit Stop, aparte de marcar el fin de cada Byte, lo utiliza el terminal receptor para convertir los datos serie de cada Byte en paralelo y almacenarlos en la memoria buffer de la UART. Lo procesadores antiguos, cuando recibían datos a una velocidad alta disponían de muy poco tiempo para realizar todo el proceso de almacenar los datos. Aumentando el intervalo de tiempo entre Bytes (bit Stop), era posible aumentar la velocidad de las comunicaciones serie.

Bit: DATOS

El número de bits de datos de una UART es variable, entre 4 y 8 bits. Lo normal es utilizar el formato estándar de 8 bit, equivalente a 1 Byte. Los formatos inferiores permitían aumentar la velocidad de las comunicaciones en los procesadores antiguos. Por ejemplo, con 7 bits se pueden codificar los primeros 127 caracteres de la tabla ASCII.

El bus I2C envía los datos en serie empezando por el bit más significativo, bit MSB. La UART lo hace al revés, enviando primero el bit menos significativo, bit LSB. Al final del último bit de cada Byte, es posible enviar un bit de paridad.

Bit: PARIDAD

El bit de paridad se puede omitir, a diferencia de los bit Start y Stop que son imprescindibles. El bit de paridad protege ligeramente la integridad de los datos que se reciben, pudiendo omitir los Bytes erróneos. El valor del bit de paridad es necesario definirlo en las comunicaciones:

  • (N)one = sin bit de paridad
  • (E)ven = paridad PAR … bit de complemento para que el número de unos sea par
  • (O)dd = paridad IMPAR … bit de complemento para que el número de unos sea impar
  • (M)ark = siempre 1*
  • (S)pace = siempre 0*

(*) Permite diferenciar los Bytes de direccionamiento y datos en las comunicaciones RS485 y RS422, cuando se conectan varios dispositivos receptores en paralelo de diferente dirección.

Envío serie: RS232

UART y el interface RS232
En este ejemplo un PC transmite el número 5 del teclado por la UART y su interface serie RS232. Cuando el procesador no envía datos el nivel lógico a la salida de la UART es alto (inactividad) , y cuando se transmite un 0 el nivel lógico es bajo.

El interface serie RS232 convierte la señal continua pulsante en otra alterna de mayor nivel, protegiendo así las comunicaciones de posibles inducciones en los cableados. Es importante destacar que el interface serie invierte los niveles lógicos de la UART.

Esta UART está configurada para transmitir a una velocidad de 4800 bps, sin bit de paridad, 8 bit de datos y 1 bit de Stop. En total se envían 10 bits, y se necesita un tiempo ligeramente superior a 2 mSeg. para transmitir un Byte.

Gestión I2C del módulo SI4703 desde Arduino

Si abrimos las librerías del módulo receptor de radio SI4703, podemos ver que en los registros del 0x0A hasta el 0x0F se almacena el nivel de campo recibido, la frecuencia sintonizada y los 64 Bytes de datos del último grupo RDS recibido. Los datos del RDS se guardan en los 4 últimos registros, ordenados y etiquetados con la  letra de cada bloque.

Gestión I2C desde Arduino

Observando la rutina de lectura, comprobamos que siempre envía por I2C los 32 Bytes de los 16 registros, pero empezando por el 0x0A. Así el primer valor leído será el nivel de campo, a continuación la frecuencia sintonizada y el RDS, dejando para el final los registros desde el 0x00 hasta el  0x09. En total se envían por el bus I2C  33 Bytes:  1 Byte de dirección mas los 32 Bytes de los 16 registros.

Decodificación de los datos recibidos por I2C

Datos RDS decodificados de los datos I2C

En la imagen anterior vemos los datos del Bus I2C que Arduino ha leído del módulo receptor de radio (SI4703). He coloreado los paquetes, cambiado el color cada 32 Bytes de datos. Como vimos antes, los primeros 2 Bytes son los del registro 0x0A. El Byte menos siginificativo de los dos es el nivel de campo recibido: 0x33 (hexadecimal) y si los convertidos a decimal serían 51dBuV.

El registro siguiente, el 0x0B, es la frecuencia sintonizada: 0x0023 = 35 decimal. Ahora le sumamos 875 (910) y luego lo dividimos entre 10 para obtener la frecuencia en MHz = 91,0.

A continuación tenemos los 8 Bytes con los datos RDS del último grupo recibido. Si copiamos los 8 Bytes del RDS y comprobamos que tipo de grupo es, podemos decodificar toda la información que contiene.

Por este grupo estamos recibiendo el bit TA, M/S, 1 bit del DI, las 2 primeras letras del PS, 2 frecuencias alternativas, y además el resto de información genérica de todos los grupos RDS: PI, TP y PTY.

Si nos fijamos con más detalle en la captura de datos recibidos por el bus I2C, vemos que cada grupo RDS se está repitiendo 20 veces. Esto es debido a la alta velocidad de lectura del bus I2C, en relación a la velocidad del RDS.

¿Necesitas fabricar un PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos (PCB), pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

Logo: PCBWay

Ahora también puedes encargar trabajos 3D, mecanizados con CNC y fabricación de cajas metálicas o de plástico inyectado.

https://www.pcbway.es/

 

Reloj Pac-Man con ESP32 & UTF-8

Actualización del firmware (v1.44) para el Reloj-Texto construido con 4 matrices LED, y controlado con el microprocesador ESP32. Con esta actualización, el display podrá mostrar los caracteres latinos de uso más frecuente: áéíóúü ÁÉÍÓÚÜ cÇ ñÑ. También se incluyen los avisos con voz sintetizada, y efectos gráficos Pac-Man.

Reloj-Texto con dos alarmas y 2 husos horarios

UNICODE & UTF-8

La conexión entre diferentes redes de ordenadores provocó la necesidad de crear un estándar que contemplara el juego de caracteres gráficos de cualquier lengua, incluyendo ideogramas, caracteres árabes, chinos, etc.

Caracteres UNICODE

El año 1991 se anunció públicamente la creación de Internet, y ese mismo año el Consorcio Unicode y la ISO desarrollaron ambos un estándar para codificar los caracteres:  Unicode – ISO / IEC 10646. Ambos estándares se pueden considerar equivalentes, si tenemos en cuenta que el repertorio, los nombres de caracteres y los puntos de código del estándar ‘Unicode Versión 2.0’, coinciden exactamente con los de ISO / IEC 10646-1: que fue publicado en 1993.

Actualmente, la codificación dominante es UTF-8, que es una codificación de ancho variable diseñada para la compatibilidad con versiones anteriores de ASCII, y para evitar las complicaciones con las marcas de orden de bytes que existen con UTF-16 y UTF-32 . Además, el 93% de todas las páginas web están codificadas en UTF-8 y el Grupo de trabajo de ingeniería de Internet (IETF) requiere que todos los protocolos de Internet identifiquen las codificación UTF-8. También el Consorcio de correo de Internet (IMC), recomienda que todos los programas de correo electrónico puedan mostrar y crear correo utilizando UTF-8.

Codificación UTF-8

Los primeros 127 caracteres de cualquier tabla de caracteres de procedencia anglosajona o latina, son comunes y su origen es la tabla de caracteres ASCII. Este conjunto de caracteres se pueden codificar dentro de una matriz binaria de 7 bit., y son los caracteres que por defecto muestra cualquier display.

Caracteres ASCII de 7 bits

Si queremos mostrar los caracteres específicos de cualquier lengua, por ejemplo las letras acentuadas, tendremos que ampliar de tamaño la matriz del display que almacena los caracteres en memoria, y asociar una posición específica a cada uno de los caracteres dentro de esa matriz.  De esta forma, la tabla de caracteres que almacena el display no se corresponderá con el código del carácter que recibamos a través del interface Web. Así el procesador del display tendrá que comprobar el código del carácter que recibe, y si es superior al 127,  reposicionar el código para apuntar al gráfico que tenemos asociado a ese código entrante, dentro de la matriz gráfica del display. El tamaño de la matriz gráfica del display suele ser de 8 bit, y con esto es posible almacenar 127 caracteres extra, que podrían ser letras acentuadas, logotipos o cualquier dibujo.

Integración UTF-8 en el display

Si pretendemos que los caracteres de este reloj se puedan programar a través de un interface Web, es necesario utilizar una codificación de caracteres estándar, y la más versátil es la codificación UTF-8 de 2 Bytes.

Este reloj utiliza 3 tipos de fuentes gráficas, dos de ellas limitadas a los 10 números, utilizadas para mostrar los dígitos de la hora en formato estrecho y ancho, y la otra es la que almacena los caracteres ASCII, desde el espacio cuyo código es 32 en decimal, hasta el 126 que es la tilde de la letra eñe, más conocida como virgulilla ~. A continuación, y a partir del código 127, es donde se almacenan los caracteres extra.

Hay muchas formas de almacenar las fuentes gráficas en un display, pero la forma más eficiente es asociar un Byte a los 8 pixeles que tiene cada columna de la matriz LED. Así es más rápida la gestión que tiene que hacer el procesador para desplazar los textos por el display.

La fuente de textos y gráficos de este display es de ancho variable, entre 2 y 5 pixel de ancho por 8 pixel de altura. Así se limita el ancho a las letras que no lo necesiten, por ejemplo el espacio, y se pueden mostrar más caracteres en el display.  Para localizar los caracteres en la matriz, todos ellos ocupan 6 Bytes. El primer Byte indica el ancho del carácter, que se corresponde al número de Bytes que tiene que leer el procesador para formar la letra en el display.

Para facilitar la interpretación visual de los gráficos, los 5 Bytes de cada carácter se suelen escribir en formato binario, pero también se podría escribir en formato hexadecimal o decimal si se quisiera reducir el tamaño del archivo en el editor.

En el gráfico siguiente. vemos el esquema de codificación de caracteres UNICODE, junto con UTF-16 y UTF-8.

Cuando se asigna un código a un carácter, se dice que dicho carácter está codificado. El espacio para códigos tiene 1.114.112 posiciones posibles (0x10FFFF). En el grafico anterior vemos el espacio de códigos dividido en tramos, con el fin de mostrar los diferentes esquemas de codificación UTF. Los puntos de código se representan utilizando notación hexadecimal agregando el prefijo U+.

Actualmente los sistemas operativos limitan la tabla UNICODE a los primeros 65.536 caracteres (0xFFFF), y el valor hexadecimal se muestra añadiendo ceros a la izquierda si es necesario, hasta completar los 4 dígitos hexadecimales.

Es conveniente aclarar, que los sistemas operativos disponen de diferentes tablas de caracteres, algunas de ellas son privadas, y no se deberían utilizar en un documento público con acceso a Internet, ya que no son un estándar.

Internamente en un PC se podría crear un documento utilizando cualquier fuente de caracteres, con el fin de mostrar algún gráfico en especial. El problema es si ese mismo documento se abriese utilizando una fuente de caracteres diferente; porque algunos caracteres ya no serían los mismos.

Si queremos codificar caracteres en UTF-8, limitando su longitud máxima a dos Bytes por carácter, sólo podremos codificar los primeros 2.048 caracteres UNICODE, y recibiremos caracteres de 11 bits. Así cuando recibamos un Byte en UTF-8 que comience con 110, sabremos que se trata de un carácter doble, y los 5 bits siguientes de ese Byte serán los 5 bits más significativos del carácter UNICODE que estamos recibiendo, sin olvidar que este carácter  tiene una longitud de 11 bits. A continuación recibiremos el segundo Byte, el cuál empezará con los bits 10, y a continuación recibiremos los 6 bits menos significativos del carácter UNICODE.

Decodificación UTF-8

  1. Cuando el bit más significativo de un Byte en UNICODE comience con un 0, la longitud del código UTF-8 no cambia, manteniendo el mismo valor UNICODE, y respetando así su compatibilidad con la tabla ASCII.
  2. Si se recibe un Byte en UTF-8 que empieza con los bits 110, su longitud será de 2 Bytes, y el segundo Byte empezará siempre por 10.
  3. Si se recibe un Byte en UTF-8 que empieza con los bits 1110, su longitud será de 3 Bytes, y los dos Bytes siguientes al primero empezarán con 10.
  4. Si se recibe un Byte en UTF-8 que empieza con los bits 11110, su longitud será de 4 Bytes y los 3 Bytes siguientes al primero empezarán con 10.

Esquema de montaje

Para que este display Reloj-Texto funcione, sólo hay conectar 5 hilos entre un lateral del display LED y el módulo ESP32. El sonido de la alarma y el audio sintetizado sale por el pin GPIO26 del módulo ESP32, y hay que conectarlo a un amplificador de audio con su altavoz.

Firmware (v1.44)

El archivo que necesitas para programar el ESP32, lo puedes descargar de forma gratuita desde el repositorio GitHubClock-Text_ESP32

Interface Web y ajustes

Este reloj se controla a través de cualquier dispositivo móvil, siempre que esté conectado a la misma red WiFi. El reloj dispone de 2 interfaces Web diferentes, pudiendo elegir su modo de funcionamiento. El reloj funciona de forma muy parecida en ambos modos, presentando la hora de acuerdo al formato que se haya configurado, y cada 30 segundos mostrando un rotación de texto.

  • Cuando el display está configurado en modo RELOJ: el texto será el día de la semana y la fecha; pero sólo en caso de que estuviese habilitada su presentación, porque en caso contrario el reloj siempre mostrará la hora.

Interface RELOJ: se puede modificar el huso horario al cuál se debe sincronizar el reloj, realizar los ajustes de formato y presentación de la hora, y modificar el brillo del display.

  • Cuando el display está funcionando  en modo MENSAJE: cada 30 segundos intercalará una rotación del texto que tenga programado.

Interface MENSAJE: se puede ajustar la velocidad de desplazamiento del texto, modificar el contenido del mensaje, y fijar la hora y repeticiones de sus dos alarmas.

Ambos interfaces disponen de un botón para cambiar su modo de funcionamiento, teniendo en cuenta que el reloj primero se reiniciará, sincronizando de nuevo la fecha y hora con el servidor NTP que le corresponda al uso horario ajustado. Al reiniciar el reloj, el punto de acceso WiFi al que se conecta,  podría asignar una dirección IP diferente a la anterior. También se han incorporado dos botones nuevos, uno para mostrar la hora con voz, muy interesante para personas invidentes, y el otro para forzar el borrado del display en cualquier momento, mediante la aparición de Pac-Man.

Con esta nueva versión (v1.44), es posible escribir textos utilizando letras acentuadas y la letra Ñ, tanto en mayúsculas como en minúsculas. Además, si el reloj está configurado con el huso horario de España y el formato de presentación de la hora es el Europeo, los textos del día de la semana y fecha, aparecerán traducidos al Español.

¿Necesitas fabricar un circuito impreso?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos (PCB), pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

PCB de prototipo gratis y con plazo de entrega rápido: https://www.pcbway.es/

Logo: PCBWay

 

 

 

En hora con DCF77

Desde hace años, los sistemas de sincronización horaria han ido evolucionando. No hace mucho tiempo, todos los relojes de uso doméstico había que ponerlos en hora de forma manual cada cierto tiempo. Cada vez que se hacía un cambio oficial de la hora, teníamos que ajustar de forma manual la hora del PC, el reloj de todos electrodomésticos,  los equipos de audio y grabación de video, el reloj del automóvil, etc. Actualmente con Internet, esto ha cambiado mucho. Todos los equipos que disponen de una conexión a Internet, tienen la posibilidad de mantener con gran precisión la información de fecha y hora, y ajustar los cambios de hora de forma automática. Sin embargo, desde hace muchos años existen sistemas de sincronización horaria, incluso anteriores a la aparición del GPS. Uno de los sistemas más utilizados en Europa, es el DCF77.

¿Qué es DCF77?

DCF77 es una estación de radio situada en Alemania, que transmite en onda larga (LW). Comenzó a funcionar como una estación de frecuencia estándar el 1 de enero de 1959, y a partir de junio de 1973 se incorporó en la transmisión la información de la fecha y la hora.

Cobertura DCF77

El transmisor DCF77 está controlado por Physikalisch-Technische Bundesanstalt (PTB), el laboratorio nacional de física de Alemania, y transmite en funcionamiento continuo (24 horas).

Transmisor DCF77

El transmisor es operado por Media Broadcast GmbH (anteriormente una subsidiaria de Deutsche Telekom AG ), en nombre del laboratorio nacional de física PTB.

Physikalisch-Technische Bundesanstalt (PTB)

La frecuencia portadora de la señal DCF77 es de 77,5 kHz (aproximadamente 3.868,3 m. de longitud de onda) y se genera a partir de relojes atómicos locales que están vinculados con los relojes maestros alemanes en el el laboratorio nacional de física de Alemania en Braunschweig. La señal horaria del DCF77 se utiliza para la difusión del tiempo legal nacional en Alemania.

Reloj atómico CS2

La transmisión DCF77 marca segundos al reducir la potencia de la portadora durante un intervalo que comienza cada segundo. La duración de la reducción se varía para transmitir un bit de código por segundo, codificando toda la información de fecha y hora a lo largo de cada minuto.

Modulación de amplitud

La señal DCF77 utiliza la codificación de cambio de amplitud para transmitir información de tiempo, codificada digitalmente al reducir la amplitud de la portadora hasta un 15% de lo normal (−16,5 dB) durante 0,1 o 0,2 segundos al comienzo de cada segundo. Una reducción de 0,1 segundos indica un 0 binario; y una reducción de 0,2 segundos indica un 1 binario. Como un caso especial, el último segundo de cada minuto se marca sin reducción de la potencia portadora. La portadora DCF77 está sincronizada de modo que el cruce por cero ascendente se produce al inicio de cada segundo. Todos los cambios de modulación también ocurren al aumentar los cruces por cero.

Modulación en amplitud DCF77

Hasta el año 2006 también hubo una identificación de la estación con el código Morse, que se enviaba durante los minutos 19, 39 y 59 de cada hora. Finalmente se suspendió, ya que la estación es fácilmente identificable por su señal característica. Se generaba un tono de 250 Hz mediante la onda cuadrada que modula la portadora entre el 100% y el 85% de potencia, y el distintivo de llamada era «DCF77«.

Modulación de fase

Además de la modulación en amplitud, durante 792,78 mSeg. y a partir de 200 mSeg., cada bit de código de tiempo se transmite utilizando un espectro ensanchado de secuencia directa. El bit se mezcla con una secuencia de chips pseudoaleatorios de 512 bits, y se codifica en la portadora utilizando el cambio de fase de ±13°. La secuencia de chips contiene cantidades iguales de cada fase, por lo que la fase promedio permanece sin cambios. Cada chip abarca 120 ciclos de la portadora, por lo que la duración exacta es de los ciclos 15.500 a 76.940 de 77.500. Los últimos 560 ciclos (7,22 mSeg) de cada segundo no están modulados en fase.

Modulación en amplitud y fase del transmisor DCF77

Dentro de la modulación de fase, el bit 59 se transmite como un bit 0 ordinario, y los primeros 10 bits (segundos 0–9) se transmiten como 1 binario.

Cuando se compara con la modulación de amplitud, la modulación de fase hace un mejor uso del espectro de frecuencia disponible y da como resultado una distribución de tiempo de baja frecuencia más precisa con menos sensibilidad a las interferencias. Sin embargo, muchos receptores DCF77 no utilizan la modulación de fase. La razón de esto es la disponibilidad mundial de las señales (referencia horaria precisa) transmitidas por los sistemas de navegación global por satélite como el Sistema de Posicionamiento Global (GPS) y GLONASS .

Interpretación del código de tiempo

El tiempo se representa en decimal codificado en binario. Representa el tiempo civil, incluidos los ajustes de horario de verano. El tiempo transmitido es el correspondiente al minuto siguiente. Por ejemplo, a las 23:59 del próximo 31 de Diciembre de 2019, se transmitiría la información de las 00:00 del 1 de Enero de 2020.

Codificador DCF77

La modulación de fase generalmente codifica los mismos datos que la modulación de amplitud, pero difiere para los bits 59 a 14, inclusive. El bit 59 (sin modulación de amplitud) se modula en fase como un bit 0. Los bits 0–9 se modulan en fase como 1 bits, y los bits 10–14 se modulan en fase como 0 bits. La información de protección civil y la información meteorológica no se incluye en los datos modulados en fase.

Dos indicadores advierten que los cambios ocurrirán al final de la hora actual: un cambio de zonas horarias y una inserción de segundo intercalar (esta operación se realiza para ajustar los relojes con el calendario solar). Estas indicaciones están presentes durante toda la hora anterior al evento. Esto incluye el último minuto antes del evento, durante el cual los otros bits del código de tiempo (incluidos los bits indicadores del huso horario) codifican la hora del primer minuto después del evento. Los bits de zona horaria pueden considerarse una representación codificada en binario del desplazamiento UTC . El conjunto Z1 indica UTC+2 , mientras que Z2 indica UTC+1. En el caso de un segundo intercalar, se inserta un bit 0 durante el segundo 59, y el bit faltante especial se transmite durante el segundo salto, segundo 60.

Los primeros 20 segundos son indicaciones especiales. Los minutos se codifican en los segundos 21–28, las horas durante los segundos 29–34 y la fecha en los segundos 36–58. Aunque el código de tiempo solo incluye dos dígitos del año, es posible deducir dos bits de siglo utilizando el día de la semana. Aún así existe ambigüedad cada 400 años, ya que en el calendario gregoriano se repiten semanas cada 400 años, pero esto sería suficiente para determinar qué años de los que terminan en 00, son años bisiestos.

Sincronización de redes con DCF77

DCF77 se creó para cubrir la necesidad que existía de disponer de un sistema de sincronización vía radio, con gran cobertura y la precisión de un reloj atómico. La señal DCF77 se utiliza para sincronizar sistemas de seguimiento a satélites, telescopios, redes transmitiendo en isofrecuencia (SFN), etc.

Red de transmisores en isofrecuencia

¿Necesitas fabricar un circuito impreso?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos (PCB), pero no en todas podemos conseguir pequeñas tiradas a buen precio. Por suerte, ahora disponemos de Internet y es mucho más fácil que antes. Podemos buscar empresas en cualquier parte del mundo, y es más fácil encontrar un fabricante que haga nuestros prototipos (PCB) a buen precio. Una de las empresas más grandes del sector es PCBWay.

Logo: PCBWay

https://www.pcbway.es/

Ahora el servicio de montaje en PCBWay por $ 30, con envío GRATUITO mundial:
https://www.pcbway.es/quotesmt.aspx

Transmisor experimental DCF77

 

¿Rendimiento o Duración LED?

La reciente retirada a la venta de las bombillas de filamento, ha creado una gran demanda de bombillas LED. Esto ha provocado la aparición de nuevos fabricantes, intentando hacerse un hueco en el mercado con sus bajos precios. Por falta de normativa, los fabricantes de lámparas LED no tienen la obligación de informar de la tecnología que emplean para fabricar sus lámparas. Ahora existen muchas bombillas LED con muy buen aspecto exterior, utilizando en su interior el mínimo número de componentes posibles y de muy baja calidad.

Iluminación eléctrica

La iluminación eléctrica está con nosotros desde la época de Edison, hace ya más de 100 años. Desde entonces hemos estado utilizando bombillas de incandescencia.

Tubos fluorescentes

Con el paso del tiempo, los sistemas de iluminación han ido evolucionando poco a poco, y siempre buscando el mejor rendimiento eléctrico. Bombillas halógenas, bombillas y tubos fluorescentes, bombillas de descarga xenón… y desde hace muy pocos años la iluminación LED.

Iluminación LED

Con la tecnología actual es posible fabricar sistemas de iluminación LED de alta potencia a un precio muy competitivo. Las ventajas del LED superan con creces la inversión inicial que se tiene que hacer en su compra.

Retirada a la venta de las bombillas de filamento

Debido al gran ahorro energético que se obtiene con la iluminación LED, la mayoría de los Gobiernos han creado Leyes para que se dejen de fabricar las bombillas de mayor consumo. Se ha empezado por las bombillas de filamento, pero poco a poco sucederá lo mismo con las demás.

La alta demanda de bombillas LED ha provocado la aparición de muchos fabricantes nuevos, y todos ellos compitiendo con el mejor argumento de ventas: bajar los precios. Pero como no existe una normativa acorde a esta nueva tecnología, esa bajada de precio suele ir acompañada con una pérdida en la calidad y ahorro en los diseños, reduciendo así la duración y fiabilidad teórica que podría aportar la iluminación LED.

Comprar hoy una bombilla LED de marca reconocida, a pesar de que sea más cara que otra aparentemente igual, podría ser una buena inversión.

¿Rendimiento o duración?

Los sistemas de iluminación los podemos dividir en dos grupos. Uno de ellos sería el dedicado al alumbrado, dónde lo más importante es obtener un alto rendimiento lumínico, reduciendo al máximo el consumo energético.

Y el otro sería el destinado a la señalización y decoración, dónde lo más importante es la fiabilidad y duración, pasando a un segundo plano el rendimiento y consumo.

Para diseñar una bombilla LED destinada al alumbrado, los fabricantes apuran al máximo las prestaciones de los LED, haciéndolos trabajar en el punto de mayor rendimiento lumínico, a pesar de que esto implique una reducción considerable de su vida útil.  Otro problema es que dentro de la propia lámpara tiene que alojar una pequeña fuente de alimentación para convertir la tensión alterna de la red en continua, controlando a su vez que los LED trabajen en su punto más óptimo

Secretos ocultos en las lámparas LED

¿Por qué duran tan poco tiempo la mayoría de las lámparas LED?. Desde que cambié todas las lámparas de filamento de mi casa por lámparas LED, cada 2 o 3 meses tengo que sustituir alguna. Después de haber reparado unas cuantas lámparas, me he puesto a investigar un poco. Por falta de normativa, los fabricantes de lámparas LED no tienen la obligación de informar de la tecnología que emplean para fabricar sus lámparas. Por ejemplo: tipo de driver, factor de potencia, calidad de los LED, etc.

Durabilidad y seguridad con la iluminación LED

Actualmente los LED de alta eficiencia luminosa, son la alternativa más aconsejable para sustituir las lámparas de iluminación tradicional. Con la iluminación LED se mejora notablemente la eficiencia lumínica, y además es posible modificar su color de forma muy sencilla, pudiendo crear diferentes ambientes y regularlos de forma automática.

Iluminación LED

La vida útil de un diodo LED es muy alta en comparación con una lámpara de filamento. El problema es que existen muchas variables para que esto se cumpla, y ese número tan elevado de horas que indican los fabricantes, por desgracia nunca llega a cumplirse.

Vida útil LED

La iluminación LED es muy directiva, y siempre es necesario agrupar un número de diodos para conseguir mayor rendimiento lumínico. Lo normal en una bombilla LED, es que esté compuesta por un número determinado de diodos y estén todos conectados en serie. En estos casos la probabilidad de fallo aumenta, porque si falla un sólo LED de la serie, la bombilla se apaga. Así la vida útil de una bombilla LED que esté compuesta por muchos LED en serie, será menor que otra que tenga menos diodos (gráfica anterior).

Ventajas e inconvenientes LED

La iluminación LED es más robusta que la iluminación tradicional en cuanto a golpes y vibraciones; pero también es mucho más sensible a la humedad, temperatura y corriente de trabajo. Aparte de esto, las lámparas LED funcionan con baja tensión y corriente continua. Por ese motivo necesitan un circuito electrónico que controle su encendido, y esto añade una complejidad extra al diseño de las lámparas LED.

Tipos de ‘driver’ LED

Los LED se alimentan con baja tensión, y además continua. Para conectarlos a la red eléctrica se necesita un pequeño circuito electrónico que rectifique la tensión alterna de la red (125/220 VAC), y la adapte a la tensión y corriente de trabajo del tipo de LED que contenga cada bombilla.

Cálculo de la resistencia LED

Estos circuitos son conocidos con el nombre ‘driver de alimentación  LED‘. Existen diferentes modelos de driver, pero los podemos agrupar en tres tipos.

Tipos de driver LED

Como no existe una normativa que ‘oblige’ a los fabricantes a cumplir unos mínimos de calidad y seguridad en sus diseños, todos intentan reducir sus costes de fabricación, y la durabilidad de las lámpara es lo primero que se resiente, pudiendo llegar incluso a construir diseños potencialmente peligrosos. Alimentar los LED de un a bombilla con una fuente capacitiva, es la solución más utilizada por los fabricantes que sólo buscan reducir su precio.

Bombilla LED con fuente capacitiva

Estas fuentes alimentan la serie de LED de la bombilla a partir de rectificar la tensión de red. La limitación de corriente la consiguen colocando un condensador en serie, el cuál ofrece una resistencia al paso de la corriente alterna (reactancia capacitiva). El problema es que la tensión de salida varía en función de la carga, y no está estabilizada. Así cualquier fluctuación de la red afecta directamente a los LED, y si alguno diodo de la serie se abre, al no circular corriente la tensión subirá al máximo. Si la alimentación de la red es de 220 VAC, a la salida tendremos 220 x 1,41 = 310 VDC. En algunos casos, el fabricante también ahorra en el precio de los componentes que utiliza, y montan condensadores electrolíticos que no soportan tensiones tan altas, y revientan…Condensador reventado

pudiendo provocar que la carcasa de la bombilla se rompa y caiga al suelo.

FLUX para electrónica

Prueba comparativa de 4 tipos de FLUX en gel, haciendo soldaduras en un circuito impreso. El FLUX en gel evita la formación de carbonilla durante las soldaduras, permitiendo mantener durante más tiempo el soldador y evitando que se produzcan cortocircuitos entre soldaduras muy próximas. El FLUX en gel es casi imprescindible, para soldar circuitos integrados con encapsulado de tipo SMD.

Soldar con Flux

Temperatura de fusión del estaño

Para soldar componentes con encapsulado SMD, es muy importante utilizar un estaño de buena calidad y baja temperatura de fusión. Un exceso de temperatura en el soldador podría dañar los componentes o desprender las pistas del circuito impreso.

Temperatura de fusión del estaño

El estaño para SMD y su temperatura de fusión

Soldar con Flux

El Flux hace la función de decapante en el metal, facilitando el reparto del estaño y la formación de carbonilla. Existe una gran variedad de Flux, pueden encontrarse en forma líquida, en gel o crema. El Flux líquido cumple perfectamente con la función de decapante, se evapora rápidamente y no suele dejar residuos. El flux líquido es muy útil para facilitar el estañado de cables y soldar componentes en un circuito impreso. El Flux en gel facilita mucho las soldaduras de los componentes SMD, recubre la soldadura cuando se funde el estaño, evitando la formación de carbonilla y cortocircuitos cuando se sueldan circuitos integrados con terminales muy próximos. A continuación puedes ver la diferencia de sumergir un cable en estaño líquido sin utilizar flux, o impregnar el cable con flux antes de sumergirlo en el estaño.

Estañado sin Flux

Estañado con Flux

Comparativa con 4 tipos de Flux

Como existen muchos tipos de Flux en gel, decidí hacer una prueba comparativa utilizando 4 compuestos diferentes. Para la muestra he elegido tres compuestos muy utilizados en electrónica y otro empleado en fontanería.

Tipos de Flux

Las pruebas las he realizado con un soldador de punta gorda a 250 ºC. La prueba consiste en realizar una soldadura en un circuito impreso virgen, manteniendo el soldador durante el mismo tiempo en un punto (sin moverlo), aplicando la misma cantidad de estaño y utilizando un Flux de cada tipo.

Resultados

Conductividad del Flux

FP3030: es un flux de fontanería muy válido para estañar cables, pero no es adecuado para su uso en circuitos impresos. Decapante muy rápido que se evapora con rapidez, dejando al descubierto la soldadura… y además no es aislante (10··15 KOhm).

MC-559-ASM: flux adecuado para soldar componentes de tipo SMD, siempre que se retiren los restos de flux después de la soldadura. Este flux no es completamente aislante, antes de calentarlo se puede medir una resistencia de 12··16 MOhm.

M-223: flux adecuado para soldar componentes de tipo SMD, es un poco más denso que el MC 559, pero su decapante es un poco más lento. A cambio, es aislante y podría ser más apropiado para soldar componentes con encapsulado BGA.

Future HF Rework Jelly: flux adecuado para soldar componentes de tipo SMD, con densidad similar al MC-559 y además es aislante… sería el más adecuado para soldar componentes con encapsulado BGA.

 

 

Programar sistema horario 12/24 (assembler)

Programación de un reloj LED, para que pueda mostrar la hora en cualquier formato (12h-24h). Esta modificación se realiza en un ‘Reloj-Fecha-Cronómetro-Temperatura‘ con 4 dígitos de 7 segmentos LED, de control serie. El controlador de este reloj está construido a partir del microprocesaror AT89S52, con encapsulado de 44 pines (SMD).

Sistema horario

El sistema horario de 24 horas es una convención de medición del tiempo, en la que el día se contabiliza de medianoche a medianoche. Con formato de 24 horas, las horas se empiezan a contar a partir de la medianoche, y se presenta con los números comprendidos entre el 0 y 23.

Sistema horario de 12/24 horas

El sistema de 24 horas es el más utilizado en la actualidad, y el sistema de 12 horas se utiliza principalmente para la comunicación oral, porque es más intuitivo. A pesar  de que el sistema de 24 horas es el más usado en comunicaciones escritas, en algunos países lo denominan como horario militar o astronómico, y prefieren realizar la presentación de la hora utilizando el sistema tradicional de 12 horas.

Esta actualización se realiza en el Reloj SMD que mostré anteriormente:

Construye un Reloj SMD

Planteamiento al programar el reloj

Cuando se programa el firmware de un reloj, es importante saber si el display de presentación es multiplexado o no, así como el valor de tiempo mínimo a mostrar.

  • Cuando el display es multiplexado, el microprocesador tiene que enviar la información con una cadencia mucho más rápida,  siempre superior a la persistencia del ojo humano. Si se quiere evitar el efecto de parpadeo, la frecuencia de refresco del display debería ser como mínimo de 50 Hz.
  • La cadencia de lectura de la información horaria debe ser igual o superior al valor del tiempo mínimo que se quiera mostrar en el display. Si el reloj muestra décimas de segundos, el microprocesador tendría que leer la información del chip RTC con una cadencia mínima de 1/10 segundos, cada 100 mSeg.

Funcionamiento del reloj

A pesar de que el Reloj SMD no es multiplexado, porque la presentación se realiza enviando los datos en serie (registro de desplazamiento), lo he programado con una frecuencia de refresco muy alta.

CPU: Reloj SERIE

 

Display: Reloj SERIE

Esto lo hice así, porque utilicé la estructura de programa del reloj de esfera rotante FC-209, el cuál si era multiplexado.

Reloj LED con 2 alarmas

Antes de presentar la hora en el display por primera vez, el microprocesador tiene que leer la información del chip RTC (DS1302). Y si el reloj muestra segundos, la lectura se debería hacer que como mínimo una vez por segundo.

Frecuencia de refresco del display

Aprovechando las prestaciones y velocidad del microprocesador que he utilizado, decidí insertar la rutina de lectura del chip DS1302 (RTC) dentro de la rutina de refresco del display. Como se puede ver en la gráfica anterior,  la lectura se está haciendo con una cadencia de 926 veces por segundo.

Actualización del firmware

La nueva actualización del Reloj SMD, la puedes descargar de forma gratuita desde el siguiente enlace:

J_RPM_v2_RELOJ_SERIE.HEX

Con esta actualización es posible configurar el sistema de presentación horaria en el display, pudiendo elegir el sistema de 12/24 horas.  Para incorporar esta función, he utilizado el método más sencillo de hacerlo: Internamente todo funciona en modo 24 horas, y dependiendo del modo en el que se deba mostrar la hora, el programa pasará o no a través de las rutinas de conversión a formato de 12 horas. Y esto lo hará sólo  antes de enviar la hora al display, porque los menús de configuración siempre mostrarán la hora utilizando el formato de 24 horas. Así no será necesario modificar los menús de configuración, ni cambiar el sistema horario del chip DS1302 (RTC). A continuación os muestro el código que he añadido en esta actualización.

Rutinas de programación en assembler

Funcionamiento de la subrutina: ValAB

Funcionamiento de la rutina Val_AB

Menús de configuración

Los menús de configuración de esta versión (v2), no cambian con respecto a la  versión anterior (v1). En esta versión aparece un nuevo menú, y es para configurar el sistema de presentación horaria (12/24) del reloj.

Menús de configuración del reloj

 

ARDUINO a fondo… no te lo pierdas!!!

Configuración de un ATmega8A para hacerlo funcionar en un Arduino UNO. Si utilizas Arduino, te aconsejo que no te pierdas este artículo, porque encontrarás la información que necesitas para saber cómo funciona y esclarecer algunas dudas.

Programador ISP, con Arduino UNO

Contenido

Descripción comparativa entre el ATmega8A y el ATmega328P (capacidad de memoria, rango de tensiones, frecuencia máxima de trabajo). Configuración del IDE de Arduino (software de programación) y sus diferentes modos de funcionamiento. Convertir un Arduino UNO en programador ISP, cunstruyendo un ‘shield’ con zócalo de 28 pines, para programar cualquier ATmega compatible… y en el video final encontrarás las explicaciones, consejos y algunos trucos.

ATmega328P / ATmega8A

El  microprocesador ATmega8A tiene una arquitectura muy parecida al ATmega328P, ambos son AVR, aunque existen algunas diferencias en cuanto a sus prestaciones.

Esquema de bloques: ATmega8A

Esquema de bloques: ATmega328P

El ATmega8A podría utilizarse en la placa de desarrollo de Arduino UNO en sustitución del ATmega328P, siempre que se tengan en cuenta sus limitaciones.

Comparativa: ATmega328P / ATmega8A

Ambos circuitos integrados son compatibles en cuanto a su encapsulado conexiones y funcionamiento, de hecho el ATmega8A es uno de los primeros microprocesadores que se empezaron a utilizar con Arduino. Antes de montar un ATmega8A en la placa de desarrollo Arduino UNO, habría que programar su Boot Loader, y colocarlo en el lugar adecuado de su memoria Flash.

Boot Loader

El Boot Loader es el mecanismo de auto programación que permite cargar y descargar el código del programa desde el propio micro controlador. Esta característica permite que las actualizaciones del software sean controladas por el propio micro controlador, y esto lo hace  utilizando un pequeño programa de arranque, llamado Boot Loader…  y este ocupa una pequeña parte de la memoria Flash.

El Boot Loader o cargador de arranque, puede utilizar cualquier interfaz de datos y protocolo para leer y escribir el código del programa, tanto el de la memoria Flash como el de la memoria de programa.

Boot-Loader ARDUINO

El código del programa alojado en la sección del Boot Loader tiene la capacidad de escribir en toda la Flash, incluido el propio gestor de arranque de memoria. O dicho de otra manera, el Boot Loader tiene la capacidad de modificarse y borrarse a sí mismo.

El tamaño de la memoria del Boot Loader se puede configurar mediante el estado de unos bits denominados ‘fusibles’, y dispone de dos conjuntos separados, aparte de los bits Boot Lock (bits de bloqueo), los cuales permiten seleccionar los diferentes niveles de protección del micro procesador.

Fusibles en una memoria PROM

Secciones de la memoria FLASH

La memoria flash está organizada en dos secciones principales, la sección de la aplicación y la sección del cargador de arranque. El tamaño de las diferentes secciones está configurado por los fusibles BOOTSZ. Estas dos secciones pueden tener diferentes niveles de protección, ya que tienen diferentes conjuntos de bits de bloqueo.

Sección de la aplicación

La sección de la aplicación se encuentra dentro de la memoria Flash, y es la que se utiliza para almacenar el código principal del programa. Los  niveles de protección para la sección de la aplicación se configuran con los bits del Boot Lock. Dentro de la sección de la aplicación no se puede almacenar ningún código del cargador de arranque, ya que la instrucción SPM quedaría deshabilitada cuando se ejecuta esta sección.

BLS – Sección del cargador de arranque

Si bien la sección de la aplicación se utiliza para almacenar el código de principal del programa, el software del Boot Loader debe almacenarse dentro de la sección de arranque (BLS), ya que la instrucción SPM sólo puede iniciar una programación cuando se ejecuta desde el sector de arranque (BLS). La instrucción SPM puede acceder a todo el contenido de la memoria Flash, incluso al propio  sector de arranque (BLS). El nivel de protección para la sección Boot Loader puede seleccionarse mediante los bits de bloqueo del cargador de arranque.

Secciones de lectura sin escritura y sin lectura mientras se graba

Si la CPU admite la lectura mientras escribe (Read-While-Write) o si la CPU se detiene durante un software Boot Loader, la actualización depende de la dirección que se está programando. Además de las dos secciones, que son configurables mediante los fusibles BOOTSZ, la memoria Flash también se divide en dos secciones fijas: la sección leer mientras se escribe (RWW) y la sección sin lectura mientras se escribe (NRWW). El límite entre las secciones RWW y NRWW depende del modelo de micro controlador que se utilice.

La principal diferencia entre las dos secciones es:

  • Al borrar o escribir dentro de la sección RWW, la sección NRWW puede leerse durante la operación.
  • Al borrar o escribir dentro de la sección NRWW, la CPU se detiene hasta que finalice el proceso.

El software del usuario no puede leer ningún código que se encuentre dentro de la sección RWW durante la ejecución del sector de arranque.

El significado de leer mientras escribe (Read-While-Write) se refiere a cuando se borra o escribe en la memoria, es decir, cuando se está programando. Y esto no es posible hacerlo cuando se está ejecutando el gestor de arranque.

RWW – Sección de lectura mientras se escribe

Cuando se actualiza el programa con el Boot Loader y se está cargando código dentro de la sección RWW, es posible leer código del Flash, pero solo el código que se encuentra en la sección NRWW. Durante un proceso continuo de programación, el software debe garantizar que la sección RWW nunca se lea. Si a través de software se intentara leer dentro de la sección RWW durante la programación, el software podría terminar en un estado desconocido. Para evitar esto, las interrupciones tienen que deshabilitarse o moverse dentro de la sección del Boot Loader,  porque la sección Boot Loader siempre se encuentra en sección NRWW.

NRWW – Sección sin lectura mientras se escribe

El código ubicado en la sección NRWW se puede leer cuando el software Boot Loader está programando la sección RWW. Cuando el código Boot Loader programa la sección NRWW, la CPU se detiene hasta que termine la operación.

Bits de bloqueo del cargador de arranque (Boot Loader)

Cuando no se programa el Boot Loader, toda la capacidad de la memoria el Flash queda disponible para el programa. El cargador de arranque tiene dos conjuntos separados de bits de bloqueo, los cuales se pueden configurar de forma independiente y permiten diferentes niveles de protección.

Modos de protección contra una posible actualización realizada a través del micro procesador

  • Proteger la escritura en toda la memoria Flash
  • Proteger la escritura sólo en la sección del cargador de inicio (Boot Loader)
  • Proteger la escritura sólo en la sección Flash del programa
  • Permitir la actualización del software en toda la memoria Flash

Bits de bloqueo

Los bits de bloqueo o protección (Boot Lock) se pueden configurar en ambos modos de programación, tanto serie como paralelo, pero solo pueden borrarse cuando se borra toda la memoria. El bloqueo de escritura general  no controla la programación de la memoria flash mediante instrucción de auto programación (SPM). Del mismo modo, el bloqueo de lectura / escritura general no controla la lectura ni la escritura por LPM / SPM.

Si necesitas saber las posibles configuraciones de algún micro-controlador AVR, puedes consultar en esta Web: http://www.engbedded.com/fusecalc/

Desde aquí puedes realizar una configuración, calcular los valores en hexadecimal y copiar los argumentos de la cadena que le tendrías que añadir a la aplicación AVRDUDE, para programar los fusibles del micro-controlador.

SPM – Self-Programming Mode

El modo de auto programación (SPM) es una función que permite que un micro controlador programe su propia memoria flash. Usando el SPM, un micro controlador puede programarse con un nuevo código SPM. El modo de auto programación (SPM) se usa comúnmente con los códigos de cargador de arranque del micro controlador que ayudan a su programación en serie. El SPM está disponible solo para el código que se ejecuta en el Boot Loader (BLS) de la memoria flash. Con la ayuda de SPM, un código en el Boot Loader puede reescribir la memoria flash de la aplicación por completo o una parte de ella. Incluso puede reescribir su propio código en la sección BLS.

El modo de auto programación (SPM) es un factor clave del código Boot Loader, ya que su principal función es la de cargar el programa dentro de la sección destinada a la aplicación de la memoria flash. El Boot Loader puede recibir el código binario de otros chips de memoria, tarjetas SD o a través del puerto serie del micro controlador en caso de programación en serie. Es entonces con la ayuda de modo de auto programación (SPM)  que el micro controlador escribe el código binario en la sección flash de la aplicación.

Programador ISP con Arduino UNO

El IDE (Integrated Development Environment) de Arduino dispone de un código en la sección de los ejemplos: Archivo – Ejemplos – 11.ArduinoISP, que permite convertir la placa de desarrollo de Arduino en un programador ISP. Este código puede controlar el encendido de 3 diodos LED, para indicar su estado de funcionamiento durante la programación.

Esquema: Programador ISP

Funcionamiento del programador

Fluctúa la iluminación de uno de sus indicadores LED cuando el programador está disponible (LED azul), muestra otra indicación durante la  escritura (LED amarillo), y  también puede mostrar la indicación de error (LED rojo).

He añadido un cuarto LED al circuito, conectando un diodo LED en la línea SCK (LED verde). Esta señalización nos permite saber si un micro-controlador tiene cargado el Boot-Loader:

…al pulsar el botón RESET del programador, el LED verde (conectado a la línea SCK) debería parpadear durante un instante. 

Autoprogramación

La memoria del programa se actualiza  página por página (64 palabras en ATmega328P / 32 palabras ATmega8A). Antes de programar una página con los datos almacenado en el buffer de página temporal, la página debe borrarse. El buffer de página temporal se llena uno palabra a la vez usando SPM y el buffer se puede llenar antes del comando de borrado de página o entre una página borrada y una operación de escritura de página:

Alternativa 1. Llenar el buffer antes de borrar una página

  • Rellenar el buffer temporal de la página
  • Realizar un borrado de página
  • Realizar una escritura de página

Alternativa 2. Completar el buffer después de borrar la página

  • Realizar un borrado de página
  • Rellenar el buffer temporal de la página
  • Realizar una escritura de página

Analizador acústico con ARDUINO

Construcción de un analizador acústico con Arduino. La información se presenta de forma gráfica, en un display LCD de 16×2 caracteres. Como ecualizador gráfico se puede utilizar el circuito integrado MSGEQ7 o el MSGEQ5, dependiendo del número de bandas de audio que queramos mostrar. Este circuito se puede montar de forma independiente, previamente programando el ATMEGA328P con la placa de desarrollo de Arduino. Una vez programado, mediante la posición de un jumper se puede configurar para que muestre 5 o 7 bandas… montando previamente el circuito integrado ecualizador correspondiente.

Utilidad de un analizador acústico

Este analizador acústico no puede competir con un equipo profesional, pero podría ser muy útil para acondicionar la acústica de un salón de actos o sala de conciertos improvisada. Comprobando la respuesta en frecuencias y volumen de escucha en diferentes puntos, se podrían corregir los defectos reorientando los altavoces/bocinas, ecualizando la respuesta de los amplificadores, etc.   Por otra parte, como este analizador de audio es de bajo costo y no requiere de conocimientos especiales para montarlo, podría ser muy instructivo realizarlo como práctica en escuelas relacionadas con la formación en las ramas de electrónica y tecnología.

Ecualizador gráfico de 5/7 bandas

Este montaje está basado en el circuito integrado MSGEQ5 / MSEGQ7,  ecualizador gráfico de audio  de 5 y 7 bandas respectivamente.  Dentro de un pequeño encapsulado DIL de 8 pines, se encuentra todo lo necesario para obtener a su salida los valores de energía a diferentes frecuencias,  a partir de la señal de audio en su entrada (descomposición espectral).

MSGEQ5 - Analizador de 5 bandas

Como se puede ver en la imagen anterior,  el MSGEQ5  analiza los valores comprendidos entre 100 y 10.000 Hz. Este rango es más que suficiente para conocer la respuesta en frecuencias de cualquier entorno. Pero si queremos analizar con más detalle los extremos de la zona audible, graves más bajos y agudos más altos, sería mejor utilizar el MSGEQ7.

MSGEQ7 - Analizador de 7 bandas

Como se puede comprobar comparando los datos entre ambos componentes,  son compatibles tanto en conexiones como características técnicas. Lo único que cambia es la gestión de los datos,  pero el protocolo es el mismo.  Con el MSGEQ5 tendremos que tomar y asignar los valores leídos de 5 en 5, y con el  MSGEQ7 lo haremos en grupos de 7 (número de bandas). Aprovechando estas características, es muy fácil construir un circuito que permita trabajar con ambos componentes.

Analizador acústico de 5/7 bandas

 

Este montaje lo puedes hacer siguiendo el esquema anterior, o utilizando la placa de desarrollo de Arduino junto con el Shield LCD, desarrollado para Arduino UNO.

Escala gráfica

La escala de las barras gráficas que muestra el display no es logarítmica, como lo harían la mayoría de los analizadores de audio. Con el fin de obtener un efecto visual más pronunciado, la gráfica que muestra el display  traduce los valores de tensión en cada banda de forma lineal.

Escalado lineal de las medidas

Si prefieres cambiar la escala, sólo tienes que modificar los valores de la tabla (resaltadas en color  amarillo), editando el código antes de programar el microprocesador ATMEGA328P con Arduino.

Firmware

El código de programación de este analizador acústico,  se puede descargar desde el siguiente enlace: Analizador acústico

Medir la sensación térmica

Construcción de un medidor de humedad, temperatura real y la sensación térmica. Para este montaje voy a utilizar el sensor de temperatura y humedad DHT11, y como controlador utilizaré Arduino. La sensación térmica describe el grado de incomodidad que el ser humano percibe, como resultado de la combinación de la temperatura, humedad y el viento. La humedad, junto con la velocidad del aire hacen que la sensación de frío sea mayor en invierno, y la sensación de calor más intensa en verano.

Sensor DHT11

La temperatura y la sensación térmica

Es habitual que nos fijemos en la temperatura que muestra un termómetro, y rápidamente asociemos el valor que hemos leído con la sensación de frío o calor que vamos a sentir. Sin embargo, la sensación térmica varía en función de otros factores, como son la humedad relativa del aire y su velocidad.

Regulación térmica

El cuerpo humano intenta mantener su temperatura corporal a un valor constante, alrededor de los 37ºC y la piel es el principal órgano encargado de regular la temperatura:

  • Cuando aumenta la temperatura del cuerpo, se dilatan los vasos sanguíneos y aumenta el flujo de sangre por la piel, y la piel en contacto con el exterior hace de radiador y se reduce la temperatura. Si el calor es excesivo, se abren los poros y se comienza a sudar. El sudor es un método de enfriamiento muy efectivo, porque su evaporación provoca un enfriamiento mucho más rápido.

Sudor y humedad

  • Cuando el cuerpo se enfrí­a, los vasos sanguí­neos se contraen y el flujo sanguíneo se reduce. Los músculos son estimulados para generar más calor, pudiendo llegar a provocar temblores involuntarios. Así  el cuerpo puede aumentar su temperatura rápidamente en caso de necesidad.

En definitiva, la piel humana es el sensor que detecta las diferencias de temperatura entre el cuerpo y el ambiente, para reaccionar en consecuencia. Si tenemos en cuenta que la temperatura de la piel se mantiene alrededor de los 32ºC, la sensación térmica variará de forma más brusca, cuando más nos alejemos de dicho valor y dependerá de la humedad y velocidad del aire exterior.

Sensación térmica: Humedad/Temperatura

La sensación térmica describe el grado de incomodidad que el ser humano percibe, como resultado de la combinación de la temperatura, humedad  y el viento. La humedad, junto con la velocidad del aire hacen que la sensación de frío sea mayor en invierno, y la sensación de calor más intensa en verano.

Gráfica: sensación térmica

 

La humedad en verano y en invierno

  • En verano, con temperaturas altas, un exceso de humedad en el ambiente impide que el sudor se evapore de forma eficiente, provocando una sensación de calor más alta.
  • En invierno, con temperaturas bajas, un exceso de humedad en el ambiente provoca una hidratación mayor de la piel, condensando partículas de agua en la superficie como si fuera sudor, y su evaporación provoca una sensación de frío mayor que la que muestra el termómetro

Si queremos saber el grado de frío o calor, sobre todo en las regiones de climas húmedos, es mucho más útil conocer la sensación térmica que la temperatura. La humedad relativa del aire, representada con las siglas HR o la letra griega Φ (fi), es la concentración de vapor de agua en el aire.

Una vez corregido el valor de temperatura con la sensación térmica debido a la humedad, si además hay viento con una velocidad superior a 12,5 km/h, habría que aplicar al valor obtenido una nueva corrección.

Sensación térmica con viento

La corrección con el viento es mucho menor que la provocada por la humedad. Como se puede ver en la gráfica anterior,  la sensación de calor aumenta a partir de 34ºC  y también disminuye a partir de ese mismo valor.

Medir la sensación térmica

La construcción de un medidor que muestre el valor de la sensación térmica, es sencilla y de bajo costo. Con Arduino el código de programación es muy corto, y además las fórmulas de corrección ya están incluidas dentro de las librerías del sensor DHTxx. Para este montaje utilicé el sensor DHT11, pero si se requiere una mayor precisión, es mejor utilizar el DHT22. El controlador de este medidor está hecho con Arduino, y la presentación de los valores se muestra en un display LCD de 2×16 caracteres. Todo el conjunto se podría fabricar sin tener que soldar ningún componente, utilizando un Arduino UNO junto con su ‘Shield LCD‘. El sensor de temperatura/humedad se puede conectar con terminales de conexión en la tarjeta Arduino, porque el sensor DHT11 se puede comprar montado en una pequeña placa PCB, en la que lleva montada una resistencia Pull-Up y el condensador de desacoplo para la alimentación. La alimentación de todo el conjunto es de 5 VDC, por lo que se podría utilizar cualquier cargador USB que tengamos en casa.

También puedes optar por hacer un montaje independiente, sin la placa de desarrollo de Arduino.  Así  te saldrá todo más barato y su tamaño será menor:

Esquema del medidor de temperatura, humedad y sensación térmica

Firmware (v1)

El código de programación de este medidor, junto con la librería de control necesaria para el sensor DHTxx, se puede descargar desde el siguiente enlace: Temperatura y humedad

Descargar fichero .stl

Thermometer showing the thermal sensation

El medidor de temperatura y humedad lo puedes montar dentro de en una pequeña caja de plástico  (100 x 60 x 25 mm), incluyendo dentro su propia fuente conmutada de 5VDC. Los detalles de este montaje, los puedes ver en el siguiente video:

Sensación y conductividad térmica

¿Por qué tiene tan mala respuesta a la temperatura el sensor DHT11?. El problema es que el sensor de temperatura DHT11 está encerrado dentro de una jaula de plástico, por lo que su conductividad térmica entre el exterior y el sensor es mala, y esto provoca que su tiempo de respuesta sea lento. Para corregir este fallo, he montado un segundo sensor de temperatura en el termómetro. He utilizado el sensor DS18B20 con encapsulado metálico para medir la temperatura, dejando el sensor DHT11 para medir la humedad y calcular la sensación térmica.

Tiempo de respuesta de un sensor

La respuesta en el tiempo de un sensor de temperatura depende de la conductividad térmica del material utilizado entre el elemento a medir (aire, líquido) y el sensor de temperatura. Como norma general, los materiales mas conductivos eléctricamente, también lo son térmicamente.

Conductividad térmica de algunos materiales

Utilizar un sensor de temperatura con encapsulado metálico, es una buena elección cuando se necesita obtener una respuesta rápida en la medida.

Tabla: Conductividad eléctrica y térmica

Aunque esto no siempre es imprescindible y hay veces que es mejor utilizar un sensor de respuesta más lenta, con el fin de mostrar la temperatura ambiente y evitar que se muestren cambios bruscos debido a una corriente de aire frío o caliente  ocasional.

Conductividad térmica

El sensor de temperatura y humedad DHT11 es de respuesta lenta y muy válido para mostrar la temperatura en zonas abiertas, pero no es el más adecuado para medir valores en recintos pequeños (sauna, cámara frigorífica, caldera).

¿Es útil el montaje anterior?

Dependiendo del uso que le quieres dar al medidor de temperatura ambiente, tendrás que elegir el sensor de temperatura que mejor se adapte al entorno. Si quieres mostrar la temperatura en un espacio abierto, el montaje anterior te podría servir. Pero si lo quieres para hacer medidas rápidas, o para mostrar los valores dentro de en un recinto pequeño, es aconsejable añadir al esquema anterior un segundo sensor de temperatura con encapsulado metálico.

Temperatura, humedad y sensación térmica con dos sensores.

Firmware (v2)

El código de programación del medidor con doble sensor, se puede descargar desde el siguiente enlace: Temperatura y humedad (v2)