Capacimetro sencillo con Arduino

El profesor Juan Manuel Mercadín comparte este proyecto que permite construir un capacimetro utilizando solamente una placa Arduino Uno. En el siguiente vídeo nos explica como funciona y nos brinda detalles del desarrollo y su implementación.

Medición de la resistencia de pull-up interna

Para poder conocer al valor de la resistencia interna de pull-up del pin 13 del Arduino es necesario utilizar una resistencia de valor conocido. Además hay que cargar el siguiente programa en la placa:

// Definiciones
#define Lectura A0    // Pin de lectura de tensión del divisor
#define R_ext 9.89    // Valor de la resistencia externa expresada en kilo ohms
#define Pin_R_pull_up 13  // Pin de la resistencia de pull up interna

// Variables
float R_pu = 0.0;  // Variable para guardar el valor de la resistencia de pull up interna


void setup() {
  Serial.begin(9600); // Inicializo el monitor serial
  pinMode(Pin_R_pull_up,INPUT_PULLUP);// Pongo el pin 13 como entrada con resistencia de pull up
}

void loop() {
  R_pu = (float)((1023*R_ext)/analogRead(Lectura) - R_ext); // Calculo el valor de la resistencia interna de pull up
  Serial.print("La resistencia de pull-up interna vale: "); // Imprimo texto
  Serial.print(R_pu);                                       // Imprimo el valor de la resistencia de pull up
  Serial.println("k");                                      // Imprimo texto
  delay(1000);                                              // Espero 1 segundo
}

Esquema para medir la resistencia pull-up interna:

Montaje del proyecto

El circuito propuesto es muy simple ya que no requiere de componentes externos. Se puede colocar algún zócalo o pinzas tipo cocodrilo para agilizar el conexionado del capacitor. Recuerden que es necesario que el capacitor a medir esté descargado antes de conectarlo.

El código fuente completo del capacimetro es el siguiente:

// Definiciones de pines
#define carga 13    //Pin 13 para cargar el capacitor
#define descarga 12 //Pin 12 para descargar el capacitor 
#define tension A0  //Pin A0 para realizar las mediciones de carga

// Definiciones de constantes
#define resistencia 37.61       // Resistencia del pull-up interno expresada en kilo ohms del arduino, pata 13
#define capacitor_parasito 3.15 // Capacitor parasito

// Variables
long tiempo = 0;              //Guarda el tiempo de carga
float capacitor = 0.0;        //Guarda el valor de capacidad
float capacitor_micro = 0.0;  //Guarda el valor de un capacitor en micros
float capacitor_mili = 0.0;   //Guarda el valor de un capacitor en milis

void setup() {
  Serial.begin(9600);       //Inicializo el monitor serial
  pinMode(descarga,INPUT);  //Pin de descarga como entrada de alta impedancia
}

void loop() {
  pinMode(carga,INPUT_PULLUP);      //Pin de carga como entrada con pull-up
  tiempo = micros();                //Guardo el instante de tiempo
  while (analogRead(tension)<648);  //Mido hasta llegar al 63% de tensión, o sea 1 TAU
  tiempo = micros() - tiempo;       //Obtengo el tiempo transcurrido
  pinMode(carga,INPUT);             //Pin de carga como entrada con pull-up
  pinMode(descarga,OUTPUT);         //Pin de descarga como salida
  digitalWrite(descarga,LOW);       //Activo la descarga
  capacitor = tiempo/resistencia;   //Calculo el valor de capacidad
  if (capacitor >= capacitor_parasito)  // Ingreso si el valor de capacidad es mayor al de la capacidad parasita
  { 
    if (capacitor < 1000)               //Pregunto si es menor que 1 micro
    {
      Serial.print("El valor del capacitor es: ");  //Imprimo texto
      Serial.print(capacitor);                      //Imprimo el valor de capacidad en nF
      Serial.println("nF");                         //Imprimo texto
    }
    else
    {
      if (capacitor < 1000000)          // Pregunto si es menor que 1 mili
      {
        capacitor_micro = (float) capacitor/1000;   //Paso a la unidad de uF
        Serial.print("El valor del capacitor es: ");//Imprimo texto
        Serial.print(capacitor_micro);              //Imprimo el valor de capacidad en uF 
        Serial.println("uF");                       //Imprimo texto
      }
      else
      {
        if (capacitor <= 4700000)       // Limito las lecturas a 4,7 mF
        {
          capacitor_mili = (float) capacitor/1000000; //Paso a la unidad de mF
          Serial.print("El valor del capacitor es: ");//Imprimo texto
          Serial.print(capacitor_mili);               //Imprimo el valor de capacidad en mF 
          Serial.println("mF");                       //Imprimo texto
        }
        else
        {
          Serial.print("El valor del capacitor es muy grande");//Imprimo texto
        }
      }
    }
  }
  else
  {
    Serial.println("El valor del capacitor es: 0nF");         //Imprimo texto
  }
  while(analogRead(tension) != 0);    //Espero hasta que se descargue por completo el capacitor
  pinMode(descarga,INPUT);            //Pongo el pin de descarga en alta impedancia
  delay(1000);                        //Espero 1 segundo
}

Agradezco a Juan por permitir la publicación de su proyecto completo para que puedan construirlo y experimentar.

Juan Manuel Mercadín es ingeniero y técnico electrónico. Actualmente se desempeña como docente en la ciudad de Mar del Plata y desarrolla dispositivos electrónicos.

Más artículos sobre capacitores