El experimento usa como sensor un puerto analógico/digital de un «arduino uno» para medir el voltaje del capacitor y el tiempo transcurrido desde el inicio del proceso de carga o descarga.
El concepto básico se aplica mediante un resistor y capacitor como el mostrado en el diagrama.
El valor de +V es de +5 Voltios, C = 220 μF y R = 1 kΩ.
Mediciones
El sensor entrega las mediciones del voltaje del capacitor como valores discretos en el rango [0, 1024), que son los valores discretos para el rango de voltajes [0, 5] en +V.
El dispositivo de medición entrega el tiempo transcurrido en microsegundos (μs) desde el inicio de evento de carga o descarga.
Los datos del sensor para la ejecución de un experimento se encuentran en el siguiente archivo de texto :
CargaDescargaDatos01.txt , cuyos datos se pueden procesar y graficar en cualquier software. El archivo contiene el número de muestra i, tiempo transcurrido y el valor de la medición, separados por comas (','
):
i, tiempo, valor 0,212,5 1,5560,3 2,10948,2 3,16388,4 4,21820,4 ....
Preguntas
- ¿Cuál es el valor de cada paso dy de en el eje y?,
Circuito de prueba con Arduino
Para las pruebas se usó un arduino uno con los valores de componentes mostrados en el diagrama esquematico.
Las mediciones de los voltajes del capacitor se realizan en el pin A0, que está en el bloque de entradas analógicas. El control de la carga se realiza con el pin 13 que pasa de estado alto +5V a estado bajo 0V, mientras que para la descarga se habilita el pin 11 para descarga más rápida con la resistencia R2. En el estado de carga el pin 11 pasa a un estado de alta impedancia, por lo que no afecta al circuito en general.
Como referencia se muestra el diagrama de conexiones físicas de los dispositivos.
El script de arduino usado en el arduino destaca los procesos de carga y descarga, asi como la escritura de los datos en el puerto serial.
/* carga y descarga de un capacitor, * Para el ejercicio C=220 microf, Rcarga=1 kOhm, Rdescarga=470 Ohm */ // Pines usados #define cargar 13 #define descargar 11 // descarga auxiliar #define medir 0 unsigned long t0; // tiempo inicio lecturas unsigned int valorsensor; void setup () { pinMode(cargar, OUTPUT ); // pin de carga pinMode(descargar, OUTPUT ); // pin de descarga auxiliar Serial.begin(9600); // envio dato serial } void loop(){ /* Descarga capacitor */ digitalWrite(cargar, LOW ); pinMode(descargar, OUTPUT ); digitalWrite(descargar, LOW ); t0 = micros (); // tiempo inicial valorsensor = analogRead(medir); while (valorsensor> 0) { Serial.print ( micros ()-t0); // tiempo transcurrido Serial.print ( "," ); Serial.println(valorsensor) ; valorsensor = analogRead(medir); } /* carga capacitor */ digitalWrite (cargar, HIGH ); pinMode(descargar, INPUT ); // pin auxiliar con alta impedancia t0 = micros (); // tiempo inicial valorsensor = analogRead (medir); while (valorsensor <1016) { // valor maximo de carga de 1024 Serial.print ( micros ()-t0); Serial.print ( "," ); Serial.println (valorsensor); valorsensor = analogRead (medir); } }
Lectura de datos con Python
Los datos de arduino se reciben en el computador por el puerto USB/Serial donde se encuentra conectado el arduino. Para el experimento se han tomado 500 muestras que luego se almacenan en el archivo de texto y se grafican los datos.
Para usar el código, será necesario verificar el puerto «com5» donde se encuentra conectado el arduino y los baudios usados para la transmisión de los datos. El puerto se revisa en el programa de arduino en el menú de herramientas/puerto cuando el arduino está conectado.
# Captura de datos desde puerto serial # Generados desde arduino uno import serial, time import numpy as np import matplotlib.pyplot as plt # PROGRAMA muestras = 500 puerto = 'com5' baudios = 9600 # Procedimiento # Inicializa comunicación con arduino arduino = serial.Serial(puerto, baudios) arduino.setDTR(False) time.sleep(0.3) # limpia buffer de datos anteriores arduino.flushInput() arduino.setDTR() time.sleep(0.3) print('\nEstado del puerto: ',arduino.isOpen()) print('Nombre del dispositivo conectado: ', arduino.name) print('Dump de la configuración:\n ',arduino) print('\n###############################################\n') # Captura datos datos = [] i = 0 while (i<muestras): while (arduino.inWaiting()==0): pass #esperar hasta recibir un dato linea = arduino.readline() # lee puerto serial lectura = linea.decode().strip() # elimina /r/n lectura=lectura.split(',') if (len(lectura)==2): tiempo = int(lectura[0]) valor = int(lectura[1]) undato= [i, tiempo, valor] datos.append(undato) print(undato) i=i+1 arduino.close() # convierte lista a arreglo datos=np.array(datos) # Salida np.savetxt('CargaDescargaDatos.txt',datos, fmt='%d', delimiter=',' ) plt.plot(datos[:,0],datos[:,2]) plt.title('Carga y descarga de capacitor') plt.xlabel('muestra i') plt.ylabel('valor[i]') plt.show()
La comunicación se inicializa limpiando el bufer de datos anteriores que pueden distorsionar la toma de los primeros datos. El estado de la comunicación se muestra en el mismo bloque.
La captura de datos convierte la lectura en el puerto serial, a formato numérico para ser anadido a los datos.
Al final se almacenan los datos en un archivo en formato texto y se grafica lo obtenido.
Referencia: https://www.arduino.cc/en/Tutorial/CapacitanceMeter