ESP32 con EleksTubeHAX

Actualización del reloj «RGB Glow Tube DIY Clock» (EleksTube IPS) con el firmware: EleksTubeHAX. Con este firmware, el reloj sincroniza automáticamente la hora a través de un servidor NTP. También consulta por Internet su localización, para ajustar de forma automática la hora local, actualizando el offset horario de invierno y verano. Además incluye el protocolo MQTT, y es posible controlar el reloj de forma remota desde un PC o dispositivo móvil con acceso a Internet. Este reloj, con el firmware original, se puede comprar en PCBWay por menos de 50€ … https://pcbway.com/s/8SNBE7

Reloj de estilo retro, con ESP32

Puntos separadores HH:MM:SS

Una de las cosas que se echa de menos en este reloj, es que no muestra los puntos separadores de las horas, minutos y segundos. Hice varias pruebas para intercalar los puntos, pero todas ellas de forma pasiva, utilizando como fuente de luz la iluminación RGB trasera de los 6 tubos.

La idea era montar algo sencillo, y que se pudiese desmontar sin tocar nada del interior.  Hice dos soportes con PLA de color negro, de la altura de los zócalos sobre los que se encajan los tubos de cristal. Los dos soportes los fijé al cristal con cinta adhesiva de doble cara, en la parte trasera de los tubos. Una pieza va pegada entre los tubos de las unidades de hora y la decena de los minutos, y la otra entre los tubos que muestran las unidades de minutos y la decena de segundos.

Luego me faltaba decidir cómo iba a hacer la pieza que mostrase los dos puntos. Empecé las pruebas con metacrilato transparente y plástico blanco, cortando con la CNC unas placas que reflejaran la luz trasera de los LED RGB, pintando los dos puntos de color negro. En ambos casos, el aspecto del reloj quedaba muy feo.

Al final utilicé PTEG de color blanco para hacer los dos puntos con la impresora 3D. Los hice alargados con forma de cono, y luego pinté con rotulador indeleble de color negro el soporte y el frente de los conos. Así la luz trasera de los tubos iluminan los laterales blancos de los conos, y visto el reloj de frente destacan mucho más los puntos negros.

EleksTube IPS con los puntos separadores

Piezas 3D

https://www.thingiverse.com/thing:6242912

Diseño 3D, con los puntos separadores para el reloj EleksTube

¿Actualizar el firmware?

En la revisión que hice del reloj con el firmware de fábrica, me di cuenta que la gestión de sus pulsadores era muy confusa, y además se le podría sacar más rendimiento al ESP32 que utiliza como procesador.

Buscando en el repositorio GitHub, encontré dos versiones de firmware muy elaboradas, que podrían ser compatibles con este reloj. Revisando el código de ambas versiones, comprobé que ha colaborado mucha gente en este desarrollo, pero la actualización final proviene del mismo autor: Aljaz Ogrin.

Cambios con respecto al firmware original

– La configuración con los pulsadores es extremadamente sencilla, porque la hora se ajusta automáticamente por Internet y los 4 pulsadores siempre realizan los cambios al presionar el botón, no al soltarlo. Es necesario pulsar y soltar por producir un cambio.

Configuración mediante los pulsadores, con el firmware: EleksTubeHAX

– El reloj sincroniza la hora a través de un servidor NTP, pudiendo conectar con cualquier router WiFi que disponga de la opción WPS. El reloj detecta respuestas del servidor NTP erróneas, y no se actualiza con una hora errónea. La versión 0.3 de firmware permite también escribir el SSID y PASSWORD de la red WiFi dentro del firmware. La versión 0.7 sólo permite la conexión WPS, pero esta opción es la más segura, porque las credenciales de la red WiFi no son visibles al leer el archivo binario (firmware). Otra ventaja de la conexión WPS, es que permite cambiar la red WiFi sin tener que modificar el firmware.

– El reloj detecta su ubicación a través de Internet, para seleccionar de forma automática su zona horaria y mostrar la hora local, corrigiendo automáticamente el Offset horario de invierno y verano.

– Las imágenes con los números de la hora son archivos BMP de 24 bit. Estos archivos se comprimen y convierten a binario desde una aplicación hecha a medida del firmware. Este formato permite  reducir el tamaño de los archivos, porque el firmware del reloj se encargará de centrar las imágenes pequeñas. Así es posible cargar y gestionar más de 3 fuentes de caracteres desde el reloj.

– El nuevo firmware hace una precarga de la siguiente imagen a mostrar en el búfer, para hacer una actualización más rápida. El tiempo del cambio de imagen se ha reducido de los 150 ms originales a aproximadamente 30 ms. Como el reloj refresca los dígitos de forma secuencial desde la unidad de segundos hasta la decena de horas, el segundo que provoca un cambio en la decena de horas presenta un efecto barrido de los números desde la derecha hacia la izquierda de (150×6) 900ms, y ahora se reduce a (30×6) 180 ms. Cuando se realiza un cambio de estilo, las imágenes guardadas en el búfer ya ni sirven y se borran. En este caso, el tiempo de carga de los 6 dígitos es el mismo que antes.

– Incorpora el modo nocturno, configurable antes de compilar el firmware, para atenuar el brillo de las pantallas y la luz de fondo de forma automática durante las horas nocturnas.

– Se incorpora la compatibilidad con MQTT (IoT): Desde un teléfono móvil se pueden cambiar las fuentes del reloj  y controlar el encendido/apagado del reloj. El protocolo MQTT es compatible con: SmartNest, SmartThings, Google Assistant, Alexa, etc… y también puede incluirse en la red de automatización del hogar.

– Los errores de conexión WiFi y MQTT se muestran con un texto de color rojo, insertado en la parte inferior de los dígitos de los segundos. Al apagar el reloj desde el pulsador se mantiene todo funcionando, sólo se apagan los displays y la iluminación RGB, manteniendo la conexión WiFi y la gestión remota a través del protocolo MQTT.

– El firmware cuenta de forma automática el número de estilos de reloj que tiene cargados, y no es necesario volver a programar el reloj cuando se actualizan las imágenes.

– La versión v0.7 puede configurarse para funcionar con  el reloj «EleksTube IPS» original y el reloj «SI HAI» (imitación china). La versión v0.3 incluye también el reloj «NovelLife SE» (otra imitación). El cambio que existe entre los diferentes fabricantes de este reloj, es la asignación de los pines de ESP32.


Esto es lo que se pierde con respecto a la versión del firmware original:

  • No permite mostrar el mes y día, siempre se muestra la hora.
  • No se puede elegir un color diferente para cada LED RGB y tampoco modificar la velocidad de cambio de sus efectos.
  • El efecto ‘Chasing’ de los LED RGB no existe, pero a cambio se  incluyen 2 efectos nuevos y un modo Test.
  • No dispone de la opción de mostrar 6 imágenes fijas.

Programar con el IDE Arduino

Antes de modificar el firmware del reloj, es muy importante disponer de  un archivo de respaldo por si algo falla. En el artículo y video anterior mostraba los detalles de todo el proceso, lo único que tendría que añadir, es que lugar de hacerlo a 115200 bps lo hagáis a 921.600 bps. El ESP32 funciona perfectamente a esa velocidad, y así el tiempo que tardará será inferior a 1 minuto.

He hecho un resumen para simplificar todo el proceso de configuración que hay que hacer en el IDE de Arduino, para que funcione con el ESP32 y sea compatible con el firmware: EleksTubeHAX.

Lo he probado con las versiones de Arduino (v1.8.12) y (v1.8.13)… es posible que con otras versiones se produzcan errores al compilar el programa 

1 –  El primer paso sería cargar las librerías del ESP32 en el IDE de Arduino. En la pestaña: Archivo/Preferencias, habría que desplegar el Gestor de URLs para comprobar si ya tenemos o no el link que apunta a las librerías de espressif:

https://dl.espressif.com/dl/package_esp32_index.json

Si no estaba en la lista, habría que añadir la URL y guardar los cambios

2 – Acceder al Gestor de tarjetas desde el menú: Herramientas/Placa/. Cuando finalice la carga de datos, escribir en la línea superior ‘esp32’. Buscar: esp32 by Espressif Systems. Aunque ya tengáis esta librería instalada, es importante actualizar a la versión 1.0.6. Yo tenía instalada la última versión, la 2.0.11,  y me costó mucho tiempo encontrar el problema. Al compilar aparecían errores en algunas instrucciones del WiFi y también en la librería TFT_eSPI.

3 – Para que sea posible cargar las imágenes en el reloj desde el IDE de Arduino, es necesario incluir el archivo: esp32fs.jar dentro de la carpeta ‘tool’ de la instalación. A continuación os pongo el link de descarga de la versión 1.1, porque la versión 1.0 no funciona.

Link de descarga de la versión 1.1

Detalles del lugar donde hay que copiar el archivo

Después de copiar el archivo y reiniciar el IDE de Arduino, tendría que aparecer la opción: ESP32 Sketch Data Upload. Si la versión del archivo es la correcta, al hacer click aparecerá otra ventana con un desplegable que muestra 4 opciones.

Las imágenes del reloj son los  archivos binarios que se encuentran en la carpeta ‘data’ del programa EleksTubeHEX. Para cargar estos archivos en el reloj, habría que seleccionar la opción: SPIFFS.

Las imágenes del reloj contienen los diferentes estilos de  las fuentes numéricas que se utilizan para mostrar la hora. Estas imágenes se pueden actualizar cuando se quiera, y no es necesario volver a cargar el firmware.

4 – Lo siguiente sería instalar las 7 librerías que se muestran en la gráfica enmarcados en rojo, seleccionando el nombre y comprobando que sea el mismo autor. Las versiones que se utilizaron en el desarrollo son las que están entre paréntesis, pero yo he actualizado todas a la versión más alta y no he tenido problemas.

5-  Ya por último, tendríamos que seleccionar la placa: ESP32 Dev Module y configurar todos los parámetros que se muestran en la gráfica enmarcados en rojo. El puerto ‘Com’ habría que seleccionar al que estuviera conectado vuestro reloj. Se puede comprobar si el reloj responde,  al hacer click en la opción: Obtén información de la placa

Librería: TFT_eSPI

Después de instalar todas las librerías, habría que modificar dos archivos que se encuentran dentro de la carpeta TFT_eSPI, y siempre que se actualice la librería TFT_eSPI habría que hacer lo mismo.

Son los archivos:  User_Setup_Select.h y User_Setup.h, y se pueden editar  con cualquier editor de texto que no introduzca formatos, por ejemplo con el Notepad de Windows.

En ambos archivos, User_Setup_Select.h y User_Setup.h,  hay que añadir la misma línea. Para que se incluya la librería GLOBAL_DEFINES.h que se encuentra dentro de la misma carpeta del programa EleksTubeHAX.

Además de esto, en el archivo User_Setup_Select.h se deja todo como está, pero al final del archivo hay que comentar la definición de todos los pines.

En el archivo User_Setup.h, hay que añadir la misma línea que en el otro archivo y mantener #define USER_SETUP_INFO «User_Setup». El resto del archivo hasta el final, tiene que estar todo comentado.

… ver más detalles en el video del final

SPIFFS (Serial Peripheral Interface Flash Fail System)

SPIFFS es un sistema de archivos muy simple, creado para microcontroladores con memoria flash.  Se accede mediante el bus SPI y los datos se guardan directamente en la estructura de la memoria. SPIFFS permite acceder a la memoria flash del ESP32, pudiendo leer, escribir y eliminar datos.

MQTT

MQTT (Message Queing Telemetry Transport) es un protocolo de mensajería simple, diseñado para dispositivos con poca memoria y con bajo ancho de banda. Permite enviar comandos para controlar salidas digitales, o leer y escribir datos en dispositivos electrónicos con tecnología IoT (Internet de las cosas).

MQTT fue creado por el Dr. Andy Stanford-Clark de IBM y Arlen Nipper de Arcom (ahora Eurotech) en 1999 como un mecanismo para conectar dispositivos empleados en la industria petrolera.

Gestión de los mensajes MQTT

En los mensajes MQTT hay 3 apartados separados por una barra, como si se tratara del Path de acceso a cualquier archivo del PC. A este conjunto Path, en MQTT se denomina Topic, o Tema en español. A continuación del Topic se enviaría la orden a ejecutar, denominado Mensaje en MQTT. Por ejemplo, un mensaje MQTT podría ser:

MiCasa/Cocina/Lavadora/Encender

Para que funcione el sistema MQTT es necesario un gestor que reciba y distribuya los mensajes, en MQTT sería el Broker.

Broker es el dispositivo central que permite y restringe las conexiones; y también recibe, filtra, redirige y publica mensajes a todos los dispositivos conectados. Los clientes inician una conexión TCP/IP con el Broker, el cual mantiene un registro de los clientes conectados. Esta conexión se mantiene abierta hasta que el cliente la finaliza. Por defecto, MQTT emplea el puerto 1883 y el 8883 cuando funciona sobre TLS.

Si se está enviando un mensaje a un Broker de Internet, la primera parte del tema/topic debe ser el ID del dispositivo que está enviando el mensaje, y el usuario puede personalizar las siguientes partes del tema. Cuando se da de alta algún dispositivo IoT en Smartnest, se le asigna un ID único para evitar conflictos entre dispositivos que pudieran tener el mismo Topic. En este nuevo firmware del reloj, el Broker es un servidor alojado en la Web de Smartnest.

El Broker de Smartnest define los Topic y Mensajes en lugar del usuario, con el fin de generar un interface gráfico común para todos los clientes, y dar acceso a través de Internet. Por ese motivo es necesario elegir el Tema que mejor se adapte a las necesidades de cada dispositivo. Por ejemplo, este reloj utiliza el Topic de un termostato.

Conversión de los grados recibidos por MQTT, al estilo de gráficos a mostrar

La temperatura de ajuste del termostato se puede modificar entre 10 y 40 grados, con saltos de 0,5º. Estos valores son interpretados por el reloj para seleccionar el estilo del gráfico a mostrar. Para hacer esto el firmware aplica internamente una fórmula al mensaje MQTT, dividiendo el valor recibido entre 5, sin decimales y restando 1. Si recibe un valor entre 10 y 14,5 grados, selecciona el estilo 1 (los saltos son de 5 en 5 grados). Si se fija la temperatura del termostato al máximo, 40 grados, el reloj mostraría el estilo 7. El reloj permite almacenar un máximo de 16 estilos. En caso de recibir un número mayor al número de estilos que tiene en memoria, seleccionaría el último. En caso de recibir un valor de temperatura igual o mayor de 90º, elegiría de forma aleatoria uno de los estilos de su memoria.

Para utilizar el Broker de Smartnest es necesario registrarse en www.smartnest.cz, pero es gratis para los primeros 5 dispositivos.

Cofiguración con el Broker Smartnest

Para habilitar la conexión MQTT en el reloj, es necesario personalizar los datos del archivo de configuración del reloj. En la versión v0.3 es el archivo USER_DEFINES.h  y en la versión v0.7 es el archivo GLOBAL_DEFINES.h.

Yo he cargado la última versión (v0.7), porque se han corregido algunos errores y además se incluye la gestión del sensor de temperatura DS18B20, aunque yo no lo voy a usar. Para que el reloj envíe la temperatura real por MQTT, habría que conectar el sensor a un pin del ESP32, y luego habilitarlo en el archivo de configuración.

Estos son los datos MQTT que hay modificar en el archivo de configuración:

  • Descomentar la línea: #define MQTT_ENABLED
  • Luego copiaremos ID del dispositivo que hemos dado de alta en Smartnest, el termostato, y lo pegaremos entre comillas a continuación de: #define MQTT_CLIENT
  • El nombre de usuario con el que nos hemos dado de alta, lo escribiremos entre comillas al final de:  #define MQTT_USERNAME
  • La contraseña con el que nos hemos dado de alta en Smartnest, la escribiremos entre comillas a continuación de: #define MQTT_PASSWORD. En lugar de escribir la contraseña en el firmware, es mejor poner el API-Key que asigna Smartnest a cada usuario.

COntrol remoto desde Smartnest

Con estos datos ya se recibiría la información que envía el reloj en la Web de Smartnest. Pero si queremos también enviar órdenes al reloj, tendremos que configurar el router WiFi  al que se conecta el reloj.

  • Lo primero es asociar la MAC del reloj con una IP fija, para que el router le asigne siempre la misma.
  • Luego habría que abrir el puerto TCP 1883, y asociarlo con la dirección IP que le hayamos asignado al reloj.

Configuración final

Para terminar de configurar el reloj, abrimos el archivo de configuración: GLOBAL_DEFINES.h para la versión 0.7.

  • Dejamos comentado el modelo de reloj HAI_CLOCK, para compilar con los datos de EleksTube.
  • Las horas de inicio y fin en la que el reloj cambiará a modo nocturno, se pueden modificar a nuestro gusto. También los segundos para detectar la pérdida de conexión con Internet y su reconexión.
  • No hace falta registrarse para disponer de un acceso a la geolocalización, accedemos a este link:

https://app.abstractapi.com/api/ip-geolocation/tester

Allí vemos nuestro código de consulta, y debajo una  URL para comprobar la información que devuelve. Podemos hacer hasta 5000 peticiones al mes con el mismo código si pagar.  Copiamos nuestro código de acceso, y lo pegamos entre las comillas a continuación de: #define GEOLOCATION_API_KEY

Ahora solo queda guardar los cambios del archivo: GLOBAL_DEFINES.h, y ya podemos compilar el programa en el IDE de Arduino y actualizar su firmware… pero recuerda que también hay que cargar las imágenes, para que el reloj pueda mostrar la hora.

Cargar las imágenes al reloj

Además de actualizar el firmware, es necesario cargar las 10 imágenes de cada estilo. El nuevo firmware necesita un archivo binario (.clk) por cada imagen.

Todos los archivos tienen que estar en la carpeta ‘data’ de ‘EleksTubeHAX’ …\Arduino\EleksTubeHAX\data

  • Los archivos se identifican con 2 dígitos y su extenxión .clk
  • La unidad del número del archivo se corresponde con la imágen que contiene, y la decena es el número de estilo. Los estilos del reloj van en orden ascendente, empezando por el estilo 1 (10.clk , 11.clk, 12.clk, etc.). No se puede crear el estilo 3 y enviar, si la carpeta ‘data’ no contiene también los estilos 1 y 2.
  • El número de estilos máximos a cargar depende del tamaño de los archivos. La capacidad máxima disponible para almacenar las imágenes en el reloj es 2,2MB aproximadamente.
  • Los archivos binarios se generan con un software hecho a medida para este firmware, y ya no se puede utilizar el software: EleksTube IPS.exe para actualizar las imágenes. En la descarga de archivos del repositorio GitHub, se incluye el software conversor de imágenes BMP a CLK:

…\Prepare_images\Convert_BMP_to_CLK.exe

Convert_BMP_to_CLK.exe

La cabecera de los archivos binarios que genera este conversor de imágenes, es de 6 Bytes: Las letras ASCII ‘CK ‘ los pixeles de ancho de la imagen, su origen X, los pixeles de alto y su posición Y.

Antes de colocar cada imagen en su display, el firmware lee sus cabeceras, y aplicando las fórmulas que se muestran en la imagen siguiente, desplaza el inicio donde tiene que empezar a cargar los datos del archivo, para centrar la imagen en el display.

Paso 1, para el centrado de imágenes del reloj EleksTube

De esta forma todos los bordes de la imagen que sean de color negro, se pueden recortar del archivo BMP,  antes de cargarlos en el software para convertirlos a código binario.

Paso 2, para el centrado de imágenes del reloj EleksTube

Al reducir el tamaño de las imágenes, es posible almacenar fuentes más pequeñas en la memoria del ESP32, y ampliar el número de estilos a elegir.

Conversor de imágenes BMP a CLK

Con el firmware de fábrica, el archivo binario que se carga en el reloj contiene las 30 imágenes de los 3 estilos, y tiene un tamaño de 1.507.328 Bytes. Si hacemos las cuentas, el mapa de color de las imágenes que se muestran en el reloj, es de 12 bits.

Ahora las imágenes BMP de 24 bit se comprimen a 16 bits. Por lo tanto, con la actualización del firmware también se mejora en la calidad de las imágenes.

En la siguiente imagen, he simulando el degradado de tonos azules que podríamos ver en el cielo al atardecer.

Comparativa del color RGB

De izquierda a derecha, se puede comparar la calidad con la que se mostraría en los displays del reloj.

  • La imagen original BMP de 24 bits, sin comprimir
  • Comprimida a 16 bits, como se mostraría con esta actualización
  • Comprimida a 12 bits, como se mostraría con el software de fábrica

Convertir imágenes BMP a CLK

En la siguiente imagen se muestra la carpeta de trabajo, para convertir las imágenes BMP en archivos CLK.

Archivos BMP y convertidos a binario, del estilo 3 del reloj

  • Crea una carpeta de trabajo, para utilizarla con el software: Convert_BMP_to_CLK.exe
  • Copia en la carpeta de trabajo las 10 imágenes BMP de 135×240 pixel y 24 bits, del estilo que quieras convertir a binario. Renombra los archivos poniendo como nombre el número de estilo (decena), y el valor numérico que contiene la imagen (unidad). En el ejemplo serían los 10 números del estilo 3.
  • Si los bordes de las imágenes no son negros, como es el caso del ejemplo, las imágenes no se pueden recortar. En el caso contrario puedes recortar los bordes negros, teniendo en cuenta que el contenido de la imagen resultante se centrará sobre la pantalla negra del reloj.
  • Abre los 10 archivos BMP de uno en uno con el software conversor, y conviértelos a binario.
  • Copia o mueve los 10 archivos .clk a la carpeta ‘data’ del firmware: EleksTubeHAX.

…\Arduino\EleksTubeHAX\data

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, 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

Concurso de creadores 2023

El plazo para presentar los proyectos finaliza el 15 de Enero de 2024

PCBWay abre de nuevo la participación al concurso de creadores. Por el simple hecho de participar, se asignarán 500 beans (créditos) en tu cuenta de PCBWay, los cuales podrás canjear en la tienda por un Raspberry Pi Pico.

Además del premio por la participación, PCBWay repartirá un total de 16 premios: 1 primer premio al mejor proyecto, 2 segundos premios, 3 premios para los clasificados como terceros y 10 premios más para los proyectos más populares.

Consulta todos los detalles y las bases del concurso, pulsando el siguiente link:

Acceso al concurso de creadores PCBWay 

 

Reloj de estilo retro, con ESP32

RGB Glow Tube DIY Clock es un reloj de estilo retro, porque simula los números en 6 displays LCD-IPS cerrados en tubos de cristal, para darles el aspecto de tubos de vacío NIXIE o NUMITRON. Este reloj se compra en kit, pero viene prácticamente montado. Sólo es necesario insertar los 6 displays LCD-IPS en sus zócalos y colocar los tubos de cristal. Este reloj funciona con el microcontrolador ESP32, y permite cambiar su aspecto desde el propio reloj, eligiendo una de las 3 fuentes de caracteres que tiene en memoria. Las fuentes de caracteres se pueden personalizar, utilizando el software ElecksTube IPS.exe.

Link de acceso para la compra y descarga del software

Display’s numéricos de vacío

Los primeros display’s numéricos que se fabricaron estaban construidos con tubos de vacío. Se conocían como  Tubos Nixie, y se utilizaron en equipos electrónicos a partir del año 1955.

Tubo NIXIE

El tubo Nixie está formado por un ánodo, construido con una rejilla montada delante de una serie de cátodos. Los cátodos tienen la forma del símbolo que se quiere representar, y se sitúan apilados tras el ánodo, pero sin contacto galvánico entre ellos. Todo el conjunto va encerrado en una ampolla de vidrio llena de gas a baja presión, normalmente neón. Cuando se aplica una tensión entre uno de los cátodos y el ánodo, alrededor de 170V, el cátodo se ilumina en sus proximidades al ionizarse el gas, haciendo visible así su número.

El esquema superior está simplificado. Habría que añadir una resistencia en serie con la alimentación, para limitar la corriente de trabajo del tubo NIXIE, como si se tratara de un diodo zener.

Los tubos Nixie son muy sencillos de utilizar y no necesitan caldeo, pero tienen algunos inconvenientes:

  • Su peso y volumen.
  • Necesita una tensión alta.
  • Los símbolos no están todos en el mismo plano, lo que reduce su ángulo de visibilidad.
  • Son frágiles.

Con el fin de solucionar algunos de estos problemas, aparecieron los tubos de vacío Numitrón. Estos tubos son los antecesores a los displays LED de 7 segmentos que ahora conocemos. La diferencia es que sus segmentos no eran LED, sino filamentos. Los Numitrón se podían fabricar en tamaños más reducidos que los tubos Nixie, y podían funcionar con tensiones más bajas, alrededor de 5 voltios. Otra ventaja es que todos los símbolos se forman con los 7 segmentos, y al estar en el mismo plano su ángulo de visión es mejor que en los tubos Nixie. A cambio, los tubos Numitrón consumen más que los tubos Nixie, su tiempo de vida es menor y el trazado de los símbolos no es continuo ni tan perfecto, comparado con los NIXIE

Tanto los tubos Nixie como los Numitrón hace años que dejaron de utilizarse, pero por nostalgia muchos aficionados a la electrónica actualmente los siguen utilizando en sus proyectos, normalmente para fabricar relojes con aspecto retro. Debido a esta tendencia, ahora se pueden comprar algunos kit de reloj con el mismo aspecto de los tubos Nixie.

Aternativa a los tubos de vacío

El problema principal de los tubos Nixie/Numitrón es que no son baratos, pero existe una alternativa: sustituyendo cada tubo de vacío por un display LCD-IPS y colocando encima una ampolla de cristal. Así se puede fabricar un reloj con el mismo aspecto retro, reduciendo notablemente su consumo y mejorando sus prestaciones. Con un display LCD-IPS se puede simular un tubo Nixie o Numitrón, y modificar su aspecto y color de forma rápida sencilla. Ahora se puede conseguir por menos de 50€ un reloj con diseño retro, por ejemplo el kit: RGB Glow Tube.

Contenido del Kit

RGB Glow Tube DIY Clock

Este reloj se compra en kit, pero viene prácticamente montado. Sólo es necesario insertar los 6 displays LCD-IPS en sus zócalos y colocar los tubos de cristal.

Es aconsejable añadir un trozo de cinta adhesiva de doble cara en la base de los tubos de cristal,  para fijarlos con el metacrilato transparente superior. Con esto se evita que los tubos se suelten y rompan cuando se manipula el reloj

El PCB está sujeto a una base plástica con 5 separadores y tornillos M3. La caja se monta atornillando sus dos laterales de plástico con dos perfiles de aluminio ranurado. Utiliza 4 tornillos ALLEN M3 para fijar las tapas laterales con los dos perfiles de aluminio, colocando previamente el plexiglás transparente superior. En la parte superior, el PCB lleva 5 separadores M3, que sirven como apoyo del plexiglás transparente superior, no necesita los tornillos.

Muestra de 3 fuentes en el display OLED

Para simular los tubos Nixie/Numitrón, se utilizan 6 displays LCD-IPS de 210×82 mm. Las imágenes se pueden crear en un PC con cualquier programa de diseño gráfico, en formato JPG, con una resolución de 135 pixel de ancho por 240 pixel de alto y color de 24 bits. El software EleksTube IPS.exe se encarga de convertir todas las imágenes JPG en un solo archivo binario, para luego enviarlas a la memoria del reloj (ESP32).

Glow Tube Clock funciona con un microcontrolador ESP32. Lleva un 74HC595, que es un registro de desplazamiento de 8 bits, con 8 salidas en paralelo de tres estados. El interface de USB a UART es un CH340, necesario para conectar el reloj con un PC y actualizar el firmware, o personalizar sus fuentes de caracteres. El reloj lleva un conector USB-C en el lateral, utilizado para conectar el PC y también para su alimentación de 5VDC. El kit incluye un alimentador de tensión 110-240 VAC a 5 VDC/1A (estándar USA, no EU), con conector USB-A hembra. También se incluye el cable USB macho-macho de conexión con el PC y alimentador, con protección de tela y conectores USB-A / USB-C acodado.

El patrón de la hora (RTC) es el chip DS3231,  que está controlado por I2C y es muy preciso. Este chip RTC incluye en su interior un oscilador a cristal con compensación de temperatura (TCXO). Para mantener la hora del chip RTC cuando se interrumpe la alimentación, utiliza una pila de litio exterior tipo CR1220.

Configuración del Reloj

El kit del reloj incluye una cartulina en color, con las instrucciones en inglés por una cara y en chino por la otra. Cuando empecé a configurar el reloj, me costó bastante tiempo interpretar el manual y configurar el reloj. Provocado principalmente por los cambios de comportamiento que tienen los pulsadores en cada menú. La gestión de los pulsadores que hace el firmware de este reloj es muy confusa.

Configuración: RGB Glow Tube Clock

Gestión de los pulsadores

En cualquier dispositivo electrónico que tenga pulsadores, el fabricante decide la funcionalidad y comportamiento de cada pulsador, y lo programa en su firmware.

Gestión de los pulsadores

El comportamiento de un pulsador se puede hacer de dos formas:

  1. Detectando el flanco de subida o bajada, de la tensión que recibe un pin del microcontrolador. Así los cambios son lentos, porque es necesario pulsar y soltar el pulsador para provocar un cambio.
  2. Comprobando el cambio 1-0 en un pin del microcontrolador, para arrancar un reloj de muestreo y encadenar cambios sucesivos, mientras el pulsador permanezca cerrado. Así los cambios pueden ser más rápidos que en el caso anterior, pero también más imprecisos. Es importante ajustar el tiempo de muestreo, en función del número máximo de cambios que se tengan que realizar en cada menú. Con esta gestión temporizada, la precisión del ajuste dependerá de la destreza que tenga el usuario para ajustar el tiempo de sus pulsaciones con los del muestreo.

Comportamiento de los pulsadores

Con el fin de minimizar los costes de producción de los equipos electrónicos, los pulsadores suelen tener asociadas diferentes funciones en cada menú. Lo que no suele ser habitual y sucede en este reloj, es que también cambia el comportamiento de un mismo pulsador, en función del menú en el que esté funcionando.

El comportamiento que tienen los pulsadores en este reloj,  se identifica en las gráficas con el color que he añadido en cada pulsador y menú.

  • ROJO: Se realizan los cambios al soltar el pulsador.
  • VERDE: Realiza cambios sucesivos al pulsar, al ritmo de la frecuencia de muestreo.

Observar que a excepción del pulsador [POWER], los demás  pueden tener un comportamiento diferente, en función del menú en el que estén funcionando.

Tengo que aclarar que esto sucede con la versión del  firmware que tiene el reloj que he probado, y esto podría cambiar con otras versiones

La memoria del reloj puede almacenar y gestionar 3 fuentes de caracteres diferentes, con 10 gráficos cada una. Al inicio, los gráficos de las 3 fuentes contienen los 10 números del sistema decimal, ordenados desde el cero hasta el nueve. De esta forma es posible cambiar el aspecto del reloj en cualquier momento, eligiendo una de las 3 fuentes de caracteres.

El firmware de este reloj asocia un nombre a cada una las fuentes que tiene en su memoria: RETRO, PUNK, DIY. Estos nombres no se puede cambiar, pero sí su contenido. Conectado el USB-C del reloj con un PC y abriendo el software del fabricante EleksTube IPS.exe, es posible modificar el contenido de las 3 fuentes del reloj.

Fuentes gráficas de fábrica

Las dos primeras fuentes de caracteres, RETRO y PUNK,  deberían contener siempre los 10 dígitos del sistema decimal, porque siempre están asociadas con la presentación de la fecha y hora. La última fuente de caracteres es la fuente del usuario (DIY), y podría asociarse al reloj, o utilizarse para almacenar y mostrar un gráfico diferente en los 6 tubos, en lugar de la hora… menú INICIO pulsador [>>>]

Fuentes gráficas modificadas

Menús de configuración: Inicio

Menú INICIO

Al alimentar el reloj, los 4 pulsadores realizan su función al soltar el pulsador.

  • POWER: Enciende y apaga el reloj.
  • Izquierda: Muestra la hora o la fecha.
  • Derecha: Muestra la hora o los 6 primeros gráficos almacenados en la fuente de caracteres asociada al usuario (DIY). La imagen fija podría mostrar los números entre el 0 y el 5, o 6 gráficos de 135 píxeles de ancho por 240 de alto cada uno.
  • MODE: Da acceso al  menú principal de configuración.

Menú principal

Menú Principal

En el menú principal, los 4 pulsadores realizan su función al soltar el pulsador.

  • POWER: Salir del menú sin realizar cambios.
  • Izquierda/Derecha: Para desplazar el cursor y elegir alguna de las 6 opciones de este menú.
  • MODE: Ejecuta  opción que apunta el cursor.

En la gráfica, hay 3 opciones enmarcadas en rojo y las otras 3 con un número inferior (1,2 y 3):

MARCO: Los 3 menús enmarcados en rojo son de 2 estados (binarios), y cada vez que se pulsa el botón [MODE] cambian sus valores:

  • SET: Selecciona el formato de presentación de la hora, en 12 o 24 horas.
  • RGB: Habilita o deshabilita el LED RGB de iluminación de los 6 tubos
  • LIGHT: Limita el brillo máximo de los LED RGB en los 6 tubos.

NÚMERO: El número indica el submenú al que se accede.

Submenú 1: SET TIME

Menú: SET TIME

Este submenú es para configurar la fecha y hora. Los 3 botones de la izquierda realizan los cambios muy rápidos. Hay que realizar pulsaciones muy cortas, para conseguir que los saltos sean de uno en uno.

  • POWER: Vuelve al inicio para mostrar la hora, sin realizar cambios.
  • Izquierda: Reduce rápidamente el valor del número apuntado, mientras se mantenga el pulsador cerrado.
  • Derecha: Incrementa rápidamente el valor del número apuntado, mientras se mantenga el pulsador cerrado.
  • MODE: Guarda el valor de forma provisional, y desplaza el cursor a la derecha. En caso de haber guardado algún valor erróneo, como no se puede volver atrás, es mejor salir del menú pulsando el botón [POWER] y volver a empezar Si el cursor estaba apuntando los segundos, al pulsar [MODE] se guardan en el chip RTC todos los valores de fecha y hora que muestran los tubos, y se vuelve al inicio mostrando la hora.

Submenú 2: SET STYLE

El submenú STYLE permite seleccionar el aspecto de los dígitos. En este submenú, los 4 pulsadores realizan su función al soltar el pulsador.

  • POWER: Vuelve al inicio para mostrar la hora, sin realizar cambios.
  • Izquierda/Derecha: Desplaza el cursor para apuntar a alguno de los 3 estilos.
  • MODE: Selecciona el estilo apuntado, y vuelve al inicio mostrando la hora. Si la fuente de caracteres del usuario (DIY) no contiene los 10 números del sistema decimal, no se debería asociar con el reloj.

Submenú 3: SET RGB

Menú SET RGB

El submenú SET RGB permite configurar el comportamiento de los LED RGB que iluminan los 6 tubos. En este submenú, los 4 pulsadores realizan su función al soltar el pulsador.

  • POWER: Vuelve al menú principal sin realizar cambios.
  • Izquierda/Derecha: Mueve el cursor para apuntar a alguna de las 6 opciones de este menú.
  • MODE: Acceso a la opción que apunta el cursor.

En la gráfica hay 4 opciones enmarcadas en rojo y las otras 2 con un número inferior (4 y 5):

MARCO: Los 4 menús enmarcados en rojo, cambian su valor cada vez que se pulsa y suelta el botón [MODE].

  • RainBow: Utiliza el mismo color en los 6 tubos, y modifica gradualmente su color.
  • Chasing: Distribuye los colores entre los 6 tubos, y al cambiar su color de forma gradual (igual que lo hace RainBow) se produce un efecto de rotación.
  • Breath: Mantiene el color seleccionado de cada tubo, y modifica gradualmente la luminosidad de los 6 tubos a la vez.
  • SPEED: Define la velocidad de cambio de los 3 efectos anteriores.

NÚMERO: Con los submenús 4 y 5 se define el color del LED RGB de los tubos. En ambos submenús, los pulsadores tienen un comportamiento diferente.

Tabla numérica de color

Los colores de los LED RGB están asociados a una tabla de 8 bit. Los valores de la tabla numérica comprendidos entre el 0 y el 200 se asocian con los colores del espectro visible. El valor 0 se asocia con el color rojo y el 200 con el color magenta. A partir del número 200 y hasta el 255, el color va cambiando desde el magenta hacia el rojo (valor 0).

Submenú 4: All Same MODE

En este submenú sólo funcionan 2 pulsadores, porque no se necesitan los cursores. El valor numérico asociado al color, cambia en los 6 tubos a la vez.

  • MODE: Incrementa rápidamente el valor numérico (color) en los 6 tubos,  mientras se mantenga el pulsador cerrado.
  • POWER: Al pulsar y soltar, se guarda el color que muestran los 6 tubos, y vuelve al menú SET RGB.

Submenú 5: Single MODE

Desde este submenú se puede configurar un color diferente en cada tubo.

  • Izquierda: Reduce rápidamente el valor del número apuntado (color), mientras se mantenga el pulsador cerrado.
  • Derecha: Incrementa rápidamente el valor del número apuntado (color), mientras se mantenga el pulsador cerrado.
  • MODE: Guarda el color para el tubo seleccionado y apunta al siguiente, mientras se mantenga el pulsador cerrado.
  • POWER: Al pulsar y soltar, se guarda el color que muestra cada uno de los 6 tubos, y vuelve al menú SET RGB.

Archivo de respaldo (Backup)

Antes de modificar algún dato del firmware original del ESP32, es conveniente hacer una copia de seguridad. Si por cualquier circunstancia fallara algo durante la actualización y el reloj dejara de funcionar, tendríamos un archivo con el  firmware original y podríamos recuperarlo.

Para crear un archivo de respaldo de este reloj, se puede utilizar ‘esptool.exe’ que se incluye dentro del paquete : EleksTube IPS.V1.1 (9).zip

esptool.exe se ejecuta abriendo una ventana de comandos en Windows,  modo administrador. La ventana de comandos tiene que apuntar a la carpeta donde se encuentre el programa  ejecutable ‘esptool.exe’

Comandos a ejecutar desde CMD

 # Copia de seguridad del firmware del ESP32:

esptool --baud 115200 --port COM6 read_flash 0x0 0x400000 EleksTube_fw-backup-4M.bin

La cadena contiene el nombre del ejecutable, la velocidad, el puerto COM (en mi caso es el 6), el comando de lectura, las direcciones primera y última que tiene que leer del ESP32, y a continuación el nombre del archivo que tiene que crear con su extensión. Yo he puesto al principio el nombre del programa y al final el tamaño del archivo que tiene que crear y la extensión… pero se puede poner cualquier nombre.

Si alguna vez necesitaras restaurar el reloj con el firmware de fábrica, tendrías que ejecutar este comando:

# Restaurar el firmware del esp32:

esptool --baud 115200 --port COM6 write_flash 0x0 EleksTube_fw-backup-4M.bin

La cadena contiene el nombre del ejecutable, la velocidad, el puerto COM, el comando de escritura, la dirección de inicio de la memoria y el nombre del archivo.

La dirección del final de la memoria del ESP32, no es necesario indicarla en la cadena, porque el software acabará cuando envé el último Byte del archivo de respaldo.

IMPORTANTE:

Para evitar errores cuando se trabaja con la ventana de comandos de Windows,  es importante que los nombres de las carpetas no contengan espacios ni caracteres UNICODE mayores a un Byte, por ejemplo caracteres chinos.

Software: EleksTube IPS.exe

Este software contiene un total de 23 fuentes de caracteres para elegir. En el software, cada fuente se muestra en una sola imagen con los 10 dígitos pegados. Cada imagen (fuente) es de 1350×240 pixel,  por lo que cabe suponer que al seleccionar una de ellas el software la trocea en 10 imágenes diferentes y las guarda en la carpeta .\EleksTube\esptool\data

Software: EleksTube IPS

Al principio suponía que al abrir el software se cargaban las 23 fuentes desde la carpeta EleckIPS_PIC_Picture, pero no es así. Aunque se modifique algo o se borre  esta carpeta, el software carga las mismas 23 fuentes al arrancar.

 .\EleksTube\esptool\bin

Esta carpeta contiene el último archivo que ha compilado el software Elekstube IPS.exe. El archivo binario contiene los 30 gráficos de 135x240 pixel, de las 3 fuentes de caracteres que puede manejar el reloj. Este archivo binaro, es lo único que se envía al reloj para actualizar las 3 fuentes de caracteres.

Contenido de la carpeta BIN

.\EleksTube\esptool\data

En esta carpeta se encuentran las 30 imágenes con formato JPG, que compilará el software para generar el archivo binario. Los nombres de los archivos JPG no se pueden cambiar, pero sí podemos modificar el contenido de todos los archivos, siempre que se respete su nombre, formato y resolución. Las imágenes que comienzan por RETRO y PUNK se tendrían que modificar 'a mano' antes de compilar el archivo, porque desde el software sólo se pueden cambiar las imágenes del usuario DIY; son las diez que tienen como nombre un número solo.
.\EleksTube\img

En esta carpeta se encuentran las 10 imágenes (Custom image) de la fuente  DIY del reloj. Cuando se abre el software Elekstube IPS.exe y no se selecciona alguna de las fuentes del menú inferior, las dos ventanas superiores muestran el mensaje: 'Custom image' y al pulsar el botón [Compile Custom Picture]: 

1 - El software copia las 10 imágenes de la carpeta .\EleksTube\img y las pega o reescribe por las que haya en la carpeta .\EleksTube\esptool\data

2 - Compila las 3 fuentes de la carpeta .\EleksTube\esptool\data generando un nuevo archivo binario, y lo sustituye por el que había en la carpeta .\EleksTube\esptool\bin

Imágenes personalizadas con ‘EleksTube IPS.exe’

Vista gráfica en los 6 tubos

Como el software ‘EleksTube IPS.exe’ no permite cargar imágenes nuevas y tampoco modificar las que tiene en su lista, la única forma de cargar imágenes nuevas al reloj utilizando este software sería siguiendo estos pasos:

  1. Con el software cerrado, borramos las 10 imágenes del usuario de la carpeta .EleksTube\esptool\data (este paso se puede omitir, no es imprescindible).
  2. Abrimos la carpeta .EleksTube\img y sustituimos las imágenes que contiene por las nuevas que hemos creado, pero respetando el formato y nombre de las que tenía. Se puede cambiar una sola imagen o las 10, teniendo en cuenta que el reloj mostrará de izquierda a derecha las 6 primeras (0..5).
  3. Abrimos el software, y sin seleccionar una fuente nueva del menú inferior, pulsamos el botón [Compile Custom Picture]. Así el programa copiará las imágenes de la carpeta .EleksTube\img en la carpeta .EleksTube\esptool\data,  y creará un nuevo  archivo binario con las 3 fuentes. Para hacer esta operación no es necesario que esté conectado el reloj con el PC,
  4.  Conectar el reloj al PC, seleccionar el puerto COM al que está conectado, y pulsar el botón: [Upload Image] para enviar el nuevo archivo binario al reloj y actualizar sus 3 fuentes de caracteres.

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, 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

Concurso de creadores 2023

El plazo para presentar los proyectos finaliza el 15 de Enero de 2024

PCBWay abre de nuevo la participación al concurso de creadores. Por el simple hecho de participar, se asignarán 500 beans (créditos) en tu cuenta de PCBWay, los cuales podrás canjear en la tienda por un Raspberry Pi Pico.

Además del premio por la participación, PCBWay repartirá un total de 16 premios: 1 primer premio al mejor proyecto, 2 segundos premios, 3 premios para los clasificados como terceros y 10 premios más para los proyectos más populares.

Consulta todos los detalles y las bases del concurso, pulsando el siguiente link:

Acceso al concurso de creadores PCBWay 

 

 

Privacidad-Domótica + Cierre automático

Pérdida de privacidad al instalar dispositivos conectados a Internet (Domótica). Construcción de un temporizador programable, para el cierre automático de una puerta de garaje. Este temporizador está construido con el micro controlador ATTiny, y puede acoplarse con cualquier sistema de control de acceso que disponga de un pulsador de apertura/cierre manual.

Contralador del cierre temporizado para la puerta del garaje

Control remoto

El control remoto de los dispositivos electrónicos facilita enormemente su uso. A nadie se le ocurriría ahora comprar un televisor sin su mando a distancia. Es muy cómodo acceder a una vivienda desde su garaje, abriendo la puerta con un mando a distancia y sin tener que bajar del coche.

Control remoto, para los dispositivos electrónicos

Pero esa comodidad no debería poner en riesgo la seguridad, porque si la puerta del garaje se quedase abierta, de nada serviría la puerta blindada de acceso a la vivienda. En la mayoría de los sistemas de apertura y cierre de puertas se incluye un cierre automático temporizado. Con esto se evita que la puerta se quedase abierta por olvido, o por haber pulsado su mando a distancia de forma accidental.

Domótica en la vivienda

Internet ha revolucionado la fabricación de dispositivos inteligentes, empezando por las cámaras de seguridad y llegando hasta las bombillas de iluminación. La tecnología actual permite la instalación de multitud de dispositivos inteligentes a un precio muy bajo, pudiendo convertir cualquier vivienda convencional en una casa domótica.

Domótica en la vivienda

El problema es que muchos fabricantes obligan a que su control remoto funcione a través de Internet, y la mayoría de ellos lo hacen a través de un servidor externo a la vivienda, normalmente ubicado en China.

Privacidad con la domótica

Sería conveniente que la legislación actual obligara a informar a los clientes de la pérdida de privacidad de cualquier dispositivo inteligente que esté comercializado, igual que lo hacen los fabricantes de tabaco en sus cajetillas.

La seguridad y privacidad de una vivienda, es inversamente proporcional al número de dispositivos inteligentes que contiene

Esquema

Del control de este circuito se encarga el micro controlador ATTiny85, funcionando con su oscilador interno de 16 MHz. El ATTiny monitoriza el estado alto/bajo del pin 3 (PB4) para detectar si la puerta está abierta o cerrada, por lo que será necesario montar un interruptor fin de carrera, que cierre su contacto cuando la puerta esté totalmente abierta. El interruptor que he pintado en el esquema es mecánico, pero podría utilizarse otro de tipo magnético.

Esquema del cierre temporizado para la puerta del garaje

Cada segundo se detecta el estado del pin 3 (PB4) del ATTiny. Cuando pasa de estado alto a bajo se inicia el descuento del temporizador, y el LED lo indica parpadeando muy rápido (5 destellos por segundo). En condiciones de reposo, cuando el circuito está conectado y el pin 3 (PB4) está a nivel alto, el LED hace un parpadeo cada segundo.

El tiempo de retardo se puede configurar entre 1 y 2,5 minutos, mediante la posición de los puentes J1 y J2. El valor del tiempo de retardo se actualiza y configura al alimentar el circuito, y se muestra su estado contando el número de destellos del LED = con 1 destello si el retardo es de  60 segundos, y 4 destellos para 150 segundos.

Cuando la puerta del garaje permanece abierta más tiempo del configurado en el temporizador, el pin 5 (PB0) del ATTiny envía un impulso alto de 1 segundo al transistor y se cierra el contacto del relé. Como los contactos del relé están libres de tensión, se pueden conectar con los 2 hilos del pulsador manual de apertura/cierre de la puerta, sin interferir al circuito controlador del motor.

Aunque la puerta en la que se monte este circuito ya disponga de un interruptor fin de carrera, no podría utilizarse y habría que montar un segundo interruptor, porque este circuito inyecta una tensión de 5V para detectar la posición del pulsador.

Para alimentar este temporizador he utilizado una pequeña fuente conmutada de 230VAC/5VDC. En la caja incorporé un interruptor que corte en la alimentación de entrada,  con el fin de poder anular fácilmente este automatismo de cierre.

Firmware

El firmware que necesitas para programar el ATTiny85, lo puedes descargar de forma gratuita desde el siguiente enlace:

https://github.com/J-RPM/ATTiny-Timer_Garage

Circuito impreso

Para hacer este montaje utilicé el mismo PCB que había encargado a PCBWay para montar el interruptor inteligente. En este circuito impreso están todos los componentes de este circuito, y sólo se tienen que adaptar las conexiones de entrada y salida para convertirlo en un temporizador.

Adaptar el PCB para el temporizador de cierre automático

Revisando las pistas de conexión por delante y por detrás, observamos que en los terminales del filtro de red están los hilos de alimentación, y estos llegan desde la conexión de salida máster del PCB. Para utilizar este PCB, es necesario cortar una pista del circuito impreso y realizar un puente por la cara superior.

¿Dónde fabricar el PCB?

Actualmente hay muchas empresas que se dedican a fabricar circuitos impresos, 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://pcbway.com/g/r7N1ct

PCB: Interruptor inteligente

Acceso a los GERBER de este PCB

PCB from PCBWay

Link of my shared project

Caja 3D:

Caja 3D, para el temporizador de la puerta del garaje

 

Litros de un depósito en el móvil

Construcción de un medidor de nivel de líquidos por ultrasonidos con Arduino. Los litros que contiene un depósito se calculan en función de la ditancia libre del depósito, medida por ultrasonidos, y se muestran en un display OLED con una resolución de 1 litro. Las medidas del depósito se deben configurar en el firmware, antes de programar el ATMega328P. Todos los ajustes y medidas pueden comprobarse a distancia en un teléfono móvil, mediante una conexión Bluetooth.

Interior del medidor de litros

Nivel de un depósito con ultrasonidos

Mejoras con respecto al montaje anterior

  • Montar un módulo Bluetooth para ver en el teléfono todos los datos de cada medida, además de los litros, que es lo único que muestra el display.
  • Bajar la resolución de la medida a milímetros, para coseguir que los litros que muestra el display cambien de uno en uno, y no cada 7,4 litros.

Resolución de la medida

Precisión de la medida

Los litros que muestra este medidor sólo sirven como referencia orientativa. Aunque la precisión de la medida de distancia por ultrasonidos sea bastante buena, hay que tener en cuenta otros factores:

  • Lo normal es que un depósito no sea totalmente simétrico, debido a los flejes de refuerzo y sus ondaluciones.  Si además es un depósito de plástico,  su capacidad varía en función del volumen de líquido que contiene y su temperatura.
  • Teniendo en cuenta que en el depósito que lo instalé, cada milímetro de combustible se corresponden a 0,74 litros, en el mejor de los casos la precisión de la medida sería de +/-1 litro.

Esquema

A continuación se muestra el nuevo esquema del medidor de litros por ultrasonidos. Lo único que cambia con respecto al esquema anterior, es el pulsador del Reset y el módulo Bluetooth HC-05.

Esquema del medidor de litros

Bluetooth HC-05

Es necesario configurar el módulo Bluetooth HC-05 antes de montarlo en el circuito. Aparte de su nombre y password, se debe configurar en modo esclavo a 38.400bps. Luego sólo habría que hacer 3 conexiones con este medidor: los dos hilos de alimentación (5VCC), y la conexión entre el terminal RXD del módulo HC-05 y el terminal TX del microcontrolador ATmega328P.

La conexión TX del módulo ARDUINO UNO está rotulada como D1, y se corresponde con el pin número 3 del microcontrolador ATmega328P.

Configuración del módulo Bluetooth HC-05

El pulsador Reset lo monté para poder reiniciar el microcontrolador en cualquier momento, y permitir que el módulo Bluetooth envíe los datos de configuración del depósito al teléfono móvil.

Configuración del depósito en el móvil

Configurar el tamaño del depósito

Las medidas y capacidad del depósito forman parte de los parámetros de ajuste del código del programa, pudiendo así adaptar con facilidad el firmware a las dimensiones y volumen de cualquier depósito.

Configuración del tamaño del depósito

En esta versión hay que poner todas las medidas en milímetros. Las valores de las tres últimas variables se dejan sin valor, el programa se encargará de calcular estos valores en función de las medidas del depósito.

Al aumentar la resolución de la medida de distancia hasta un milímetro, es muy fácil que cualquier movimiento del líquido en la superficie del depósito haga fluctuar la medida. Para minimizar este efecto, el programa realizará una serie de medidas consecutivas y mostrará el promedio de todas ellas. Cada vez que toma una muestra, introducirá un pequeño retardo antes de realizar la medida siguiente. Este retardo lo calcula el programa, y varía en función de la altura del depósito. Con este retardo se minimiza el efecto eco de una medida anterior en la siguiente, lo cuál introduciría un error al calcular el promedio.

APP para el móvil

Para mostrar los datos que envía el medidor en un teléfono móvil, se puede instalar cualquier aplicación de tipo ‘Terminal‘, yo utilizo una APP gratuita:

Serial Bluetooth Terminal 

APP: Serial Bluetooth Terminal

Firmware

El código que necesitas para programar el ATMEGA-328P de Arduino, lo puedes descargar del repositorio GitHub:

https://github.com/J-RPM/Level-of-a-tank-with-ultrasound

¿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/

 

Nivel de líquidos con Arduino

Hace unos días monté un Capacímetro con Arduino. Modificando ligeramente el código es posible añadir una función extra, y utilizarlo también como medidor de nivel de un depósito de agua o combustible.

Medida de nivel con el capacímetro

Capacímetro con Arduino

Sensor de nivel para líquidos

Para medir el nivel de líquidos en un depósito, lo mejor sería montar un sensor resistivo con una boya magnética. Estos sensores son bastante precisos y fiables, pero no son nada baratos cuando los depósitos son grandes. Los sensores resistivos de varilla están construídos con un tubo de acero inoxidale hermético, y una boya imantada en forma de toride por el exterior.

Sensor de nivel resistivo

La varilla del sensor mide lo mismo que la altura del depósito, en mi caso 130 cms. para un depósito de 1000 litros.  En el interior de la varilla hay muchas resistencias en serie, su número varía en función de la altura del depósito y la resolución del sensor. Cada resistencia incluye un microcontacto magnético, el cuál se cierra cuando la boya exterior alcanza su altura, modificando así el valor de la resistencia entre sus dos terminales de salida. Algunos sensores pueden tener tres cables, el cable extra va conectado a un microinterruptor que se posiciona casi al final de la varilla, al fondo del depósito,  y se puede utilizar como alarma para avisar cuando se ha llegado a la reserva.

Sensor de nivel Capacitivo

El inconveniente principal de un medidor de nivel de líquidos capacitivo, es que su precisión disminuye a medida que aumenta la longitud del cableado de conexión entre el sensor y el equipo de medida, y su resolución varía en función de las propiedades del líquido. A cambio es una alternativa barata, y es muy sencillo fabricar un sensor capacitivo de forma casera.

El extremo del cable-sensor hay que sellarlo, porque el líquido no puede entrar en contacto con el cobre. Para dar rigidez al cable, utilicé un trozo de canaleta de plástico del tamaño del depósito (130 cms).

Sensor de nivel capacitivo

Para sellar el extremo final del sensor utilicé adhesivo termofundible (error), pero después hice pruebas con gasoil, con el fin de comprobar el posibe deterioro del aislante, la canaleta y el sellado del extremo.

Al cable no le pasa nada, pero la canaleta pierde algo de rigidez, y el adhesivo termofundible pierde adherencia con el cable. Con el tiempo se podría desprender el sellado del cable y falsear la medida. La solución que tomé, fué quitar el adhesivo termofundible y la canaleta.

Sellado del cable: presionando y moviendo la funda del cable hacia fuera hasta ocultar el cobre. Luego con aire caliente puse el plástico del extremo muy viscoso, y lo sellé presionando con un alicante de punta estriada.

Mantener el cable rígido dentro del depósito: puse un trozo de acero inoxidable en el extremo inferior del cable-sonda, y luego tensando el cable hacia fuera del depósito y bloqueando con una brida en el extremo superior, el cable-sensor queda totalmente recto.

Esquema del capacímetro

Este capacímetro está construido con un ATMEGA328P y sus componentes mínimos: el circuito oscilador y el del Reset.

Esquema del Capacímetro.

Código de programación

Para que este capacímetro pueda mostrar el nivel del depósito, he creado una tabla referenciando a cero el valor de capacidad que mide el sensor sin entrar en contacto con el gasoil, y la máxima la he calculado a partir de la medida que muestra el capacímetro con el sensor sumergido, actualmente el gasoil está a 93 cms. de altura desde el fondo del depósito.

Código: Capacímetro y Nivel de líquidos

Con el capacímetro colocado a dos metros del depósito, la capaciadad que medí con el sensor fuera del depósito era de 252pF, y con el sensor sumergido a 93 cms medí 267,26pF. Así  el incremento de capacidad por centímetro de gasoil en el depósito es: (267,26pF – 252pF) / 93 cms = 0,164pF. Y con el depósito lleno, la capacidad sería:  252 + (0,164pF x 130 cms) = 273,33pF.

Como podemos comprobar, existe una diferencia de capacidad entre el depósito lleno y vacío de tan apenas 21,33pF. para una distancia de 130 cms. En las pruebas que hice con la jarra de agua, el incremento de capacidad por centímetro era de 2pF… una resolución 12 veces mejor que en el depósito de gasoil. Aparte de la diferencia que exista entre el agua y el gasoil, poner el capacímetro tan lejos del sensor no ha sido buena idea. Para conseguir una mayor precisión y estabilidad en la medida, tendría que haber colocado el capacímetro más cerca del depósito.

Para minimizar la fluctuación de las medidas, se toman 150 muestras y se calcula el valor promedio, antes de mostrar los datos en la pantalla. El nivel del depósito se muestra de forma gráfica en la línea superior del display. La barra de nivel se forma a partir de 6 caracteres gráficos que se almacenan en la RAM, indexados del 0 al 5. El gráfico con index 0 es un caracter en blanco, el uno rellena la primera línea vertical de la matriz de 7×5 que conforma cada letra, y así sucesivamente hasta el index 5 que rellena las 5 líneas verticales. Así la barra gráfica completa se compone de 5 niveles por 16 caracteres = 80 niveles.

Nivel del depósito

Al inicio del void loop() se toma una medida de capacidad, y si el valor leído es inferior a 355pF se accede a la rutina de medida de pF con dos decimales, pero se muestra el valor directamente en pFx100. en la línea inferior del display, y la gráfica de nivel del depósito se muestra en la línea superior. Si la capacidad medida es superior a 355pF, funciona como un capacímetro y no se muestra la gráfica del nivel,

Madida de capacidad

Firmware

El código que necesitas para programar el ATMEGA-328P de Arduino, lo puedes descargar del repositorio GitHub:

https://github.com/J-RPM/Capacimeter-Level

¿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/

 

Capacímetro con Arduino

La plataforma de programación de Arduino es muy versátil. Al ser un sistema de código abierto, hay mucha gente que colabora y comparte sus programas. Con Arduino es muy sencillo diseñar y fabricar cualquier dispositivo electrónico a medida. Sólo hay que buscar las librerías del proyecto que tengamos en mente, y escribir unas pocas líneas de código para  hacer que todo funcione según lo hemos pensado. Hace unos días me preguntaron si conocía la librería Capacitor.h, y como la mejor forma de conocer una librería es trabajar con ella, hice este capacímetro con Arduino. Como en realidad son dos librerías, he utilizado las dos dentro del mismo código.

«Capacitor.h» permite medir capacidades comprendidas entre 1pF y 100μF.

https://wordpress.codewrite.co.uk/pic/2014/01/21/cap-meter-with-arduino-uno/

«CapacitorLite.h» utiliza menos almacenamiento de programa y funciona más rápido. Puede medir entre 0,2pF y 655pF, pero se aumenta su resolución porque entrega los valores en pFx100 (dos decimales).

https://wordpress.codewrite.co.uk/pic/2014/01/25/capacitance-meter-mk-ii/

Esquema del capacímetro

Este capacímetro está construido con un ATMEGA328P y sus componentes mínimos: el circuito oscilador y el del Reset.

Esquema del Capacímetro.

Para montar todo esto, utilicé un PCB de los que me sobraron cuando hice el Shield del programador ISP para Arduino.

Shield programador ATmega/ATtiny (ARDUINO)

El único problema es que tuve que hacer algunos puentes con cable por debajo.

Puentes a realizar en el PCB del Capacímetro-

Para alimentar el capacímetro utilicé una batería LiPo de 3,86V de tensión nominal, es un módulo recuperado de la batería de un PC. El largo y ancho del capacímetro lo hice en función del tamaño de la batería. La batería va alojada en la base de la caja, debajo de toda la electrónica. Para elevar la tensión de la batería a 5V, es necesario un circuito Step-Up Converter. El primer circuito Step-Up que utilicé interfería las lecturas del conversor ADC, y el capacímetro mostraba algunas medidas erróneas. Al final probé con un módulo MT-3608, previamente ajustado a 5V, y se acabaron los problemas. Para cargar la batería, utilicé el módulo de carga y protección TP-4056.

La  medida de la capacidad se muestra en un display LCD de 2×16 caracteres, utilizando la librería CapacitorLite si el condensador bajo prueba mide menos de 655 pF, o Capacitor.h para mostrar capacidades hasta 100μF. El rango de la medida de capacidad se podría aumentar un poco más, pero la precisión empeora rápidamente.

Código de programación

En los comentarios de inicio del programa están los detalles de funcionamiento, y los link de acceso a las dos publicaciones de Jonathan Nethercott, donde explica con más detalle el funcionamiento de las dos librerías y su calibración.

Código Arduino para el Capacímetro.

Al principio del código se definen los pines de conexión del display LCD y los dos pines donde las dos librerías medirán el condensador bajo prueba: el pin digital 12 y el analógico 2. Para realizar la medida, la librería genera un impulso de 5V de corta duración, alrededor de 100μSeg.

Impulso generado por el Capacímetro.

Posteriormente se realiza la media de tensión en el condensador entre los pines D12 y A2, en función de la capacidad interna y la resistencia PullUp del microprocesador que se utiliza. Estos valores los define de forma automática la librería, pero se pueden calibrar para aumentar la precisión.

En el void setup() se define la velocidad del puerto serie y se genera el mensaje de presentación en el LCD y el puerto serie. También se pueden modificar los valores de calibración de las dos librerías si fuera necesario.

En el void loop() se repite el ciclo de medida de capacidad cada segundo. Se empieza midiendo la capacidad con la librería CapacitorLite.h. El valor de esta medida es en pF x 100, por lo que habría que dividir el valor obtenido entre 100 para mostrar la medida en pF, pero primero se comprueba si el valor obtenido es menor de 65.500, ya que el contador es de 16 bits y se desborda al superar 65.535. A continuación se puede ver el impulso de 5V de corta duración, que genera el pin D12 para realizar la medida de capacidad.

Si el valor de la medida fuese mayor de 655pF, se repetiría la medida utilizando la librería Capacitor.h. A continuación se pueden ver los dos impulsos que genera el pin D12, uno a continuación del otro, para realizar otra medida de capacidad utilizando la segunda librería.

Doble impulso del capacímetro

Con Capacitor.h se obtienen directamente valores en pF. Mediante el código se ajustan los valores superiores a 1.000 para que se muestre en nF, y si la medida es superior a 1.000.000, se ajusta el valor a μF. Al principio de todo, se comprueba que el valor medido sea inferior a 101 μF, con el fin de no mostrar valores imprecisos en las medidas.

Al final del código se muestra la medida realizada en el LCD y a través del puerto serie, añadiendo una indicación de actividad en el display durante 300mSeg. Al final se realiza una pausa de 700mSeg. antes de repetir de nuevo el ciclo de medida.

Firmware

El código que necesitas para programar el ATMEGA-328P de Arduino, lo puedes descargar del repositorio GitHub:

https://github.com/J-RPM/Capacimeter/

Caja 3D del Capacímetro

La caja del Capacímetro la hice con 3 piezas, impresas en 3D con PLA de color negro. Para que destaque la serigrafía, se puede pintar con un pincel fino y pintura sintética, utilizando cualquier color que sea claro.

Caja 3D para el Capacímetro.

Caja del Capacímetro – Thingiverse: Capacimeter with Arduino

¿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/

Plato giratorio con motor paso a paso

Construcción de un plato giratorio, con un motor paso a paso unipolar de 5 hilos 28BYJ-48. Los platos giratorios se utilizan desde hace mucho tiempo en los escaparates como expositores, sobretodo en tiendas de relojes y joyerías. En mi caso, lo voy a utilizar para grabar algunas escenas de montajes electrónicos. Este plato puede girar en ambos sentidos con gran precisión, y a una velocidad configurable a elegir entre uno de sus 6 preset. El controlador del motor está hecho con un microcontrolador Atmega328P (Arduino). Aprovechando la gran precisión de giro de los motores paso a paso, este plato giratorio se podría utilizar como temporizador cíclico, montando levas en el plato para accionar uno o varios pulsadores.

Motores Paso a Paso

Un motor paso a paso convierte los impulsos eléctricos que recibe en sus bobinas, en movimiento de rotación, y se considera como un motor de corriente continua sin escobillas.

Motor Unipolar de 5 hilos

Un motor paso a paso funciona con tensión continua, y puede ser de casi cualquier tamaño y par. Cuando se le aplica energía en alguno de sus bobinados, da un «paso» en lugar de girar constantemente. Cada paso provoca una rotación con un ángulo especificado por el fabricante del motor, ya que depende del número de polos del motor y su demultiplicación interna.

Un motor paso a paso se comporta como un conversor Digital-Analógico (D/A), convirtiendo los impulsos digitales de tensión que recibe en giros analógicos de gran precisión. Estos motores se utilizan en cualquier dispositivo electrónico que requiera mover objetos con gran precisión: impresoras convencionales y 3D, escáner, plotter, fresadoras CNC, grabadores láser, etc.

Stepper motor 28BYJ-48

Model : 28BYJ-48
Rated voltage : 5VDC
Number of Phase : 4
Speed Variation Ratio : 1/64
Stepper Motor 5V 4-Phase 5-Wire & ULN2003 Driver Board
Stride Angle : 5.625° /64
Frequency : 100Hz
DC resistance : 50Ω±7% (25℃)
Idle In-traction Frequency : > 600Hz
Idle Out-traction Frequency : > 1000Hz
In-traction Torque >34.3mN.m (120Hz)
Self-positioning Torque >34.3mN.m
Friction torque : 600-1200 gf.cm
Pull in torque : 300 gf.cm
Insulated resistance >10MΩ (500V)
Insulated electricity power :600VAC/1mA/1s
Insulation grade :A
Rise in Temperature <40K (120Hz)
Noise <35dB (120Hz, No load, 10cm)

Control del plato giratorio

Para controlar los ángulos de giro y velocidad de un motor paso a paso, es necesario saber como mínimo el número de pasos por vuelta del motor, su tensión de alimentación y la frecuencia máxima de funcionamiento.

El motor 28BYJ-48 hace un giro completo cada 64 pasos, pero incluye una reducción de 1/64 . Como resultado tenemos 64×64 = 4096 pasos por vuelta. Como el motor se acopla al plato mediante un piñón y una corona de relación 1/7, los cálculos de giro los tendremos que calcular en función de 4096×7 = 28972 pasos por vuelta.

Al tratarse de un motor de 4 fases, es posible controlarlo en ciclos de 4 pasos. Aunque se pierda un poco de PAR, los fabricantes aconsejan hacer funcionar el motor en modo “Half Step Drive” (medio paso), haciendo los saltos menos bruscos y reduciendo su consumo.

Secuencia de 8 pasos, para mover el motor 28BYJ-48 en Half Step Drive:

Secuencia de 8 pasos, para alimentar el motor paso a paso unipolar de 5 hilos 28BYJ-48

Construcción del Plato giratorio

Para la construcción de este plato giratorio he utilizado el motor paso a paso unipolar de 5 hilos 28BYJ-4.  Este motor junto con su driver de control, se puede conseguir por Internet por menos de 5 Euros. Al tratarse de un motor unipolar, no es necesario utilizar un driver del tipo Puente H, necesario para controlar los motores bipolares de 4 hilos.

Driver para motor paso a paso unipolar de 5 hilos

El driver de este motor es muy sencillo, sólo necesita 4 transistores en montaje Open-Collector para suministrar la corriente necesaria a las bobinas del motor. El driver que se incluye con este motor utiliza 4 entradas-salidas del circuito integrado ULN2003, de las 7 que incluye el chip. También lleva 4 indicadores LED para señalizar cuando se está alimentado cada una de las 4 bobinas del motor.

El controlador del motor lo he montado aprovechando el PCB del Shield del programador ISP de Arduino UNO que hice hace unos años.

Shield programador ATmega/ATtiny (ARDUINO)

Sólo es necesario cortar una pista del circuito impreso, y unir 11 pines del ATmega328P con su puntos de conexión correspondiente, como si se tratase de un Arduino UNO.

Esquema del plato giratorio con Arduino

En el esquema de montaje se muestran todos los puentes que hay que hacer en color rojo, así como los componentes que hay que montar, resaltados en color verde. Para alimentar todo el circuito, he utilizado una pequeña fuente conmutada de 230VAC-5VDC de 500 mA.

Acceso a descargas

Firmware para cargar en Atmega328P:

Plato_28BYJ-48.rar

Caja y engranajes 3D – Thingiverse:

Turntable, with a 28BYJ-48 5-wire unipolar stepper motor

¿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/

Entrenador de Reflejos y Coordinación

Hace 6 años hice un entrenador de reflejos con 6 pulsadores.

ENTRENADOR DE REFLEJOS – IMPROVES YOUR REACTION TIME

Después hice un mural de madera, y cambié los pulsadores por otros de gran tamaño, pudiendo controlar todo desde un PC mediante un software hecho a medida.

Mural con pulsadores (Entrenador de reflejos)

Con el software Reflejos.exe es posible controlar los tiempos, mostrar los intervalos entre pulsaciones, modificar las secuencias de los pulsadores, almacenar los tiempos de hasta 25 jugadores y mostrar su progresión mediante gráficas.

Software:Reflejos.exe (Control del juego/Prácticas QWERTY)

Posteriormente  hice un reloj LED con tecnología SMD, diseñando los PCB’s de la CPU y los dígitos numéricos. El PCB de control del  reloj lo hice pensando en una placa de desarrollo, igual que Arduino, montando conectores en todos los pines del microcontrolador. La CPU del reloj está construída con el microcontrolador AT89S52, el mismo microcontralador que utilicé en el primer Entrenador de Reflejos que hice, pero con encapsulado SMD.

Construye un Reloj SMD

En esta ocasión he actualizado el firmware del Entrenador de Reflejos y el software de control, para adaptarlos a esta nueva CPU y mejorar su operatividad. El nuevo montaje también es diferente, más enfocado a la rehabilitación y coordinación de movimientos que al juego. En este caso, los 6 pulsadores se pueden accionar con las manos y con los pies, y la conexión entre la CPU y el software de control es inalámbrica,  utilizando el módulo Bluetooth HC-05.

Entrenador de Reflejos y Coordinación

Nuevo esquema del Entrenador de Reflejos

Este es el nuevo esquema del Entrenador de Reflejos, con todas las conexiones adaptas al PCB del Reloj:

Esquema: Entrenador de Reflejos y Coordinación

Debido a la gran versatilidad de este PCB, en la adaptación no ha sido necesario cortar ninguna pista del circuito impreso ni hacer puentes entre ellas. Este PCB ya dispone de terminales de conexión para todos los periféricos que se necesitan conectar: los LED de señalización, los pulsadores, el display LCD y el módulo Bluetooth. El avisador acústico ya se utilizaba con el reloj, y va montado en el mismo PCB.

PCB: CPU del Reloj SERIE (Modificada)

Para la señalización óptica de los pulsadores he utilizado 2 LED SMD blancos por pulsador, en paralelo y alimentados a 5V, intercalando en serie una resistencia limitadora de 220 Ohmios en cada LED. Así la corriente máxima de cada LED es de aproximadamente 10mA. Con el fin de proteger la alimentación frente a un posible cortocircuito en el cableado, los 5 voltios que van hacia los pulsadores se alimentan de dos hilos diferentes, cada línea alimenta 3 pulsadores, y cada uno de estos hilos limita el consumo máximo intercalando una resistencia de 22 Ohmios en serie.

Para alimentar todo el conjunto he utilizado un conector microUSB. Así es posible utilizar cualquier cargador USB que tengamos disponible en casa. El consumo máximo de todo el circuito es inferior a 200mA.

PCB: microUSB

La programación y actualización del firmware del microcontrolador AT89S52 se realiza una vez montados todos los componentes en la placa, a través del conector ICSP. Lo ideal sería utilizar un programador ICSP comercial, pero si no lo tienes, podrías convertir en un momento un módulo Arduino en programador ICSP:

Programador ICSP con ARDUINO

Bluetooth HC-05

El módulo Bluetooth HC-05 hay que configurarlo antes de montarlo en la CPU.

Módulo HC-05

Para su configuración es necesario conectarlo a través de un interface serie con un PC, y con cualquier software Terminal y mediante comandos AT configurar su modo de funcionamiento como esclavo, y la velocidad a 57600 bps. Si se quiere, también se pueden modificar el nombre del dispositivo y su PIN de acceso a la conexión. La manera más fácil de configurar todo esto es a través de Arduino, utilizando su interface de comunicaciones serie para enviar los comandos AT al módulo  HC-05 y configurarlo.

Conexiones Arduino y HC-05 (configuración)

Al principio del código de configuración del módulo HC-05 he anotado los comandos AT más importantes, así como el modo de entrar en modo comandos AT. Dependiendo del tipo de módulo HC-05, el acceso a modo comandos es diferente, porque algunos módulos llevan un pulsador y otros no.

Bluetooth HC-05: Comandos AT

Acceso a descargas

Firmware para cargar en AT89S52: REFLEJOS_SMD_v1_02.HEX 

Configuración del módulo HC-05 con Arduino – DropBox: HC-05.rar

PCB de la CPU – PCBWay: Multipurpose_CPU_with_AT89S52 

Software de control – DropBox: Install_Reflejos.zip

Caja 3D – Thingiverse: Reflexes and Coordination Trainer

¿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/

 

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