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/

Reparación y programación CPU-SMD

Reparación y programación del firmware en una CPU de tipo SMD. Comprobación del estado de las soldaduras del microprocesador, con la ayuda de un microscopio.

Microscopio para electrónica

Con el paso del tiempo, todos los dispositivos electrónicos han ido adoptando la tecnología SMD,  pudiendo así integrar más funciones en espacios pequeños y reduciendo notablemente sus costes de fabricación. Al mismo tiempo, las herramientas de trabajo para electrónica han ido evolucionando, siendo necesario el uso de lupas de aumento, cuando se necesita inspeccionar el estado de las soldaduras de los componentes SMD en el circuito impreso. La alternativa a la lupa, es utilizar un microscopio que consiga mantener un buen foco y calidad de la imagen, dejando la distancia suficiente entre la óptica y el PCB para poder realizar trabajos de soldadura.

Inspección de la CPU con el microscopio

Microscopio para electrónica, con GearBest

Reparación de una CPU con tecnología SMD

Un fallo muy común en cualquier dispositivo electrónico, es una soldadura fría o una pista del circuito impreso abierta. A pesar de que esta CPU nunca ha funcionado, ya que se trata de un montaje nuevo, siempre es aconsejable comprobar que todos sus componentes electrónicos sean del valor adecuado, y que todas las soldaduras estén bien hechas.

CPU vista en el microscopio

La mejor forma de comprobar si una soldadura está bien hecha o no, es mover el componente electrónico mientras se observa el punto de soldadura. Cuan se trata de componentes de tipo SMD, es necesario utilizar un alfiler o punzón bien afilado para mover los terminales y comprobar que no se muevan.

Pin desoldado

En el siguiente video se muestra todo el proceso a seguir, para comprobar y programar la CPU de un reloj digital con tecnología SMD.

Barra LED de señalización para bicicletas, con ATtiny

Construcción de una barra LED, para la señalización trasera en bicicletas, patinetes, etc. El circuito es muy simple y tiene muy pocos componentes electrónicos. Esta barra LED está construida con 5 LED de alta luminosidad, y está controlada con el pequeño procesador ATtiny (ATtiny 25/45/85 de 8 pines). La barra LED está alimentada con una batería de 3,7v (Li-Ion), pero también podría alimentarse con 2/3 pilas en serie de 1,5V.

Iluminación trasera en bicicletas

Luz trasera para bicicletasPor seguridad, cuando se circula con una bicicleta en zonas de baja luminosidad, es muy importante disponer de una buena iluminación trasera.  Por otra parte, es imprescindible señalizar cualquier cambio de dirección cuando se circula con tráfico. Como el ancho de una bicicleta es muy reducido, sólo se necesita un punto de luz, y es muy fácil integrar las luces de cambio de dirección construyendo una barra LED.

Luz intermitente secuencial

 

Al montar las luces de cambio de dirección junto con la iluminación trasera, es aconsejable que la identificación del sentido de giro sea clara, sin crear confusión por estar integradas en una sola barra. La mejor manera de hacerlo es creando una animación con las luces, igual que lo hacen algunos modelos de coche de alta gama.

Barra LED para señalización de bicicletas

El circuito de control está basado en el pequeño micro controlador ATtiny. Debido al número limitado de pines de conexión (8 pines), el modo de funcionamiento se determina en la fase de arranque. Así es necesario desconectar la alimentación del circuito cada vez que necesitemos cambiar su modo de funcionamiento: Luz trasera / Luz de dirección. Utilizando otro modelo de micro controlador con más pines, como el ATmega, se podrían integrar ambas funciones y ampliar el número de LED en la barra.

Programar el ATtiny

La programación del ATtiny se puede hacer con Arduino, mediante el interface ISP.

Programar ATtiny

Shield programador ATmega/ATtiny (ARDUINO)

Firmware

El código de programación de esta barra LED,  se puede descargar desde el siguiente enlace: Luz trasera para bicicletas

Shield programador ATmega/ATtiny (ARDUINO)

Diseño de un Shield programador ISP para la tarjeta de desarrollo Arduino UNO. Este programador es compatible con los micro-controladores: ATmega 48/88/168/328P de 28 pines, y con los ATtiny 25/45/85 de 8 pines.

Shield programador ISP

Este montaje es una modificación del programador ISP para micro-controladores ATmega, que mostraba aquí:

ARDUINO a fondo… no te lo pierdas!!!

KT002 Arduino UNO R3 Starter Kit 

Programador ISP para ATmega/ATtiny

Haciendo una pequeña modificación sobre el programador ISP de ATmega, podemos hacer que sea compatible con los micro-controladores de 8 pines ATtiny.

Pinout ATtiny

Si observamos la distribución de los pines de los micro-controladores ATtiny, podemos comprobar que si los insertáramos en el zócalo del programador del ATmega (28 pines), posicionando el pin 1 del ATtiny en el pin 9 del programador ISP, apenas tendríamos que realizar 2 cambios en el circuito para poder programarlos.

Montaje: Programador ISP

  1. El pin 12 del programador ISP lo podríamos conectar directamente a la línea GND, necesaria para alimentar el ATtiny cuando lo estamos programando… y la conexión del pin 12 a GND del ATmega no afecta a su programación.
  2. En el pin 9 del programador ISP tendremos que poner un pequeño conmutador, mediante la posición de un puente, para conectar el cristal de cuarzo cuando tengamos que programar un ATmega. Cuando tengamos que programar un ATtiny, el pin 9 del zócalo habrá que unirlo con el pin 1 (cambiando la posición del puente)… ya que el pin 9 del zócalo se corresponde con el pin 1 del ATtiny = Reset (ver el esquema anterior)

Shield para Arduino UNO

Con la construcción de un PCB hecho a medida de la tarjeta de desarrollo  Arduino UNO, se consigue hacer un programador mucho más compacto y versátil.

Esquema + PCB: Programador ISP

Así no sería necesario realizar la conexión con puentes entre ambas placas, cada vez que quisiéramos utilizar nuestro Arduino UNO como programador.

¿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, y es la empresa PCBWay es un fabricante de circuitos impresos en China. Puedes encargar tus diseños – PCB Low Cost – que yo he elegido en esta ocasión.

Logo: PCBWay

https://www.pcbway.com/

Esta empresa, aparte de ser grande y tener muy buenos precios, dispone de un apartado en su Web para alojar los diseños y poder compartirlos.

https://www.pcbway.com/project/shareproject/

Link of my shared project: 

PCB from PCBWay

ARDUINO a fondo… no te lo pierdas!!!

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

Programador ISP, con Arduino UNO

Contenido

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

ATmega328P / ATmega8A

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

Esquema de bloques: ATmega8A

Esquema de bloques: ATmega328P

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

Comparativa: ATmega328P / ATmega8A

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

Boot Loader

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

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

Boot-Loader ARDUINO

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

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

Fusibles en una memoria PROM

Secciones de la memoria FLASH

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

Sección de la aplicación

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

BLS – Sección del cargador de arranque

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

Secciones de lectura sin escritura y sin lectura mientras se graba

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

La principal diferencia entre las dos secciones es:

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

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

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

RWW – Sección de lectura mientras se escribe

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

NRWW – Sección sin lectura mientras se escribe

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

Bits de bloqueo del cargador de arranque (Boot Loader)

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

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

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

Bits de bloqueo

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

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

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

SPM – Self-Programming Mode

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

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

Programador ISP con Arduino UNO

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

Esquema: Programador ISP

Funcionamiento del programador

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

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

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

Autoprogramación

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

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

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

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

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