Il blog di Nicola Amatucci

La mia finestra sul mondo…

Posts Tagged ‘Circuito RC

Arduino (Esperimento) – Calcolo del tempo di scarica di un condensatore

nessun commento

Un condensatore è componente in grado di accumulare e conservare la carica elettrica. Per rallentare il processo di carica, essa può avvenire attraverso un resistore (vedi circuito RC); il tempo necessario per la carica e quello necessario per la scarica, sono legati ad una costante di tempo che dipende dalle resistenze e dalle capacità in gioco. Nell’esperimento che vado ad illustrare, voglio che arduino mi dica la durata del processo di scarica di un condensatore.

La carica avviene attraverso un resistore, collegato al PIN 13, abilitato dalla pressione di un pulsante. Per tutto il tempo che il pulsante viene tenuto premuto, il condensatore si carica. Al rilascio del pulsante il condensatore si scarica attraverso un secondo resistore, collegato al PIN 11 e da esso abilitato. Inoltre, sull PIN 0 (INPUT ANALOGICO, dal lato dell’alimentazione) si potrà leggere il valore della carica. La situazione è quella rappresentata in figura.

circuito

I componenti necessari per questo esperimento sono:

  • un pulsante a quattro piedini (vedi Articolo)
  • 3 resistori da 10KOhm
  • 1 condensatore da 100uF (nel mio caso elettrolitoco 25Vdc

Una parte del circuito che andiamo a costruire è stato descritto nell’articolo precedente; l’altra parte deve invece realizzare in concreto quello che è rappresentato nella figura precedente.

schema

Premendo il pulsante, invece di accendere un led, come nell’articolo citato, carichiamo il condensatore, rendendo l’uscita sul PIN 13 alta. Quando il pulsante viene rilasciato, il PIN 13 non eroga più corrente (viene messo a basso) e viene attivato il PIN 11 e impostato al valore logico basso, comportando la scarica del condensatore.

100_1556

100_1560

Di seguito lo sketch relativo all’esperimento:

unsigned long pulsante_t0;
unsigned long pulsante_t;                                                                                                                                                                              

unsigned long condensatore_t0;
unsigned long condensatore_t;                                                                                                                                                                              

int value = 0;
boolean pushed = false;

void setup(){
  pinMode(11, INPUT);
  pinMode(13, OUTPUT);
  pinMode(9, INPUT);

  digitalWrite(13, LOW);  

  Serial.begin(9600);
  Serial.println("START");
}

void loop(){

 if (digitalRead(9))
 {
   //carica
   if (!pushed)
   {
     pulsante_t0 = millis();
     pushed = true;
     digitalWrite(13, HIGH);
   }
 }
 else if (pushed)
 {
   //scarica
   digitalWrite(13, LOW);

   pulsante_t = millis() - pulsante_t0;
   value = analogRead(0);

   pinMode(11, OUTPUT);

   //tempo di scarica
   condensatore_t0 = millis();
   digitalWrite(11, LOW);
   while(analogRead(0) > 0){}
   condensatore_t = millis() - condensatore_t0;

   pinMode(11, INPUT);  

   //stampo dati
   Serial.print("[V=");Serial.print(value);Serial.print("]");
   Serial.print("[Tp=");Serial.print(pulsante_t);Serial.print("]");
   Serial.print("[Tc=");Serial.print(condensatore_t);Serial.print("]");
   Serial.println("");

   value = 0;
   pulsante_t = 0;
   condensatore_t = 0;

   pushed = false;
 }
}

Nella funzione setup() notiamo la linea Serial.begin(9600) , che inizializza la comunicazione seriale con il computer (attraverso il cavo USB, nel nostro caso). L’invio di un messaggio da parte di Arduino, avviene attraverso le funzioni Serial.print() e Serial.println() (la seconda manda automaticamente il carattere di andata a capo) e noi possiamo leggere questi messaggi attraverso il “Serial Monitor” dell’ambiente di sviluppo.

serial_monitor

Nella parte bassa della finestra, potremo leggere i messaggi inviatici da Arduino.

Altre due funzioni interessanti sono:

  • millis() : permette di ricavare il tempo dall’avvio di Arduino in millisecondi (attenzione!!! va in overflow dopo 50 giorni di attività… sostanzialmente torna a zero…)
  • analogRead() : legge un valore da un ingresso analogico (uno dei 6 vicini al microcontrollore), restituendo un valore compreso tra ‘0′ e ‘1023′

Dopo l’invio del programma ad Arduino, avviando il “Serial Monitor” e premendo il pulsante per periodi di tempo variabile, si ottengono i seguenti risultati:

[V=902][Tp=3149][Tc=3143]
[V=483][Tp=652][Tc=2678]
[V=656][Tp=1078][Tc=2868]
[V=140][Tp=147][Tc=1970]
[V=94][Tp=96][Tc=1744]
[V=908][Tp=8335][Tc=3300]
[V=928][Tp=9971][Tc=3336]
[V=818][Tp=1788][Tc=3022]
[V=904][Tp=15295][Tc=3305]
[V=807][Tp=1723][Tc=3019]
[V=940][Tp=3292][Tc=3188]
[V=950][Tp=3988][Tc=3229]
[V=955][Tp=4037][Tc=3281]
[V=724][Tp=1303][Tc=2951]
[V=544][Tp=807][Tc=2746]
[V=593][Tp=939][Tc=2792]
[V=963][Tp=5090][Tc=3321]
[V=955][Tp=4280][Tc=3270]

 

Se cambiamo il resistore attraverso il quale il condensatore si scarica, con uno di 220Ohm, notiamo che il tempo di scarica diminuisce (dualmente per la carica – vedi τ del circuito RC):

[V=494][Tp=667][Tc=137]
[V=873][Tp=2758][Tc=170]
[V=849][Tp=2360][Tc=168]
[V=924][Tp=5035][Tc=180]
[V=921][Tp=3565][Tc=178]
[V=847][Tp=1927][Tc=162]
[V=937][Tp=3169][Tc=183]
[V=751][Tp=1412][Tc=156]
[V=964][Tp=6566][Tc=183]
[V=924][Tp=8871][Tc=184]
[V=970][Tp=8038][Tc=188]

 

LEGENDA:

  • V = valore letto al rilascio del tasto
  • Tp = tempo di pressione del tasto
  • Tc = tempo di scarica del condensatore

Written by Nicola

12 Agosto 2009 alle 23:51