Supervisor solar Fronius

Desde hace unos meses tengo funcionando una instalación solar destinada al autoconsumo de la vivienda.  Como el proceso de instalación fue bastante largo debido a la falta de material, junto con algunos problemas con la empresa instaladora, me dio tiempo a modificar los cableados a mi gusto, y añadir algunos medidores de control en el nuevo cuadro eléctrico antes de que la empresa instaladora diera de alta la instalación.

Instalación del inversor y cuadros eléctricos

Detalles de la instalación solar

La instalación solar es trifásica, compuesta por un inversor Fronius Symo de 7KW  y 20 paneles solares de 380 W. Los paneles están repartidos en las dos caras del tejado, un string con 12 paneles conectados en serie y el otro con 8 paneles.

Distribución de los paneles solares

Conexión con Internet

En una instalación solar es muy importante que el inversor disponga de una conexión estable con Internet, con el fin de controlar su correcto funcionamiento y poder controlar su rendimiento. La mejor solución sería conectar el inversor con un cable Ethernet al router de la vivienda, a no ser que el nivel de la señal WiFi que le llegase al inversor fuera muy bueno.  En mi caso, como la distancia entre el inversor y el router es muy larga, junto con la tirada de los cables de continua  que conectan los paneles con el inversor, añadí un cable RG174 de bajas pérdidas, y conecté una antena doble BIQUAD en el tejado, muy cerca y orientada hacia el router WiFi.

Antena Biquad WiFi

Cuadro eléctrico DC

En el cuadro de continua de la instalación solar, he montado 2 voltímetros para medir la tensión que genera cada string de los paneles solares. Como los medidores de tensión son digitales, es necesario alimentarlos para que funcionen. He utilizado una pequeña fuente de alimentación conmutada de 230 VAC a 5 VDC. La entrada de la fuente de alimentación está conectada a la tensión continua que genera el string de 8 paneles, los cuales producen una tensión continua máxima de 320V, tensión inferior a la máxima permitida por la fuente conmutada. Ambos medidores están conectados directamente con los cables de bajada de los paneles, antes de los fusibles de protección de 15A, pero la fuente y los dos medidores están protegidos con dos fusibles de 100 mA.

Medidores DC

Cuadro eléctrico AC

En el cuadro de alterna he intercalado un relé trifásico de protección, el cual incluye un medidor de corriente y tensión por fase. Este relé contiene un pequeño microprocesador, pudiendo programar los umbrales de tensión y corriente máxima y mínima. Los medidores muestran la tensión y corriente que está generando el inversor en cada fase. Al ser un inversor trifásico, la potencia total generada se reparte de forma proporcional entre las 3 fases. Un inversor solar conectado a la red,  aumenta ligeramente la tensión de salida a medida que aumenta su producción solar. De esta forma no está de más disponer de un voltímetro que muestre en tiempo real  la tensión que hay en cada una de las fases.

Relé de protección trifásico

Smart Meter de Fronius

La conexión entre el inversor Fronius y su medidor Smart Meter utiliza 3 hilos, los dos hilos de datos y el hilo de masa. He utilizado los 5 hilos sobrantes de la manguera para conectar las 4 salidas GPIO del inversor y un hilo con la salida +12V. Así puedo controlar el encendido de los 4 indicadores LED que he montado junto al medidor.

Configuración GPIO Fronius

Las 4 salidas GPIO del inversor son Open-Collector  y las he configurado para que se cierren cuando se superen 4 umbrales de potencia. Los 3 primeros indicadores LED los he asociado a la producción solar: 1, 2 y 3 kW y el tercer indicador, el LED rojo, se enciende cuando exista un excedente superior a 1 kW. Es decir, cuando se esté vertiendo a la red una potencia superior a 1KW.

Smart Meter de Fronius

Reloj & Inverter

Para mostrar los datos de potencia del inversor he utilizado el reloj de precisión que hice con el módulo ESP32, el cual mostraba la fecha y hora en un display de 7 segmentos. Al diseño original le incorporé los avisos por voz, quedando la versión 1.46. A partir de ahí he ido depurando el código hasta optimizar al máximo las funcionalidades del nuevo display, llegando así a la versión que ahora publico, v1.51.

Esquema: Reloj-Inverter

Con la primera versión del reloj, sólo se necesitaba una conexión a Internet al conectar la alimentación, para que pudiera conectarse con el servidor NTP de Internet y sincronizara la fecha y hora local del ESP32. Después el display podía funcionar de forma indefinida mostrando la hora del módulo ESP32, y ya no importaba si se perdía la conexión WiFi.

Reloj de precisión, 8 x 7 segmentos LED

Ahora sí  es imprescindible mantener la conexión WiFi en todo momento,  para permitir la conexión con el inversor Fronius y poder mostrar los datos en el display. Por ese motivo ahora se chequea cada 30 segundos la conexión WiFi, y si el módulo perdiera en algún momento la conexión, automáticamente se reiniciaría y no volvería a funcionar hasta que se conectase de nuevo con el servidor NTP de Internet, y sincronizara de nuevo el reloj del ESP32.

Al igual que en la versión original, con este código también se puede mostrar la información en un display de 7 segmentos y otro OLED de forma simultánea. Así es posible hacer diferentes versiones utilizando el mismo firmware. Actualmente utilizo esta versión de 3 formas diferentes:

  1. Con un display de 7 segmentos y el módulo de voz.
  2. Con un display de 7 segmentos,  sin el módulo de voz y acoplando todo al reloj de pared de esfera rotante. En este caso el reloj del ESP32 también resincroniza la fecha y hora del reloj de esfera rotante. Lo hace a través del puerto serie y sincronizando la fecha y hora de forma alterna, entre los segundos 20 y 50 de cada minuto.
  3. Versión reducida, utilizando sólo un display OLED para mostrar los datos.

Medidas de potencia en el display

El módulo ESP32 interroga al inversor cada 3 segundos, así las medidas de potencia que muestra el display se actualizarán cada 3 segundos. El módulo ESP32 se puede configurar mediante su servidor Web desde cualquier dispositivo móvil, permitiendo así que muestre en su display  la información que más nos interese. Por defecto, entre los segundos 58 y 2 de cada minuto, el display de 7 segmentos siempre mostrará la hora, y cada 30 segundos comprobará la conexión WiFi. Aprovechando esta ventana de tiempo,  el display podría  mostrar la información de la fecha en caso de que estuviese habilitada su presentación. Si el módulo ESP32 está configurado para mostrar alguno de los valores de potencia del inversor, cada 30 segundos chequeará si el inversor presenta algún error o no ha respondido a la última consulta, para mostrar ese error si existe.

En condiciones normales durante el día, el display no debería mostrar ningún error, sólo de forma ocasional podría mostrar algún error de conexión, debido a la colisión en el tiempo de varios dispositivos que consultan al mismo tiempo.  En mi caso, estoy consultando los datos del inversor Fronius de forma local desde 4 equipos diferentes: la Raspberry y desde los 3 displays que tengo funcionando.

Cuando el display muestra alguno de los valores de potencia del inversor, la letra que indica el valor de potencia puede aparecer fija, o parpadeando si existe un excedente de potencia superior a 1kW.

Leer los datos del inversor Fronius

Los datos del inversor Fronius se pueden obtener de dos formas diferentes, mediante una conexión TCP utilizando el protocolo ModBus,  o realizando las consultas definidas en  la API de Fronius.  Yo he utilizado ambos métodos para obtener los datos más relevantes del inversor,  y luego almacenarlos  en una Raspberry PI que tengo conectada directamente en el router. Así dispongo de un archivo histórico muy completo, pudiendo generar gráficas y comprobar el rendimiento de la instalación en cualquier momento.

Para la consulta de los valores de potencia a través del módulo ESP32, he utilizado dos consultas de la API de Fronius. El inversor responderá a las consultas de la API enviando los datos formateados en un archivo JSON. Para facilitar la lectura de las respuestas que envía el inversor,  he utilizado la librería: ArduinoJson.h

Potencias del inversor

Esta es la consulta que realiza el módulo ESP32, para obtener los datos de potencia (la IP es la del inversor Fronius):

http://192.168.1.112/solar_api/v1/GetPowerFlowRealtimeData.fcgi

Potencias Fronius

Alarmas del Inversor

Esta es la consulta que realiza el módulo ESP32, cuando el inversor no genera potencia solar o su «StatusCode»  es diferente a 7 (la IP es la del inversor Fronius):

http://192.168.1.112/solar_api/v1/GetInverterInfo.cgi

Alarmas Fronius

A través de esta consulta se obtiene el estado de alarma del inversor. Durante la noche, podrían a parecer los códigos de error 306 o 307

  • 307: El valor de tensión DC que generan los paneles es demasiado bajo para arrancar el inversor.
  • 306: La tensión DC de los paneles solares es suficiente, pero falta potencia para poder arrancar el inversor.
  • Status:2 Error:0  >>> Cuando la consulta coincide en el momento que el inversor está chequeando los valores de tensión/potencia de los paneles solares.

Descargas del firmware

ESP32_Clock-Fronius

Reloj LED de pared

Reloj LED de pared, compatible con ESP32 (Reloj & Inverter):

Reloj_V6.1_(22MHz_15x15).HEX

¿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 & ESR con Arduino (v2)

Hace unos meses monté un capacímetro con el fin de comprobar el funcionamiento de las librerías de Arduino: Capacitor.h y CapacitorLite.h. El resultado final no fue todo lo bueno que esperaba, porque el rango de medidas quedó bastante limitado, y no conseguí medir capacidades superiores a 100μF con precisión.

Capacímetro con Arduino

Ahora tengo un capacímetro que apenas utilizo, porque la mayoría de las veces lo necesito para comprobar el estado de condensadores electrolíticos en fuentes conmutadas. En estos casos, los condensadores superan el rango de medidas del capacímetro, y además necesitaría también comprobar su valor ESR para determinar si el condensador sospechoso está en buen estado o no.

Por todo esto, he decidido ampliar las prestaciones de este capacímetro de acuerdo a las necesidades de uso más habituales:

  • Medir capacidades entre 1pF y 10.000μF con precisión
  • Medir los valores ESR de los condensadores a partir de 10μF

Medida de un condensador variable

Detalles de funcionamiento del capacímetro

Después de analizar todas las posibles opciones de medida del capacímetro que monté, limitada por los 1024 umbrales del conversor ADC de Arduino, he decidido añadir una segunda toma de medida. Una entrada será para medir las capacidades entre 1pF y 1μF, y la otra será para medir valores entre 50nF y 10.000μF, incorporando la medida ESR a partir de 10μF.

Esquema: Capacímetro & ESR

Así con la primera entrada utilizaré la librería Capacitor.h para medir capacidades por debajo de 1uF, y la segunda entrada la utilizaré para medir las capacidades más altas, midiendo el tiempo que tarda el condensador bajo prueba en alcanzar el 63% de la tensión máxima del conversor ADC. Con esta segunda entrada del capacímetro, se podrán medir capacidades entre 50nF y 10.000μF.

Entrada 1: 1pF … 1μF (Capacitor.h)

La librería Capacitor.h toma como referencia la capacidad interna de un pin analógico de Arduino, y mide su voltaje después de 30nS. Luego toma como referencia el 1% de la tensión aplicada junto con la capacidad del pin de Arduino, para calcular la capacidad del condensador que se ha conectado.

Capacitor.h con capacidades

Partiendo de los 5 voltios máximos del ADC de Arduino y sus 1024 posibles valores, las lecturas del ADC que podemos esperar oscilarán aproximadamente entre un valor 33 para 1pF y 993 para 1nF (1000pF).

Si la capacidad medida es superior a 1nF, la librería Capacitor.h toma como referencia la resistencia interna PullUp del pin de Arduino, de aproximadamente 30KΩ, y mide el tiempo que tarda el condensador bajo prueba en alcanzar el 63% de la tensión aplicada. A partir de ese tiempo medido se calcula la capacidad aplicando la constante de tiempo RC, tomando como referencia el valor de la resistencia PullUp.

Medida de capacidades altas

Entrada 2: 50nF … 10.000μF (bornas)

Al conectar un condensador en la segunda entrada, el programa realizará un test de estado del condensador y luego realizará una medida rápida, conectando en serie una resistencia de bajo valor (240Ω), para medir el tiempo que tarda en alcanzar el 63% de la tensión máxima del ADC.

Test de los condensadores

  • Si la medida obtenida es superior a 80μF, medirá el valor ESR mostrando ambas medidas en el display. Haciendo la medida RC con una resistencia de bajo valor, se acelera el tiempo de medida de los condensadores de alta capacidad sin perder precisión.

Medida 1000uF

  • En caso de que la medida obtenida fuera inferior a 80μF, no se muestra el valor y se realiza una segunda medida conectando una resistencia 40 veces más alta (10KΩ), con el fin de obtener mayor precisión en la medida de condensadores más bajos. En este caso también se mide el valor ESR si la capacidad es >80μF, y se muestran los resultados en el display.

Calibración del capacímetro

El proceso de calibración de este capacímetro hay que hacerlo en 4 pasos. Dos de ellos son para calibrar los dos sistemas de medida de la librería Capacitor.h, y los otras dos para calibrar los dos rangos de medida de la segunda entrada del capacímetro.

Entrada 1: medidas entre 1pF y 1nF

Es imprescindible conocer el valor exacto de la capacidad interna del pin analógico de Arduino, junto con las capacidades parásitas externas del montaje. Por esto siempre es necesario realizar una calibración final, conectando un condensador de valor conocido y menor de 1000pF como referencia, para medir su valor con el capacímetro una vez montado y cerrado.  Si la medida que muestra el capacímetro fuera inferior a la capacidad real del condensador, subiremos ligeramente el valor de la capacidad interna en el programa, y volveremos a programar el microcontrolador con la nueva referencia. Y si midiera una capacidad superior a la real, bajaremos el valor de la capacidad de referencia. Este proceso habrá que hacerlo varias veces, hasta que consigamos que el capacímetro muestre el valor real del condensador que hemos elegido como referencia.

Entrada 1:  medidas entre 1nF y 1μF

Seguiremos el mismo proceso de antes, pero en este caso es mucho más sencillo porque podremos hacerlo sin cerrar la caja del capacímetro. Conectaremos un condensador algo inferior a 1μF de valor conocido, y retocaremos el valor de la resistencia PullUp que hemos puesto en el programa. Teniendo en cuenta que si aumentamos el valor de la resistencia PullUp, se reducirá el valor de la capacidad que muestre el capacímetro, y si reducimos el valor de la resistencia aumentará la capacidad medida.

Entrada 2:  medidas entre 50nF y 10.000μF

En la segunda entrada del capacímetro, los condensadores de capacidad más baja (<80μF) se miden conectando una resistencia en serie de 10KΩ, y se mide el tiempo que tarda el condensador en alcanzar el 63% de la tensión máxima del conversor ADC. Aunque pongamos una resistencia de precisión, como la tensión de 5V se conecta a través de un pin digital de Arduino, tendremos que sumar el valor de su resistencia interna para que la medida sea precisa.

Pin de medida del Capacímetro

Por otra parte, la conexión común de ambas entradas del capacímetro no es GND, es otro pin analógico de Arduino, y aunque lo configuremos como salida con valor bajo, se sumará una resistencia extra a la constante RC. El valor de esta resistencia extra se compensa de forma automática en el código del programa.

Pin de referencia del capacímetro

Cuando se miden condensadores >80μF, el capacímetro le conecta una resistencia en serie de 240Ω, con el fin de reducir el tiempo de la medida. En este caso sucede lo mismo que antes, y por eso también tendremos que compensar el valor de la resistencia interna del pin digital que conecta la tensión al circuito RC.

Ajuste automático de referencia

El capacímetro realiza un ajuste a cero de las dos entradas cada vez que se conecta la alimentación, compensando así las capacidades parásitas de las puntas de medida que hayamos conectado. Es importante conectar el capacímetro con las puntas libres, sin ningún condensador conectado entre ellas.

Auto ajuste inicial del capacímetro

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/

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 un depósito con ultrasonidos

Construcción de un medidor de nivel de líquidos para un depósito con ultrasonidos. En un depósito simétrico, dividiendo su capacidad máxima en litros entre la altura en centímetros, obtendremos el número de litros que contiene cada centímetro del líquido dentro del depósito. Conociendo la capacidad máxima del depósito, es posible medir la distancia libre de la parte superior del depósito por reflexión de los ultrasonidos en la superficie del líquido. Luego restamos esa distancia con la altura total del depósito, y así podremos calcular los litros que almacena en su interior.

Medidor de nivel por ultrasonidos, instalado en el depósito

Aprovechando el medidor de distancias ultrasónico que hice el año 2018, sólo he tenido que adaptar su código para convertir el medidor de distancia en un medidor de litros, y mostrarlos en el display.

OLED: SSD1306 ‘Fake in China’ & Sensor de proximidad para invidentes

Litros de un depósito

Para calcular el número de litros que hay dentro de un depósito simétrico, podemos medir la distancia libre de líquido, desde su nivel máximo de llenado hasta la superficie del líquido. Luego restamos esa distancia de la altura total del depósito, y la multiplicamos por el número de litros por centímetro que previamente hemos calculado en función de la altura del depósito y su capacidad máxima.

Litros en el depósito

De esta forma podemos realizar la medida desde arriba, colocando un medidor de distancia ultrasónico en alguna de las bocas de respiración del depósito. Apuntando el haz ultrasónico del medidor hacia el fondo, el sensor recibirá el eco que se refleje en la superficie del líquido. A partir de esa medida ya podemos calcular el número de litros que contiene el depósito, evitamos que el sensor entre en contacto con el líquido, y podríamos medir cualquier producto químico o corrosivo.

Funcionamiento del sensor HC-SR04

El sensor de ultrasonidos HC-SR04 tiene dos cápsulas piezoeléctrias, por una de ellas transmite un tren de impulsos inaudible (40 KHz), y por la otra recibe el eco de la señal reflejada. Dependiendo de la distancia del punto de reflexión, el eco recibido llegará con mayor o menor retardo. Tomando como referencia la velocidad de propagación del sonido en el espacio libre, con tan sólo medir el tiempo de retardo del eco recibido con respecto al origen, podremos calcular con precisión a qué distancia del sensor se encuentra el obstáculo.

Sensor HC-SR04

El sensor HC-SR04 dispone de 4 pines de conexión, 2 de ellos son para alimentar su circuito con 5VDC (Vcc/GND), y los otros dos son para realizar las medidas:

      • Trig: Un microprocesador externo envía un impulso de corta duración cada vez que necesita obtener una medida.
      • Echo: El sensor entrega un impulso de ancho variable, y midiendo su duración obtenemos la distancia a la que se encuentra el obstáculo.


    Sensor HC-SR04

Esquema

Este circuito incluye un zumbador piezoeléctrico, el cual he aprovechado en este montaje para utilizarlo como alarma acústica, y avisar cuando el nivel del líquido está por debajo del nivel mínimo que hayamos prefijado (reserva).

Esquema: Detector de proximidad

Características 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.

Ajustes del tamaño del depósito

El nivel de la reserva también se configura en el código del programa, y son los centímetros desde el fondo del depósito hasta el nivel mínimo prefijado. En función del número de litros por centímetro del depósito, podemos calcular el número de litros de la reserva. En este caso, el nivel de reserva sería: 7,41 L/cm. X 40 cms. = 296,4 litros.

Montaje en el depósito

Como este medidor es muy pequeño, lo monté en una de las bocas de respiración para el llenado del depósito, sustituyendo su tapón por un soporte que hice a medida con la impresora 3D.

Soportes 3D, para el interruptor y el sensor de medida por ultrasonidos

Para conectar el medidor ultrasónico sólo cuando lo necesite, cambié  su interruptor de encendido por un conector de alimentación. Desde el conector hice una prolongación con cable paralelo, hasta llegar al interruptor de encendido/apagado. El interruptor lo puse en la puerta de acceso al hueco donde tengo el depósito, con el fin de no tener que acercarme hasta el depósito para ver su contenido.

Test de funcionamiento

Antes de montar el sensor en el depósito, es conveniente comprobar que no hemos cometido algún error al introducir los parámetros de ajuste en el código del programa, y de paso comprobar que funciona correctamente en todo el rango de medidas.

Test del calibrado

En la imagen anterior, comprobé que el display mostraba 1000 litros a una distancia de 5 cms. La capacidad máxima de mi depósito es de 1000 litros, y la distancia entre el sensor y el nivel máximo del depósito (offset) es de 5 cms.

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

Soportes 3D

El soporte del medidor y su interruptor remoto los hice on PLA de color negro. Los ficheros los puedes descargar desde el siguiente link:

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

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

Transmisor DCF77 con ESP32 (v2)

Hace casi dos años hice un transmisor de DCF77 con un módulo ESP32, y lo acoplé dentro de otro transmisor que había hecho con anterioridad con Arduino. Ahora voy a montar otra versión del mismo transmisor DCF77, reduciendo al mínimo su tamaño y sin eliminar sus prestaciones.

Amplificador DCF77

Transmisor DCF77 con ESP32

Esquema

En la versión 2 del transmisor DCF77 con ESP32, he quitado el segundo controlador de Arduino, ya que sólo servía para complementar la información que muestra el display OLED. Pero he utilizado un trozo del PCB de ese transmisor, el que contiene los componentes del amplificador, y mediante 3 hilos lo he conectado con el módulo ESP32: los 2 hilos de alimentación y el hilo de salida DCF77 ya modulado. La salida de los impulsos DCF77 no se utiliza, pero se puede utilizar para hacer medidas.

Esquema: Transmisor DCF77 con ESP32 (v2)

Para comprobar que se está transmitiendo la señal por el amplificador, he montado un LED SMD en serie con una resistencia limitadora,  en paralelo con el condensador de 1nF del circuito resonante de salida, la antena transmisora. La resistencia limitadora del LED la he puesto bastante alta, de 3k9,  con el fin de que no se reduzca el nivel de RF radiado.

Nivel de salida DCF77

Con el fin de comprobar el correcto funcionamiento del amplificador de salida, y medir el nivel de tensión pico a pico de la portadora DCF77 (77,5 kHz), he conectado las puntas del osciloscopio en paralelo con la bobina del amplificador (antena). La punta de referencia del osciloscopio (GND) la he conectado a la toma de la bobina que va conectada a la alimentación de +5V, ya que para la señal de RF el +5 es lo mismo que el GND. Así en las medidas del osciloscopio, la referencia GND que muestre se corresponderá con la tensión +5 del amplificador.

El osciloscopio debería funcionar con batería, o estar aislado de la tensión de la red eléctricaMedida DCF77 a la salida del amplificador

Analizando la gráfica que muestra el osciloscopio, la amplitud de la señal DCF77 ocupa 3 cuadros X 5V = 15Vpp. Se puede observar que desde el punto de referencia del osciloscopio (1→ de la izquierda) hacia abajo hay un cuadro = 5V, justo la tensión a la que está alimentado el amplificador. Al estar funcionando el amplificador en Clase C (se polariza con la señal de RF) el transistor deja de conducir cada segundo durante 100 o 200ms, dependiendo si se transmite un CERO o UNO lógico. En la imagen se muestran dos segundos consecutivos (10 divisiones de 200ms), con dos intervalos sin portadora de 100ms = dos ceros lógicos. La medida que muestra a la derecha la pantalla del osciloscopio de 10V, es la tensión ‘extra’ que produce la bobina de 4mH junto con el condensador de 1nF al estar en resonancia a la frecuencia de 77,5 kHz.

Firmware

Repositorio GitHub:
https://github.com/J-RPM/DCF77-Transmitter

El archivo que necesitas para programar el ESP32, lo puedes descargar de forma gratuita desde el siguiente enlace: DFC77_ESP32_JR.rar

Caja 3D (ESP32+Display)

Caja 3D: Transmisor DCF77 con ESP32 (v2)

El fichero .stl que necesitas para fabricar esta caja, lo puedes descargar desde el siguiente enlace: DCF77 transmitter with ESP32 (v2)

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

Monitor FM-RDS (v1.2)

Con este receptor es posible conocer los parámetros más importantes que se transmiten por la subportadora RDS. Con esta nueva actualización (v1.2), las librerías del RDS permiten analizar más información que antes, y todo el código está depurado para optimizar la memoria del ATMEGA328P, permitiendo así añadir más prestaciones en el receptor de radio, utilizando el mismo microprocesador.

Monitor FM-RDS v2

Tabla de caracteres del RDS

El sistema RDS transmite los textos codificando los caracteres con su propia tabla de 8 bits, y dispone de 3 tablas de caracteres diferentes, denominadas G0, G1 y G2. Por defecto, los receptores de radio traducen los 8 Bytes del PS y el Radio Texto (RT) utilizando la tabla de caracteres G0. La tabla GO incluye la mayoría de los caracteres utilizados por las diferentes lenguas de la zona EBU. Los receptores de radio tienen que leer el código de 8 bit que reciben por cada letra, y convertirlo al código que se corresponda con la tabla de caracteres que estén utilizando. En este caso sería necesario convertir los caracteres dos veces, una vez para adaptarlos a la tabla de caracteres gráficos de su display LCD, y otra más para codificarlos en UTF-8 y transmitirlos por el puerto serie.

Receptor RDS: tabla de caracteres

Los primeros 127 caracteres de la tabla del RDS siguen el estándar ISO, por lo tanto no hay que convertirlos. Sin embargo, los 127 caracteres más altos de la tabla del RDS no son estándar, y es necesario convertir sus códigos para mostrar correctamente las letras. En este receptor sólo se convierten los caracteres latinos más utilizados, son los caracteres enmarcados con color en la tabla del gráfico anterior.

El display LCD de este receptor dispone de una memoria RAM, que le permite almacenar un máximo de 8 caracteres gráficos diferentes. El display reserva las 16 primeras posiciones de su mapa de caracteres para almacenar gráficos, pero hay que tener en cuenta que el display sólo guardará 8 caracteres gráficos diferentes. Si se guardan los 8 caracteres en las primeras posiciones de la CGRAM (direcciones 0x00 a 0x07), estos mismos caracteres se copiarán también en las 8 posiciones siguientes (direcciones 0x08 a 0x0F). Debido a esta limitación, sólo se generan y guardan los gráficos de las 5 letras acentuadas en minúscula, y las letras: ü, ñ y ç. Cuando se reciban por RDS letras mayúsculas acentuadas, el programa las convertirá en letras mayúsculas sin acento.

Receptor FM-RDS con: SI4703

Este sencillo receptor de radio está basado en el módulo SI4703, de bajo coste y altas prestaciones. Este módulo incluye en su interior todo el receptor de radio, incluso el decodificador Estéreo, el decodificador RDS y un pequeño amplificador de audio. Para controlar este módulo, he utilizado el micro-controlador ATMEGA328P (Arduino).

Esquema: Radio LCD con SI4703

Descarga de ficheros

El firmware y librerías que necesitas para programar el ATMEGA328P,  los puedes descargar desde el siguiente enlace: RDS_Radio_SI4703 (v1.2)

¿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