Voltímetro con Arduino.

Voltímetro con LCD.

Creado por V. García. En Sept. 2015.

Introducción.

Una vez más asumimos que usted tiene un conocimiento básico adecuado de electrónica, de los circuitos digitales y cómo utilizar un Arduino. Ya que el aprendizaje de la electrónica consiste en un proceso paso a paso, que comprende tanto el trabajo con los circuitos electrónicos como la programación. Vamos a necesitar los siguientes componentes:

res1m res100k arduino
lcd2004a- placa_perforada_tiras tester-ice680r_

Fig. 1

Una fuente de alimentación que muestre la tensión y la corriente que consume un circuito bajo prueba es sin duda una fuente que nos proporciona unos datos añadidos que hace más fácil nuestro trabajo, lo cual no quiere decir que si no dispone de estos instrumentos no sea una fuente de calidad, en absoluto. Naturalmente que en el caso de disponer de estos elementos de medida, resulta más completa y compensa la diferencia de coste. Así que, este es el motivo de este artículo. Se trata de disponer de una pantalla de bajo costo que no muestre la tensión que esta entregando la fuente de alimentación y además si nos muestra la corriente que consume el circuito, mucho mejor y más completa.

En otro artículo que realicé decía: «Actualmente, gracias a las nuevas tecnologías, tomar una muestra de la tensión en un punto de un circuito, casi no influye en el funcionamiento de éste, ya que la alta impedancia de los circuitos que utilizamos nos hacen fácil este cometido.»

Un voltímetro mide la tensión entre dos puntos de un circuito, y con la electrónica digital actual, podemos realizar un verdadero voltímetro que podemos instalar en nuestra fuente de alimentación. Los voltímetros digitales funcionan mediante la conversión del valor analógico leído, a un valor digital mediante un convertidor analógico a digital (ADC). Nosotros vamos a utilizar un Arduino típico tiene varios de estos convertidores en él, con una precisión que será suficiente para este cometido, en este tutorial veremos cómo leer voltajes de entradas analógicas en Arduino y construir un voltímetro que mide voltajes (DC) en corriente continua.

Por supuesto que lo que nos interesa es medir los parámetros que se generan en la fuente ajustable. Para ser sincero he dudado en qué tipo de pantalla utilizar, ya que una pantalla del tipo Nokia-5110, quedaba pequeña para aplicar en una fuente de alimentación que generalmente está de forma estática en el laboratorio y por lo tanto quizás el tipo Nokia estaría mejor para un voltímetro portátil. Por eso vamos a utilizar una pantalla del tipo LCD de 2 líneas o en mi caso una de 4 líneas como es el LCD2004A que en la actualidad al igual que aquella es muy común.

El esquema.

El esquema es muy sencillo, ya que se reduce a un divisor de tensión básico el cual constituirá en si mismo la impedancia de entrada y cuya salida es la tensión que aplicaremos a un pin analógico. El esquema muestra el divisor ya que el resto no tiene relevancia.

voltimetroFig. 2

Del esquema podemos extraer unos conceptos importantes para el caso:

  • El divisor de tensión
  • Impedancia de entrada
  • Protección de entrada

Circuito Divisor Tensión.

Las entradas analógicas de un Arduino pueden medir hasta 5V (cuando se utiliza la tensión de referencia analógica incorporada). Incluso cuando sólo se conecta a un circuito de 5V, debe utilizar las resistencias para ayudar a proteger el Arduino de cortocircuitos o sobrecargas de tensión inesperadas.

Se trata de un sencillo circuito divisor de tensión que consta de dos resistencias (R1 y R2) en serie que, se encargan de dividir el voltaje de entrada, para adaptarlo a la ventana de tensiones que pueden leer las entradas analógicas del Arduino (5V).

El divisor entrega una tensión al pin analógico de Arduino que éste convierte en un formato digital que puede ser procesada por el microcontrolador. En este caso, la tensión entrada después de pasar por el divisor de tensión descrito (R1 y R2), se aplica al pin A0 (usted puede utilizar otro pin).

El circuito con los valores mostrados para R1 de 1MΩ en serie con R2 de 100KΩ representa una impedancia de entrada de 1MΩ + 100kΩ = 1’1M, que reduciendo es = 11, factor de división que es adecuado para la medición de voltajes de DC hasta aproximadamente 55V.

voltimetro03Fig. 3

El circuito mostrado divide el voltaje de entrada conectado al pin análogo Arduino, equivalente a la tensión de entrada dividido por 11, por lo tanto el máximo es de 55V ÷ 11 = 5V, por seguridad daremos un margen y podemos decir que es un voltímetro para un margen de 0-30V DC.

Principios de funcionamiento.

Impedancia de entrada.

Si un voltímetro tiene una baja impedancia de entrada baja, digamos 10kΩ y se está midiendo un voltaje a extremos de una resistencia de 10kΩ, el multímetro está cambiando efectivamente el valor de la resistencia a 5KΩ ( ya que dos resistencias de 10kΩ en paralelo = resistencia 5kΩ). Por consiguiente, el voltímetro ha cambiado los parámetros del circuito, y realmente, está leyendo una tensión errónea. Esas dos resistencias forman un divisor de potencial que se utiliza para bajar el voltaje que se mide a un nivel que Arduino pueda leer, además de ser la impedancia de entrada.

Un conjunto multímetro digital para medir voltaje DC típicamente tendrá una impedancia de entrada de 10MΩ o superior. Esto significa que la resistencia entre las dos sondas o terminales del multímetro es de 10MΩ o más.

Así pues, es deseable una alta impedancia de entrada para un voltímetro (o multímetro en la escala de voltaje). Cuanto mayor impedancia de entrada, menos probable es que el multímetro influya o cambie lo que esta midiendo del circuito. Al medir (con un multímetro que tiene una impedancia de entrada de 10 millones de ohmios) el voltaje a extremos de un componente en un circuito, es el mismo que la conexión de una resistencia de 10MΩ en paralelo con el circuito; no influye.

Así que, queremos una alta impedancia de entrada en nuestro circuito divisor de tensión, y que la impedancia de este «voltímetro» no vaya a influir en el circuito que se esté bajo prueba.

Sin embargo, como regla general, un dispositivo de alta impedancia de entrada será generalmente propenso a recoger más ruido o interferencias (EMI) que un dispositivo de baja impedancia de entrada, por ese motivo se debe adaptar un filtro de paso alto.

La fórmula para calcular los valores en un divisor de tensión es:

Por lo tanto, puesto que Arduino admite un Vmax de 5V en sus entradas analógicas, si el divisor está funcionando correctamente, entonces el Vout será de un máximo de 5V, y para poder calcular la tensión máxima de entrada al circuito usaremos:

Nota: Si utiliza resistencias de valores diferentes de los sugeridos aquí, debe recordar de ajustar los valores de R1 y R2 en el boceto, las resistencias deben ser del 1% de precisión si es posible o mejor. Usted puede ver una variación de esta expresión utilizada en la rutina de setup() del programa.

Voltímetro con Arduino

Utilizando el monitor Serial para mostrar los valores.

Con todos los cálculos completados, suba el código al Arduino y ya puede ver en el monitor el resultado. El valor v1 ahora representa la tensión real medida por el circuito, que se envía a la pantalla. Debería ver algo parecido a la imagen siguiente.

monitor_voltimetroFig. 4

Por supuesto que los valores de tensión que muestra, están cambiando de un modo que no se ajusta a lo que desearíamos. Cuando esto ocurre es debido en principio a unos motivos que debemos tener en cuenta: uno es debido al ADC que tiene Arduino por lo que no podemos hacer demasiadas cosas (también existe el factor ±1 dígito), otro motivo son las interferencias, para eso podemos dotar de un condensador cerámico de 10nf a 100nf, y otro motivo que si abordaremos más adelante, es dotar de un filtro de soft que tienda a reducir estos indeseados cambios.

sec3b1al_continua ruido

Ideal          Fig. 5          Ruido

Con el mencionado condensador reduciremos en parte los picos que se aprecian en la imagen anterior. De momento vamos a tener en cuenta los factores que debemos conocer y podemos abordar.

Precauciones.

Debemos tener en cuenta como alimentamos el Arduino, con baterías o por cable USB, es decir, si lo está por baterías u otra fuente aislada o por una una fuente a red, en cuyo caso, ambos deben compartir las tierras, lo que se llama masa común (GND) o una conexión a 0V con el circuito bajo prueba. Si la conexión de GND del Arduino se conecta a cualquier otra parte del circuito bajo prueba excepto GND, entonces esto es lo mismo que hacer un cortocircuito de ese punto del circuito a GND.

El GND del Arduino es como el cable negativo o común (COM) de un multímetro, algo que se debe considerar para ser conectado permanentemente al GND del circuito bajo prueba por seguridad, a menos que el Arduino o el circuito bajo prueba esté completamente aislado y «flotante».

Protección de entrada.

Los valores de resistencia en el diagrama del circuito anterior proporcionan cierta protección contra sobretensión en la medición de voltajes bajos como 5V, 9V o 12V. Así que, si accidentalmente se mide una tensión de digamos 30V, no va a estallar el pin de entrada analógica de Arduino.

Cualquier tensión superior a aproximadamente 55V puede dañar el Arduino. El punto de la red de resistencias divisoras conectada a la patilla analógica del Arduino es equivalente a la tensión de entrada dividido por 11, por lo que 55V ÷ 11 = 5V. En otras palabras, cuando se miden 55V, el pin analógico de Arduino estará en su máximo voltaje de 5V.

Proporcionar esta protección básica a sobrecarga de tensión es a expensas de no usar el rango completo del ADC de 10-bit de entrada analógica si solamente se van a medir voltajes inferiores, pero todavía se pueden medir los cambios de alrededor de 0.054V. Tener en cuenta que en el circuito, no se muestra ninguna otra protección para los picos de tensión, tensión inversa o voltajes superiores a 55V.

Como se ha mencionado, vamos a procurar un modo de reducir el salto de los valores, por lo que vamos a introducir una suma de valores y sacaremos la media para utilizar este valor como valor de lectura. Este es el programa que usaremos.

Lector de tensión

Lector de tensión, voltímetro versión 2

Cómo funciona el Código.

Para medir la tensión en la rutina loop(), utilizamos la función analógica analogRead(0), para leer la entrada analógica A0 en este caso. El valor que nos devuelve, es un entero dentro del rango de 0 a 1023, por dicho motivo lo debemos ajustar en la ventana de 0 a 5V que, es el margen de Arduino. Dicho valor leído lo multiplicamos por el nivel real de alimentación y lo dividimos por 1024. Proporcionamos algún tipo de filtrado sencillo, mediante la suma de 10 valores analógicos del pin A0 muestreado a intervalos de 10 ms.

Para una mayor precisión, se toman diez muestras analógicas usando el siguiente código:

while (sample_count <NUM_SAMPLES) {
suma + = analogRead (A0);
sample_count ++;  // incrementa la cuenta
}

El total de los 10 valores sumados, se almacenan en la variable suma. La variable de sample_count sigue la pista del número de muestras. Ambas variables se restablecen después de calcular y mostrar la tensión:

sample_count = 0;
suma = 0;

El número de muestras tomadas puede ser cambiado en la parte superior del boceto, en: #define NUM_SAMPLES 10. Sin embargo, no haga este valor demasiado alto o la suma de dichas muestras será demasiado grande para caber en la variable suma.

La tensión la calculamos de la siguiente forma:

voltaje = ((float) suma / (float) NUM_SAMPLES * 5.01) / 1024,0;

Un valor de calibrado se utiliza en lugar de 5,01 en el boceto de arriba (la calibración se detalla más adelante).

La suma de las 10 muestras se divide por 10 (NUM_SAMPLES) para obtener el valor medio.

Si 5.0 es la tensión de referencia de 5V ADC. El valor 1024.0 es el valor máximo que el ADC puede tener más 1 (1023 + 1 o sea, 2 a la potencia de 10 más 1) también se puede utilizar aquí 1023.0. Esto calcula la tensión dividida, por ejemplo el voltaje en el pin A3.

El voltaje real se calcula multiplicando la tensión leída, por el factor de división de la red del divisor de tensión (parece lioso), mejor con esta expresión:

La línea de código anterior calcula la tensión real y luego la envía al puerto serie para mostrar en la ventana del monitor de serie. El boceto utiliza un valor calibrado en lugar de 11,0 como se muestra arriba.

Tengamos en cuenta que por diferentes razones, se produce un error de medición en este medio de 1,5%.

Calibración del circuito y Arduino.

Podríamos obtener un voltaje más preciso mediante el uso de un voltaje de referencia de precisión para el ADC y además el uso de resistencias del 1% de tolerancia o mejores. Lo ideal sería un ADC mayor de 10Bits, si está interesado en el tema, puede visitar este sitio.

Veamos como calibrar la tensión ADC de referencia. Tenemos que medir los 5V del regulador del Arduino (que se encuentra en el pin 5V de Arduino). Este voltaje se utiliza para la tensión de referencia ADC de forma predeterminada en Arduino. Cada Arduino tiene un regulador de tensión es probable que sea ligeramente diferente para cada Arduino, debe ser calibrado de forma individual. Ahora pongamos el valor real medido 4.976V en el boceto de la siguiente manera.

En el ejemplo anterior, el voltaje medido en el pin de 5V Arduino era 4.976V.

Otra forma de obtener una lectura más precisa es calibrar el circuito. La calibración se puede realizar midiendo el valor real de la tensión de referencia y los valores reales de las resistencias del divisor de tensión. Estos valores pueden entonces ser utilizados en los cálculos en el código del boceto Arduino.

Conecte una fuente de alimentación estable, tal como una batería de 9V a través de la red de resistencias R1 y R2. Mida el voltaje a extremos de las dos resistencias conectadas a la batería, es decir, medir el voltaje de la batería. Ahora, mida el voltaje a extremos del resistor (R2) de 100kΩ es decir, entre el pin A0 (en Arduino) y GND.

El factor divisor de tensión se calcula dividiendo la tensión tomada a extremos de R1÷R2 por la tensión en A0 o sea:

Por ejemplo, si la entrada de voltaje medido es 10.02V y la salida (voltaje en el pin A0) es 0.91V, entonces el factor de división es:

Ahora, usaremos este valor en el código del boceto Arduino:

Si se utiliza la calibración, luego se pueden utilizar resistencias de tolerancia 5%, para el divisor de tensión.

Si cuando comparamos las lecturas de la pantalla LCD con las del Voltímetro digital de laboratorio, éstas no coinciden, no nos inquietemos, tomemos el multímetro digital de precisión y comprobemos la alimentación de 5V entre los pines 5V y GND de la placa Arduino. Podría ser que debido al USB, nos de menos (por ejemplo 4.98V), en ese caso, sustituyamos dicho valor del Vout = (valor * 5.0) / 1024.0 en el código del boceto (es decir, sustituir el valor 5.0, al de la lectura Vcc real, en este caso 4.98V). Además, tratemos siempre de usar resistencias de precisión del 1% de tolerancia para las resistencias R1 y R2.

Como ya se ha dicho, los valores de las resistencias (R1 y R2) en el diagrama del circuito, proporcionan cierta protección contra sobretensiones y puede medir voltajes bajos. Tenga en cuenta que cualquier tensión de entrada superior a aproximadamente 55V podría freír el Arduino. Sin incorporar otro tipo de protección en este circuito contra picos de tensión, tensiones inversas o voltajes más altos.

Mejorar el voltímetro.

El voltímetro que se ha presentado aquí es muy básico lo cual da un amplio margen para mejoras, como pueden ser: varias escalas para diferentes alcances, añadir una pantalla LCD que nos informe de los distintos valores de la tensión que está entregando en un momento dado, otra posibilidad es realizar el mismo proyecto en una pastilla más pequeña en lugar de usar el típico Arduino.

Como se ha dicho son varias las posibilidades de mejora, de modo que aquí sólo veremos alguna de esas opciones. Este es un ejemplo del código que vamos a probar.

Voltímetro DC.

Código de ejemplo para visualizar el voltaje, versión 3.

Con este ejemplo se ha mejorado algunas cosas, como se describe en el propio listado. Un paso importante es haber puesto a 0 la matriz readings[i], esto es una buena práctica ya que asegura la igualdad de valores. Otro punto es que dentro del loop(), como indica el comentario, se ha reducido una lectura total -= readings[index]; la última del bucle. Y por último, se ha realizado un bucle de 20 pasos para reducir los molestos incrementos de las cuentas hasta que se estabilizan.

En el párrafo anterior se han descrito unas mejoras que han servido para dar un aspecto más acabado a nuestro voltímetro. En los comentarios se da una idea del porque de cada rutina.


Fig. 6

Anexo 1.

Debido a las consultas recibidas para mejorar el código que se muestra más arriba, he tenido que revisar con atención y realizar un nuevo código que satisfaga las necesidades de los que se han decidido a construir un voltímetro con un LCD, así que sin más preámbulos, presento el código.

Si usted decide realizar este montaje tendrá la satisfacción de conseguir un voltímetro con muy buenas prestaciones.

Otras posibilidades.

Aunque no vamos a realizar un voltímetro para corriente alterna, si quiero dar una orientación para los que estén interesados en el tema. Para medir AC, en un voltímetro sin grandes pretensiones, como el estudiado más arriba, yo elegiría insertar un diodo entre la unión de las dos resistencias (ánodo) y el cátodo a la entrada de Arduino, con un condensador de bajo valor entre la entrada analógica y tierra, como se aprecia en la imagen que sigue:

voltage-dividerFig. 7

Suponiendo que la impedancia de entrada es razonablemente alta, incluso un pequeño condensador de 10nF, permitiría que el pico de voltaje AC a través del condensador pueda alcanzar la tierra. Utilice los cálculos originales R1 / R2 para el rango de tensión apropiado, pero no se olvide de la caída de tensión directa (0.65V) a través del diodo. A ser posible, utilice un diodo Shottky para reducir esta a 0.3V, si está tratando bajos voltajes.

Estoy preparando un nuevo artículo como ampliación del tema. Esto es todo por este momento, espero poder presentar una nuevo artículo más completo pronto.

Ayúdenos a mantener la comunidad en lo positivo y útil.
Sobre el tema, sea respetuoso con todas las edades y niveles
con la habitual responsabilidad.
Sea amable y no haga Spam – ¡Gracias!.

38 thoughts on “Voltímetro con Arduino.”

  1. Hola me he percarado de varios errores en los Voltímetro DC.
    Código de ejemplo para visualizar el voltaje, versión 3.
    Repasalo ya que no funciona el código.
    Pero corriegiendo los errores si que Complila perfectamente.
    No lo he montado ya que despues de ver los errores no parece que pueda funcionar bien.

    Saludos
    Cuidate mucho.

    1. Hola Copernico Andrade.

      Tienes cierta razón, no compila bien debido a un error de bulto en la línea 57, donde dice:
      if (index < =20) // para que no muestre los primeras lecturas
      Debe decir:
      if (index <= 20) // para que no muestre los primeras lecturas
      Un sutil espacio entre '<' y '=' que debes corregir para que compile sin errores. Lamento el error, ya está corregido. Saludos y cuídate.

  2. Muchas gracias por el post, tengo una pregunta, yo tengo un circuito que incluye un arduino nano y quisiera indicar cuando el circuito se le tiene que recargar la bateria, como podria lograr esto?
    Muchas gracias

    1. Hola Cesar.
      Esa es una buena idea, el problema que se presenta es relativo ya que se tiene que comparar dos tensiones a extremos de una ‘resistencia’ que indique si hay consumo y en que porcentaje se encuentra la batería. Esto se debe tratar con más detalle y realizando algunos cálculos que se requieren, por lo tanto, se trata de un artículo dedicado al tema.

      Saludos y cuidate.

  3. Se que paso tiempo desde esta publicación, pero es justo lo que estaba buscando. Quiero intentar convertir la lectura de voltimetro en un tacometro para la motocicleta. Tomando la señal que le llegaba al tacometro original desde la ECU. Creo que llega en voltaje la señal. de todos modos me gusto mucho el articulo, muy bien redactado para gente sin conocimientos profundos de electronica. muchas gracias.

  4. Hola muy buen post lo eh realizado y noto un problema al momento de realizar mediciones pequeñas por ejemplo pilas AA o AAA al medir con el mulltimetro me marca 1.3V y al usar el arduino me marca 1.1V es muy pequeña la diferencia pero pues se pierde presicion, y este problema desaparece en mediciones mayores a 5V donde la presicion es casi del 98% , a que se puede deber esa diferencia de lecturas?

    1. Hola Franco Chacon
      Es posible que se produzca un desvío de unos mV, debido a factores como ajustes de la formula a tu montaje sin embargo, ese desvío debería ser similar en toda la escala, es decir, si tu escala de tensión máxima es de 20V, el desvío debe ser aproximadamente igual en toda la escala. Si quieres hacer una prueba, considera realizar la formula para una escala menor, por ejemplo, 0 a 10V en esa escala puedes ajustar mejor las tensiones leídas, luego amplías la escala hasta los 15V y comparas los desvíos tratando entonces de ajustar denuevo la formula. De esta manera llegarás a un ajuste que te será de mayor precisión, pues, en muchas ocasiones el factor que más influye es la propia escala que es muy amplia, piensa que el convertidor AD de Arduino es muy sencillo y la precisión es relativa a este convertidor.

      Espero que te sirva esta aclaración y te ayude a mejorar tu voltímetro.

      Un saludo.

    2. Hola franco chacon.
      Siento mucho la tardanza en leer tu post, disculpa.
      La precisión es relativa a los componentes que utilizamos, de todos modos, también depende del rango en que hayas realizado la medida, trata de utilizar un rango más bajo y en último caso, revisa la formula del código para lograr una mayor precisión..

      Repito, siento el retraso en la respuesta.
      Saludos y cuídate.

  5. Hola

    Quería saber que significaba sampleBVal en Anexo 1 fila 37, que luego lo utiliza en la funcion sampleBVal = sampleBVal + val

    1. Hola Nacho, en respuesta a tu consulta te diré que:

      Para aplicar un valor a una variable (en este caso sampleBVal), primero declaramos la variable sampleBVal, en la cual depositamos el valor leído.

      Las variables pueden ser globales, las cuales las pueden ‘ver’ todas las funciones del programa y las variable locales que tan sólo se utilizan en la función en la que se haya declarado.

      En concreto sampleBVal quiere decir ‘muestra batería valor’ es castellano sería, muestra valor batería.

Responder a V. Garcia Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.