Elaboración de un Voltímetro:

Alumno:

Franco González juan Ignacio

Planteamiento del problema:

La idea de crear un voltímetro, surge de la necesidad de tener un circuito capaz de medir el voltaje que se recibe entre un rango de valores de 0 a 50v utilizando Arduino y C#.

Introducción:

Para empezar con el desarrollo del dispositivo, es necesario primeramente definir lo que es un voltímetro: instrumento que sirve para medir la diferencia de potencial entre dos puntos de un circuito eléctrico.

Teniendo esa definición podemos decir que crearemos un dispositivo capaz de medir el voltaje de una fuente de poder cualquiera en un rango de 0 a 50v e inclusive poder apreciar la oscilación entre sus valores si es que la hubiera.

El circuito que utilizaremos para poder hacer nuestro voltímetro es el siguiente:

resistencias-voltimetro

 

En esta imagen, se aprecia que se necesitaran dos resistencias: un potenciómetro, que ayudara como resistencia de 9 kΩ ya que funcionara como una resistencia variable, que al momento de realizarlo en físico, se tendrá que ajustar para que de la cantidad ya mencionada, además utilizar una de 1 kΩ para completar el circuito, no sin antes poner entre medio de ambas un cable directo a la placa de arduino que ira directamente al puerto 3 del análogo, que programaremos para poder medir la señal de la fuente de poder que ira conectada directamente al potenciómetro y no olvidarse de poner la tierra del otro lado saliendo de la resistencia de 1 kΩ para completar nuestro circuito.

Con estas especificaciones, ya podemos pasar a la fase de desarrollo.

Desarrollo: 

Para empezar a  poder desarrollar nuestro voltímetro utilizando Arduino y C#, primeramente hay que realizar una práctica donde se aplicaran los mismos principios y poder hacer algunas pruebas del funcionamiento; utilizar un potenciómetro como fuente a medir y una serie de 10 leds que prenderán o apagaran según vayan variando los datos que sean leídos por el arduino desde el potenciómetro, para esta primera práctica, se desarrollo el siguiente código para nuestra plataforma arduino:

——————————————-PROGRAMA DE ARDUINO———————–

int val,j=2;

void setup(){

  Serial.begin(9600);

  for(int i=2;i<12;i++){

      pinMode(j,OUTPUT);

  j++;

}

}

void loop(){

val = analogRead(3);

  int j =0;

  for (int i=2;i<11;i++){

    if(bitRead(val,j)==1){

       digitalWrite(i,HIGH);

    }else{

      digitalWrite(i,LOW);

    }

  j++;

  }

  delay(100);

  Serial.println(val);

}

————————————-FIN PROGRAMA ARDUINO——————————

Teniendo este circuito funcionando a la perfección, podremos pasar a la siguiente fase del desarrollo, que será ahora incorporar el lenguaje c#, el cual nos servirá para interactuar con nuestro circuito final y poder mostrar en una grafica en la computadora la oscilación de los valores de voltaje o mostrar en que lugar de nuestra escala se encuentra el voltaje medido. No sin antes hacerle algunas modificaciones al programa de arduino para que quede de la siguiente manera:

int val;void setup(){Serial.begin(9600);}void loop(){

 

val = analogRead(3);

val = val / 4;

 

delay(100);

Serial.write(val);

 

}

 

La secuencia de pasos a seguir una para realizar este programa, se explican a continuación:

  • Primeramente es necesario declarar una variable, en la cual se guardara el dato a leer del puerto análogo, esta variable se declara de forma global en la parte de arriba de todo el código.
  • Después, dentro del ciclo setup(), configurar la velocidad con la que se recibirán los datos.
  • El siguiente paso es dentro del ciclo infinito void loop(),  donde se declara la línea val=analogRead(3); para especificar que a la variable val se le asignara el valor leído del puerto 3 análogo.
  • Para finalizar, se mandara el valor de la variable utilizando el puerto serial y la función write, no sin antes poner una instrucción delay(100); para retardar un poco el proceso dentro del ciclo.

Nota: la línea val=val/4; se explicara mas adelante, pero si es necesario incluirla.

A continuación, mostramos el código realizado en c# donde se recibirá el dato enviado anteriormente por el arduino, el código quedaría así:

La secuencia de pasos para la realización del código en c#, se muestra a continuación:

  • Primeramente, se utilizan varios using, los cuales generalmente se agregan al empezar por default, el único que en este caso necesitarías agregar es el using System.Drawing;
  • Para empezar a codificar, declaras las variables a utilizar.
  • Antes de seguir programando, nos ubicamos en la parte grafica de nuestro programa para poder arrastrar los elementos que se usan y son: un pictureBox, un Serial.Port, un label y un button. Ya que tenemos estos elementos, pasamos a la parte del código a empezar a modificarlos; para crear un evento del  Serial. Port, también podemos dar doble clic sobre el (estando en la parte grafica) y automáticamente lo generara en el código y nos direccionara para esa ventana. Se inicializara muy fácil, ya que solo le agregaremos el método donde se desarrollara todo el grueso del código del programa y en este caso será la siguiente línea: leer();
  • Con esa línea, probablemente c# nos empiece a marcar en rojo o un error en dicha línea, ya que el método de “leer()” no se ha inicializado, lo cual haremos en las siguientes líneas:

public void leer(object sender, EventArgs e)

{

Graphics graf = pictureBox1.CreateGraphics();

byte[] buffer = new byte[2];

serialPort1.Read(buffer, 0, 1);

val = Convert.ToInt32(buffer[0]);

  • En las líneas anteriores, se puede ver que además creamos un objeto de tipo Graphics llamado “graf” donde le asignare la creación del pictureBox1 así: = pictureBox1.CreateGraphics(); además, en las siguientes líneas inicializamos un arreglo de byte de nombre buffer que se utilizara para almacenar los datos que se recibirán del arduino con la línea serialPort1.Read(buffer, 0, 1); donde utilizamos el método Read y le agregamos el arreglo anterior,         ya por ultimo le asignamos a la variable “val” el valor de buffer en su posición cero, no sin antes convertirlo a un valor de tipo entero.
  • El programa seguirá con una condición de la variable “cont” para saber si es igual a cero y si es así, entonces se declarara lo siguiente: graf.Clear(Color.Black);

graf.DrawLine(new Pen(Brushes.White, 1), new PointF(0, 1), new PointF(650, 1));

graf.DrawLine(new Pen(Brushes.White, 1), new PointF(0, 25), new PointF(650, 25));

  • La primera línea, hacemos uso de graf, que se declare anteriormente y después el método clear donde agregamos el color negro; las siguientes dos líneas, nos servirán para darle valores a nuestra grafica y poder definir en que cantidad se encuentra el valor del voltaje medido y se repetirá la misma instrucción en 11 ocasiones y solo se modificara el ultimo valor que le ingresemos a la instrucción new PointF(0, 1), ya que eso nos servirá para darle la separación necesaria entre línea y línea graficada.
  • Despues de cerrar la condición anterior, se abrirá otra mas con las siguientes líneas de código:

if (cont < 650)

{

x0 = cont;

y0 = aux;

x1 = cont + 1;

y1 = 275 – Convert.ToInt32(val);

graf.DrawLine(new Pen(Brushes.Red, 1), new PointF(x0, y0), new PointF(x1, y1));

cont++;

aux = 275 – Convert.ToInt32(val);

}

else

{

cont = 0;

}

  • Aquí se declarara una condición igual con la variable “cont” pero ahora siendo menor a 650, para que no sobrepase el numero de pixeles que contiene la grafica creada anteriormente, dentro se le asignara el valor a las variables x0, y0, x1 y y1, donde se les darán los valores para poder graficar el voltaje leído, se puede apreciar el uso de la variable aux, la cual tendrá como función respaldar el valor anterior ya graficado y a y1, se le dará el siguiente valor recibido desde el arduino que se tiene en la variable “val”, esto con la idea de que la línea sea continua y no solo se grafiquen puntos, el cual anteriormente a esto, era un problema que se presentaba, que fue subsanado de esa manera. La penúltima línea es donde le asignaras las variables(x0, y0, x1, y1) y le das la instrucción de que una dichos puntos por medio de una linea. Esta condición contendrá instrucción else, la cual nos servirá para modificar el valor de cont, para que si el valor no entra en el rango anunciado, sea cambiado a cero y comenzar el proceso de nuevo.
  • Ya por ultimo, agregar las siguientes líneas:

private void btn_stop_Click(object sender, EventArgs e)

{

            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }

}

private void btn_start_Click(object sender, EventArgs e)

{

            if (!serialPort1.IsOpen)
            {
                serialPort1.Open();
            }

}

}

}

  • Estos eventos, están relacionados con los botones ya creados, los cuales solo te servirán para detener (primer evento) o empezar/reanudar (segundo evento), la lectura de datos con el serialPort1 anteriormente definido.

 

El código finalmente quedara de la siguiente manera:

=======================================CODIGO    C#=========================================

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Voltimetro
{
    public partial class Form1 : Form
    {
        int  val = 0;
        int cont = 0, x0, y0, x1, y1, aux=255;
        double volt=0;
        public Form1()
        {
            InitializeComponent();
            serialPort1.Open();
            serialPort1.DataReceived += new    System.IO.Ports.SerialDataReceivedEventHandler(puerto);
        }
        private void puerto(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                this.Invoke(new EventHandler(leer));
            }
            catch
            {
            }
        }
        public void leer(object sender, EventArgs e)
        {
            try
            {
                Graphics graf = pictureBox1.CreateGraphics();
                int valorPunto=0;
                byte[] buffer = new byte[2];
                serialPort1.Read(buffer, 0, 1);
                val = Convert.ToInt32(buffer[0]);
                volt = Convert.ToDouble(val) / 255 * 50;
                txtVoltaje.Text = Convert.ToString(volt);
                if (cont == 0)
                {
                    graf.Clear(Color.Black);
                    graf.DrawLine(new Pen(Brushes.White, 1), new PointF(0, 20), new PointF(650, 20));
                    for (int j = 1; j <= 5;j++)
                    {
                        valorPunto = (255/5)*j + 20;
                        graf.DrawLine(new Pen(Brushes.White, 1), new PointF(0, valorPunto), new PointF(650, valorPunto));
                    }
                }
                if (cont < 650)
                {
                    x0 = cont;
                    y0 = aux;
                    x1 = cont + 1;
                    y1 = 275 – Convert.ToInt32(val);
                    graf.DrawLine(new Pen(Brushes.Red, 1), new PointF(x0, y0), new PointF(x1, y1));
                    cont++;
                    aux = 275 – Convert.ToInt32(val);
                }
                else
                {
                    cont = 0;
                }
            }
            catch
            {
            }
        }
        private void btn_stop_Click_1(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
        }
        private void btn_start_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.Open();
            }
        }
        private void cerrar(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                }
                DestroyHandle();
            }
            catch
            {
            }
        }
    }
}

=======================================FIN CODIGO    C#=========================================

 Pantallas

voltimetro-pantalla

 Configuración de los elementos Basicos

El pictureBox1 se le asignan las siguientes dimensiones:

650px de ancho y 280 de Altura.

El serialPort1 en el portName se le asigna el puerto que el sistema haya asignado al dispositivo del Arduino en este caso fue COM4.

Los Name de cada elemento se muestra en la siguiente imagen.

Elementos-principales

Cabe mencionar, que después de someter el código a varias pruebas, encontramos algunas fallas en el potenciómetro, el cual fue cambiado en 2 ocasiones, además de que nuestro programa nos generaba un problema, el cual era que cuando el potenciómetro mandaba su valor máximo (5v), la gráfica nos mostraba 4 veces lo mismo y fue arreglado en el programa realizado en arduino, ya que solo dividimos entre 4 el valor que estábamos pasando hacia el sistema hecho en c#, además, el otro error que tuvimos al momento de realizar nuestro sistema, fue que solo estábamos graficando puntos, no lográbamos que la gráfica fuera constante entre un anterior valor leído y el siguiente, el cual fue subsanado utilizando una variable auxiliar que nos sirviera como una especie de buffer donde se guardara el dato anterior y entonces si se pudiera conectar por medio de una línea con el siguiente.

 

Ya que el sistema no nos arrojaba ningún error y si graficaba los valores enviados por el potenciómetro, pasamos a realizar en físico el circuito mencionado en la introducción, el cual ya seria nuestro voltímetro propiamente dicho, ya contamos con la parte lógica y nos haría falta combinarla con la parte física del voltímetro que quedo de la siguiente manera:

imagenvoltimetro1

 

Conclusión:

Ya por ultimo, solo hace falta realizar unas cuantas pruebas para poder darnos cuenta que el voltímetro se ha realizado con éxito y que si logra hacer lo que nosotros nos planteamos en un principio en nuestro problema; en la siguiente imagen podemos apreciar el circuito donde estamos midiendo el voltaje del cargador de una laptop y donde vemos la gráfica en realizada con éxito por la computadora.

imagenvoltimetro2

 

Descargue el proyecto en visual C# aquí. Voltimetro

25 thoughts on “Voltímetro con Arduino y C#

  1. Guillem Mestre

    Muy buen proyecto seguro que nos ayudara muchisimo. Pero podrias poner como es el codigo en c# completo o seguido? es que entre comentario y comentario (muy buenos por cierto) debe faltar cosas ya que no compila. Si quieres tambien puedes colgar el proyecto se agradeceria. Muchas gracias y un saludo.

    1. admin Post author

      Te pido una disculpa, al copiarlo y pegarlo se perdió un pedazo de código.
      modificaré de inmediato el POST.

      muchas gracias por tu comentario.
      Saludos

    2. admin Post author

      Allí esta corregido Amigo, espero y te sirva, le hice unas modificaciones, pero te puse pantalla de creación del formulario con los componentes básicos. SALUDOS

      1. Diego

        Hola saludos!te iba hacer una pregunta en tu programa de c# el mide de 0 a 50 voltios y si yo quisiera que solo midiera de 0 a 15 voltios solo cambiaria la linea” volt = Convert.ToDouble(val) / 255 * 50;” ese 50 por un 15 ?como el valor maximo de medicion?

      2. Diego

        El programa para q Silva de 0a15 voltios sería solo cambiarle la línea donde aparece el 50!

        1. admin Post author

          hay que modificar el circuito
          para que midas de 0 a 15v
          y en el programa efectivamente tienes que modificar
          Convert.ToDouble(val) / 255 * 15

  2. sam

    Excellent!! Thank u!!!
    I wish many people like u

  3. Fabian

    Amigo una pregunta, el programa me tira un error no encuentra el COM1 como hago para solucionarlo muchas gracias.

    1. Fabian

      ya solucione mi error, y de dos maneras muchas gracias

  4. Montserrat

    Disculpa, ¿Qué función tiene el dipswitch y la resistencia?

    1. admin Post author

      Ya estaban en el proto, no tiene nada que ver con la practica, les pido una disculpa.

      saludos

  5. Alexxleo

    Buenas noches, estoy tratando de ejecutar toda la instruccion pero no lee nada, utilize todo proyecto completo sin modificar nada y no me funciona que puede ser?

    1. Alfonso Brito Post author

      lo mas seguro no has configurado el PUERTO el COM, checa que numero de COM esta usando tu Arduino y posteriormente configuralo en C#.
      puedes probar desde el administrador de hardware, en puertos. o en el mismo IDE de arduino.

      1. Alexxleo

        Buen día le cambie el puerto com que le corresponde y nada solo flashes el LED rx cuando precio no los botones no da nada uso visual studio 2010

    2. Alfonso Brito Post author

      checa lo anterior primero, saludos

  6. Alexxleo

    Estoy probando en el programa de Realterm y si corre pero en c# no corre me podran decir por favor

  7. Alexxleo

    Buen dia, ya resolvi el problema que tenia, resulto que me falto en la inicialización en c# las siguientes lineas

    serialPort1.DtrEnable = true;
    serialPort1.RtsEnable = true;

    Espero y les sirva

    1. Alfonso Brito Post author

      Muchas gracias Alex por tu aportación
      Un saludo desde Sinaloa

  8. Fer

    Hola, sabes como hacer la conexion de c# a arduino?
    quiero hacer un programa de en c sharp, en el cual mediante graficas genere el codigo arduino y despues lo compile y lo carge…

    1. Alfonso Brito Post author

      Pues no lo he hecho pero si podría, pero la vdd no lo he intentado. estaría bien ese proyecto.

  9. Sergio

    Si quisiéramos hacer el voltímetro para medir hasta 400 voltios como podríamos hacerlo, antes de nada gracias por el proyecto que me parece fabuloso.

    1. Alfonso Brito Post author

      la resistencia de donde se mide de 1Kohms es la misma, nada mas cambia la primera a 79kohms.
      checa la Resistencia total de mi circuito se calcula así Rt=400V/5v=80 5 es al voltaje que deseas medir, osea cuando tengas 400v a fuerzas tu voltaje de medición debe ser el total osea 5V. Esta operación te da 80, que son los Kohms que ocupas. y porque Kohms, para bajar la intensidad a milis. entonces tu resistencia a Medir (la que va al arduino) debe ser de 1Kohms y la que mide hasta los 400v es de 79Kohms.

      considero lo siguiente antes que nada, por el circuito debe de llegar una intensidad de 5mA por lo tanto la resistencia de donde medimos siempre sera de 1Kohms, porque si multiplicas la intensidad por la resistencia obtendrás voltaje, y el voltaje maximo que puede leer Arduino o un uMicro es su puerto de ADC o analogo es de 5v.

      si aplicas la formula de ley de ohms–> Vr=I*R = 5mA * 1Kohms = 5v.

  10. Franco

    Buenos días,

    Quería saber en que tengo que modificar el circuito para poder armar un voltímetro de 0 a 20 V pero con una entrada de corriente de un máximo de 500 mA.

    ¿Y en el código que cambiaría?

    Desde ya muchas gracias.

    Saludos.

    Franco.

    1. Alfonso Brito Post author

      La resistencia Total debe de ser de 4Komhs, dejando la resistencia de 1K como aparece en el circuito, de tal manera que la resistencia de 9Kohms se sustituiria por una de 4Koms (potenciomentro). y cambiaria en el programa nada mas la relación en la multiplicación

      busca esta linea::::
      volt = Convert.ToDouble(val) / 255 * 50;
      sustituye 50 por 20
      volt = Convert.ToDouble(val) / 255 * 20;

      Saludos

Leave a reply

required