pedrinysergio
Usuario (Argentina)
Capacimetro con Arduino Importante.: El protoboard debe ser alimentado con 5V máximo .De lo contrario se puede destruir el display LCD.-El Arduino tiene regulador interno ,pero no el LCD.- El presente proyecto no pretende ser la base para la construcción de un instrumento para medir capacidades ya que actualmente en el mercado se obtienen aparatos con muchas mejores características y exactitud. Asimismo las lecturas son posibles desde las decimas de nanof hasta algunos cientos de microfaradios, debido a las limitaciones del Arduino No obstante se cree , que el mismo puede servir a los efectos educativos a los estudiantes de electrónica de todos los niveles.- Seguramente este prototipo puede ser mejorado y tal vez no este exento errores.- A continuación se describirán los fundamentos y las puesta en práctica con un Arduino nano y un protoboard Se uso además un display genérico de 2 x 16 y la librería correspondiente.- El funcionamiento está basado en una red RC como se muestra en la figura siguiente: Al aplicar tensión en to comienza la carga del capacitor de acuerdo a la conocida fórmula: Vc =Vo*(1-e^(-t/RC)) Cuya gráfica es la siguiente Para t=RC se tiene que la tensión a bornes del capacitor es del 63% de la tensión de alimentación y basado en esa premisa entra en acción el Arduino.- La idea es entonces aplicar un escalón franco a la red RC en un pin de salida y simultáneamente ir midiendo en un pin de entrada la tensión a bornes de C. Cuando se llega 63% se toma el tiempo transcurrido .- Justo allí se tiene que t es “una” constante de tiempo. Entonces se cumple que: t=RC o despejando C= t/R Se conoce “t” y para R se usó un resistor de 1.4 Mohm al 1% para mejorar la exactitud.- A continuación se muestra una fotografía del prototipo.- Toda la programación se colocó en la sección setup . y al mismo tiempo también se tuvo en cuenta que a iniciar se debe descargar el capacitor mediante un resistor de 220 ohmios y un diodo al pin de descarga ; para que su carga inicial sea nula y de esta forma tomar un tiempo correcto.- Por lo tanto el procedimiento para la lectura es colocar el capacitor en el proboard y pulsar el botón de reset para efectuar la lectura que queda fija en el display ya que; “void loop()” no tiene nada para hacer.- Seguidamente se presenta el código con algunas explicaciones .- Se presentan además las lecturas en un monitor serial si el Arduino está conectado a una PC.- Código #include <LiquidCrystal.h> // importa libreria dsplay lcd LiquidCrystal lcd (12, 11, 5, 4, 3, 2); // define pines para el display int pinlectura=0; // pin analogico para realizar la medida del voltaje a bornes del capacitor bajo prueba int pinpulso=13; // pin digital para carga del condensador int pindescarga=8; // pin digital para descarga del condensador float valorR=1.4; // modificar este valor de acuerdo al valor de resistencia a usar(preferiblemente al 1 %) en Megaohms unsigned long inicio; // define variable para t sub cero unsigned long delta; // define variable para t float microf; // Variable de coma flotante para asegurar la precisión, realiza cálculos float nanof; // Variable de coma flotante para asegurar la precisión, realiza cálculos void setup(){ lcd.begin(16, 2); // inicia un display de dos filas x 16 colomnas lcd.clear(); Serial.begin(9600); // inicializa la transmisión serie para debugging pinMode(pinpulso, OUTPUT); // configura pinpulso de salida pinMode(pindescarga,OUTPUT); // configura descarga de salida digitalWrite(pindescarga, LOW); // pone a 0 pin 8 para descarga de condensador a traves del resistor 220 ohms y el diodo delay(1000); // espera 1 seg digitalWrite(pindescarga, HIGH); // pone a 1 pin 8 para carga de condensador ya que de continuar en cero no haria posible la carga de C digitalWrite(pinpulso, HIGH); // pone a 1 pin 13 para carga de condensador inicio = millis(); // hace el tiempo igual a t0 ( te sub cero) while(analogRead(pinlectura) < 647){ // 647 es el 63.2% de 1023, el cual se corresponde con el voltaje // de fondo de escala } delta= millis() - inicio; // calcula constante de tiempo en milisegundos microf = ((float)delta/valorR )/1000; // calcula capacidad en microfaradios ya que R esta en megaohms nanof = ((float)delta/valorR ); // calcula capacidad en microfaradios ya que R esta en megaohms int nano=int(nanof); // hace entera la variable nano // el siguiente if es para mostrar lecturas en micro o nano faradios if (microf<1){ lcd.setCursor(0, 0); //ubica cursor lcd.print("Con de T"; // manda texto al display. lcd.setCursor(9, 0); //ubica cursor lcd.print(delta); // imprime constante de tiempo en display lcd.setCursor(14, 0); //ubica cursor lcd.print("ms"; // manda texto al display. lcd.setCursor(0, 1); //ubica cursor lcd.print("Cap:"; // manda texto al display. lcd.setCursor(4, 1); //ubica cursor lcd.print(nano); // imprime capacidad en nanoF en display lcd.setCursor(8, 1); //ubica cursor lcd.print("nF"; // manda texto al display. Serial.print("Constante de tiempo: "; // manda texto al display. Serial.print(delta); // imprime el valor por el puerto serie Serial.println(" mS "; // imprime las unidades y añade enter Serial.print("Capacidad: "; // manda texto al display. Serial.print(nano); // imprime el valor por el puerto serie Serial.println(" nFaradios"; // imprime las unidades y añade enter } else { lcd.setCursor(0, 0); //ubica cursor lcd.print("Con de T"; // manda texto al display. lcd.setCursor(9, 0); //ubica cursor lcd.print(delta); // imprime constante de tiempo en display lcd.setCursor(14, 0); //ubica cursor lcd.print("ms"; // manda texto al display. lcd.setCursor(0, 1); //ubica cursor lcd.print("Cap:"; // manda texto al display. lcd.setCursor(4, 1); //ubica cursor lcd.print(microf); // imprime capacidad en microf en display lcd.setCursor(10, 1); //ubica cursor lcd.print("microF"; // manda texto al display. Serial.print("Constante de tiempo: "; // manda texto al display. Serial.print(delta); // imprime el valor por el puerto serie Serial.println(" mS "; // imprime las unidades y añade enter Serial.print("Capacidad: "; // manda texto al display. Serial.print(microf); // imprime el valor por el puerto serie Serial.println(" micro Faradios"; // imprime las unidades y añade enter } } void loop(){ //nada para hacer }
Hola a todos Este es mi nuevo y humilde proyecto que pongo a consideración de todos los taringueros.- Se trata de un simple frecuencímetro con un Arduino nano.-(Puede ser cualquier Arduino!!) Por ahora esta poco desarrollado . pero seguro se puede mejorar.- Para comenzar use en 555 funcionando como astable con un resistor multivueltas para poder variar la frecuencia y usarlo como generador de pulsos.- No voy a explicar aquí el funcionamiento de este versátil integrado ya que hay mucha información al respecto.- Para señales no cuadradas se puede conformar la misma con una bascula de Smith y luego atacar al Arduino.- Estuve mirando por la web varios proyectos pero no vi ninguno que se apoyara en mi idea Que se me ocurrió?? Usar la función pulseIn.- La misma devuelve el tiempo en micro segundos del largo de un pulso ; ya sea que pase de 0 a 1 o de 1 a cero. Y ..... efectivamente eso es lo que me hace falta !!! Si puedo medir esos dos tiempos , llamemos tiempo 1 y tiempo 2 tengo el periodo y por consiguiente la frecuencia . Sencillo no ??? Por lo tanto me puse manos a la obra y desarrolle un skecth muy simple que prácticamente no necesita explicación. La salida se hace por el monitor serial ; pero seria sencillo usar un LCD Lo he probado a distintas frecuencias obteniendo; creo yo ; una una aceptable exactitud , que obviamente depende de lo certera que pueda ser la función pulseIn().- Debido a que no tengo a mi alcance un frecuencimetro de laboratorio lo que hice fue usar una de las versiones del osciloscopio con la placa de sonido ( bastante limitado !! ) solo hasta los 20 Khz . Pero bueno ; es lo que tengo a mano , para poder comparar las medidas dadas por el arduino con algo !!! Muestro solo un ejemplo de 50 Hz . Vale aclarar que no tiende nada que ver con la frecuencia de la red. Solo tome ese valor que me daba el 555 en ese caso !! Ademas debido a las características de la función seguramente este proyecto no pueda medir mas allá de algunos Khz. Pero si pensamos que podemos hacer una adaptación relativamente sencilla para convertirlo en un tacómetro ; se podrán tener lecturas de rpm con aceptable exactitud.- Adjunto algunas capturas de pantallas.- A continuación va el código: --------------------------------------------------------------------------------------- unsigned long duracion1; unsigned long duracion2; void setup () { Serial.begin(9600); } void loop () { duracion1 = pulseIn (2, HIGH,100000000); duracion2 = pulseIn (2, LOW,100000000); Serial.println(); Serial.print("periodo 1: "; Serial.print(duracion1); Serial.print("ms"; Serial.println(); Serial.print("periodo 2: "; Serial.print(duracion2); Serial.print("ms"; //Serial.println((duracion1+duracion2)/1000);// periodo //Serial.println((duracion1)/1000);// periodo //Serial.println((duracion2)/1000);// periodo Serial.println(); Serial.print("frecuencia: "; Serial.print(1000000/(duracion1+duracion2)); //frecuencia Serial.print("Hz"; Serial.println(); delay(1000); } -------------------------------------------------------------- Observen se las similitudes de ambas medidas !!!! Bueno creo que no queda nada por comentar . No hago diagrama del proyecto ya que es muy simple solo hay que armar el astable con el 555 . La salida del mismo (pata 3 ) se conecta al pin digital 2 del arduino con una resistencia de 1K o similar.- Les animo a armarlo en un protoboard y probarlo. Ademas serán bienvenidas las sugerencias o correcciones .