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 experimental DCF77

Construcción de un sencillo transmisor de 77,5 KHz, para poder poner en hora los relojes DCF77 que no reciban correctamente la señal del transmisor de Alemania. DCF77 es una estación de radio situada en Alemania, que transmite en onda larga (LW). Comenzó a funcionar como una estación de frecuencia estándar el 1 de enero de 1959, y a partir de junio de 1973 se incorporó en la transmisión la información de la fecha y la hora. La señal DCF77 utiliza la codificación de cambio de amplitud para transmitir información de tiempo, codificada digitalmente al reducir la amplitud de la portadora hasta un 15% de su nivel nominal durante 0,1 o 0,2 segundos, al comienzo de cada segundo. Una reducción de 0,1 segundos indica un 0 binario; y una reducción de 0,2 segundos indica un 1 binario.

En hora con DCF77

Diseño de un transmisor DCF77

A pesar de la gran precisión en frecuencia y fase con la que se transmiten las señales DCF77 desde el transmisor de Alemania, los relojes de uso doméstico no comprueban la información que reciben con tanta precisión.

Modulación en amplitud y fase del transmisor DCF77

Un reloj DCF77 sólo necesita recibir una portadora de 77,5 KHz, con amplitud variable al ritmo de cada segundo y la codificación de tiempo adecuada. Si colocamos un pequeño transmisor de 77,5 KHz en las proximidades de un reloj DCF77, la portadora podría tener una deriva en frecuencia de +/-300 Hz, no incluir la modulación en fase, y aumentar la profundidad de modulación en amplitud hasta el 100%. Así es posible transmitir la información DCF77 con una modulación ASK.

Modulación ASK

Todo esto facilita mucho la construcción de un transmisor experimental, que nos permita actualizar la hora de los relojes DCF77 que no estén situados en un lugar favorable para recibir las señales horarias desde el transmisor de Alemania.

Cobertura DCF77

Otra ventaja de disponer de un pequeño transmisor DCF77, es que podríamos utilizar estos relojes en lugares en los que nunca podrían funcionar… en América, Asia, etc.

Transmisor DCF77

Desde hace años estoy utilizando pequeños transmisores para sincronizar relojes DCF77, pero los dos transmisores que tengo están diseñados con algunos componentes electrónicos que actualmente son difíciles de encontrar. Por ese motivo voy a construir un nuevo transmisor DCF77, barato y muy sencillo de construir. El nuevo transmisor está construido a partir del microprocesador ATmega328P, utilizado en las placas de desarrollo Arduino UNO.

Esquema: Transmisor DCF77

El transmisor se encarga de generar la frecuencia portadora (77,5 KHz) y controlar su modulación, interrumpiendo la señal de RF (ASK). Con el fin de facilitar el transporte y ubicación en el lugar más favorable al reloj o relojes a sincronizar, el transmisor es de baja potencia y está alimentado con una batería de Li-ion (3,7V).

Interface: USB-RS232
Interface: USB-RS232

La codificación DCF77 la genera una aplicación para PC, y la envía al transmisor mediante el hilo RTS de un puerto serie. Actualmente ningún PC dispone de un puerto serie (DB9), pero es muy fácil y barato conseguir un interface USB-RS232.

 

(Actualizado: Septiembre 2020)

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

Software de control DCF77

Con el fin de poder programar y controlar el reloj LED de esfera rotante, he creado una aplicación para Windows (DCF77.exe),  la cuál también incluye la funcionalidad de generar  las señales DCF77. El software DCF77.exe puede controlar de forma simultánea el reloj LED de esfera rotante y el transmisor DCF77.

El software DCF77.exe lo puedes descargar de forma gratuita y con seguridad desde el siguiente enlace:  Install_DCF77.rar

New version in english: Install_DCF77_eng.rar

Caja para el transmisor

La caja se considera como un complemento de cualquier montaje electrónico, y además suele ser lo más laborioso de realizar, debido a su mecanizado. Actualmente es más fácil conseguir una caja a medida y mecanizada a buen precio, utilizando una impresora 3D.  El trabajo más laborioso es el realizar el diseño, pero una vez hecho, se pueden hacer todas las cajas que quieras sin la necesidad de perder más tiempo en realizar sus mecanizados.

Caja 3D: Transmisor DCF77

Los ficheros que necesitas para fabricar esta caja, los puedes descargar desde el siguiente enlace:

DCF77 experimental transmitter

¿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://www.pcbway.es/

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

PCB: TX_DCF77

Acceso a los GERBER de este PCB

PCB from PCBWay

Link of my shared project

 

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

Sensor de proximidad para invidentes

Construcción de un sensor de proximidad con Arduino, mostrando la información de la distancia en un display gráfico OLED de 0,96″. El display OLED que he utilizado es el SSD1306 y debería tener una resolución de 128×64 pixel, pero como en China ahorran por todas partes, el display muestra los gráficos con una resolución de 128×32… ¿50% de ahorro/estafa?.
Este sensor de proximidad incluye un avisador acústico, y podría ser muy útil como complemento del bastón guía para personas invidentes. En este caso no sería imprescindible instalar el display, y la autonomía de la batería sería mayor.

Medir la distancia por ultrasonidos

Utilizar un sensor por ultrasonidos para medir distancias con precisión no es lo más adecuado, pero puede ser de gran ayuda si se utiliza para detectar obstáculos cercanos. Este sensor podría utilizarse como ayuda al aparcamiento de un coche, aunque hay otros sensores más adecuados (capacitivos, ópticos), porque las cápsulas piezoeléctricas no están pensadas para trabajar en la intemperie. El uso más adecuado para este sensor sería montarlo en un equipo portátil, y utilizarlo como avisador de obstáculos cercanos para personas invidentes (podría utilizarse como complemento del bastón guía).

Sensor HC-SR04

El sensor de ultrasonidos HC-SR04 se puede comprar por menos de 1 dólar en Internet, y tiene un alcance aproximado de 4 metros y medio.

Sensor HC-SR04

Para ver la medida de la distancia he utilizado un diminuto display gráfico de 128×64 pixel, el modelo SSD1306, con  tecnología OLED.

Oled: SSD1306

Este circuito incluye un zumbador piezoeléctrico para realizar avisos acústicos de los objetos más próximos (imprescindible para invidentes).

Esquema: Detector de proximidad

El zumbador empezará a sonar de forma intermitente cuando haya objetos a partir de una distancia de 60 cms., y se irá acelerando la cadencia a medida que se acorta la distancia con el obstáculo. Este sonido intermitente se convertirá en continuo, cuando la distancia del obstáculo esté a 5 cms. o menos del sensor.

Resolución del display SSD1306

El display OLED SSD1306 que he utilizado en este montaje lo compré por Internet, y me ha llegado con ‘sorpresa’. El display incorpora un controlador gráfico de 128×64 pixel de resolución, el cuál controla el encendido de un display OLED de 128×32 pixel. Esto supone un 50% de pérdida de resolución, o visto de otra forma, es necesario enviar al display el doble de la información que va a presentar. Cuando el display muestra textos o números utilizando su font de caracteres, sólo se puede apreciar el problema cuando el tamaño de letra es 1. El problema es que si se carga un gráfico en memoria, se pierde un 50% de su resolución, y se pierde la fidelidad del gráfico por la pérdida de puntos. Observa en la imagen siguiente, que la altura en pixel de los caracteres es la mitad de la que debería ser, teniendo en cuenta que el direccionamiento del cursor si es el correcto.

Resolución SSD1306

 

El proceso que he seguido para cargar el gráfico, ha sido convertir la resolución del archivo original de 128×64 pixel a 128×32, luego corregir con un editor de dibujo los detalles más visibles (Paint o similar), y volver a redimensionar el gráfico a 128×64 pixel para poder utilizarlo en este display sin perder fidelidad.

Si utilizas un display con una resolución correcta (128×64), este último paso no lo tienes que hacer.

Programar gráficos en el display

Si quieres generar tu propio gráfico para que aparezca en el display, puedes sustituir el código del gráfico que yo he puesto por el tuyo. Para crear este código a partir de una imagen BMP,  la forma mas sencilla de hacerlo es mediante el software: LCD Assistant

Software: LCD Assistant

Firmware

El código de programación de este sensor de proximidad,  se puede descargar desde el siguiente enlace: Sensor de proximidad

Vúmetro RGB con ARDUINO

Construcción de un vúmetro LED RGB, controlado por Arduino. Este montaje consiste en un par de tiras RGB de un metro, con 30 LED SMD de tipo inteligente (WS2812) cada una. Este tipo de diodos incluye en su interior su propio controlador. Los diodos WS2812 disponen de una entrada de datos, la salida y los dos pines de alimentación. La información se transmite en serie, desplazando los datos de un pixel hacia el siguiente, y cada pixel utiliza 24 bit de información… 8 bit por cada color (RGB). El control de este vúmetro LED se realiza con Arduino. Micrófono amplificadoEl sonido se capta mediante un micrófono amplificado, de manera que no es necesario realizar ninguna conexión eléctrica entre el reproductor de audio y el vúmetro. Para facilitar el uso de este vúmetro en cualquier lugar, la alimentación de 5V se suministra con el módulo ‘Step Down-ConverterMP1584. De esta manera es posible alimentar este vúmetro con cualquier alimentador de continua, entre 6 y 28 voltios. Así podría utilizarse también dentro del coche, alimentado desde los 12V de la batería, y mostrar los efectos luminosos al ritmo del sonido del auto radio.

Tiras LED WS2812

Existen varios tipos de tiras LED RGB, pudiendo elegir la separación entre diodos y el grado de protección IP. Cuanto mayor sea el número de diodos LED por metro, mejor será el efecto luminoso que se pretenda mostrar (mayor resolución y brillo), pero el consumo también será mayor. Dependiendo del lugar donde se vayan a instalar las tiras LED, podremos elegir un grado de protección IP. El acabado IP67 permite utilizar estas tiras LED a la intemperie, protegiendo todos sus componentes electrónicos contra el agua y el polvo. Los consumos que se muestran en la tabla siguiente, son consumos máximos (cuando se encienden los tres colores de cada pixel a máximo brillo).

Las tiras LED WS2812 necesitan 3 hilos de conexión, 2 para la alimentación y 1 para datos. Las tiras LED se pueden cortar al tamaño que se necesite, y también se pueden ampliar juntando la salida de una de ellas con la entrada de otra. Cuando se vayan a utilizar tiras de gran tamaño, es importante conectar los hilos de alimentación con cable en varios puntos. Así se evitará la caída de tensión a lo largo de la línea, lo que provocaría un cambio de color y brillo sobre el color que se pretenda mostrar.

Conexiones tiras WS812

Descripción del circuito

Este vúmetro LED no necesita una conexión eléctrica con la fuente de sonido, facilitando así su uso y pudiendo mostrar efectos luminosos al ritmo del sonido de una sala, dentro de un coche, etc.. El sonido se capta por un micrófono de tipo ‘Electret‘, el cual se amplifica con un operacional, hasta conseguir el nivel necesario para excitar la entrada analógica del micro-controlador de Arduino ATMEGA328P .

En el esquema se muestra el montaje del micrófono y el amplificador operacional, pero también podría utilizarse un módulo SMD ya montado, el cuál se vende para el uso con Arduino, y conectar su salida de audio con la entrada A0 de Arduino. Para facilitar el uso de este vúmetro en cualquier lugar, la alimentación de 5V se suministra con el módulo ‘Step Down-ConverterMP1584.

Construcción del vúmetro

El circuito de control del vúmetro lo he montado en una placa de circuito impreso de tipo universal.

CPU: Vúmetro RGB

Posteriormente fabriqué una caja con metacrilato, haciendo la serigrafía con la CNC.

Vúmetro RGB: Módulo de control

A continuación se muestra el vúmetro LED funcionando.

Vúmetro RGB en pruebas

Firmware ARDUINO

El código de Arduino que he utilizado para este proyecto lo conseguí como un comentario en Internet. No conozco el autor del código, y por eso no figura su nombre en la cabecera. Este código, junto con la librería de control necesaria para el WS2812, se puede descargar desde el siguiente enlace: Vúmetro RGB

Reparación ARDUINO UNO

Sustitución del interface USB (ATMEGA 16U2) y del regulador de 5V (AMS1117), en el Arduino UNO. Localización de los componentes de Arduino UNO v3, siguiendo su esquema eléctrico. Descarga del software FLIP de ATMEL, y proceso de instalación en el PC. Recarga del fichero ‘flash’ correspondiente al Arduino UNO, en el nuevo chip (ATMEGA 16U2) que se ha sustituído. Comprobación de funcionamiento del módulo Arduino UNO, después de la reparación.

Esquema: Arduino UNO (v3)
Esquema: Arduino UNO (v3)

Para sustituir el chip ATMEGA 16U2 es necesario disponer de un soldador de aire caliente. Sin embargo, el regulador de 5V (AMS1117), a pesar de que es un componente SMD, podría sustituirse con un soldador para electrónica de tipo convencional.  Como podemos ver en el esquema anterior, el chip ATMEGA 16U2 es un micro controlador programable, y es necesario cargar un fichero  en su memoria ‘flash’ cuando se sustituye. Para programar la memoria ‘flash’ utilizaremos el software del fabricante ATMEL, el cual podemos descargar desde la página Web de MICROCHIP:

https://www.microchip.com/Developmenttools/ProductDetails/FLIP

Una vez que hayamos conectado el módulo Arduino con el PC, mediante su conexión USB. Podremos comprobar con el administrador de dispositivos de Windows si nuestro PC necesita el driver o ya lo tiene instalado. En caso de que tengamos que instalar el driver, lo haremos apuntando a la carpeta en la cuál hayamos instalado el software FLIP…

C:\Program Files (x86)\Atmel\Flip 3.4.7

Una vez que haya detectado el dispositivo nuestro PC, podremos cargar el archivo ‘flash’ que se corresponda con nuestro dispositivo Arduino (UNO, Mega, etc). El archivo que tenemos que cargar está en formato hexadecimal, y lo podemos encontrar en nuestro PC, dentro de la carpeta de Arduino

C:\Program Files (x86)\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial

Software: FLIP
Software: FLIP

Dentro de esta carpeta encontraremos varios ficheros, elegiremos el que se corresponda con nuestro dispositivo Arduino. Por ejemplo para el Arduino UNO, podemos cargar el fichero:

Arduino-usbserial-atmega16u2-Uno-Rev3.hex 

Puedes ver la reparación y todo el proceso de programación en el siguiente video: