Misure di alimentazioni con ESP8266

Usare l'unico ingresso analogico di ESP8266 con due sorgenti diverse.

In questo articolo vedremo come misurare il valore di tensione di due alimentazioni diverse facendo leva sull'unico ingresso analogico di moduli basati su ESP8266. Questo è utile nel caso ad esempio vogliamo monitorare sia l'alimentazione del microcontrollore che quella di un attuatore esterno, come ad esempio può essere il solenoide di un'elettrovalvola.

Introduzione

Come è noto ESP8266 ha all'interno un Convertitore Analogico Digitale (ADC) capace di trasformare una tensione variabile da 0 a 1 V in un numero compreso tra 0 e 1024 (1024 = 2^10 in quanto la risoluzione è a 10 bit).
Alcuni modelli di ESP8266 tra cui WeMos D1 Mini espongono questo PIN tramite uno dei suoi ingressi chiamato Analog PIN A0. 
Il collegamento non è diretto, ma è mediato da un partitore di tensione che consente di elevare la tensione misurabile fino ai classici 3,3 V:


Il partitore interno (resistenze R1 = 220 KΩ  e R2 = 100 KΩ) al Wemos D1 Mini serve infatti per ridurre la tensione di ingresso al ADC: 

3,3 V (Vin_A0 pin) --> 100 / (100 + 220) X 3,3 V ≈ 1 V (Vin_ADC)

Al netto degli errori nella conversione analogico-digitale, avremo quindi la possibilità di misurare facilmente una tensione esterna, con una semplice proporzione:

ExternalVoltage = ( ADC_value / 1024 ) x 3,3 V    

ADC_value rappresenta il risultato della conversione analogico-digitale. 

Partitore di tensione

Ma cosa succede se volessimo misurare un valore di tensione superiore ai 3,3 V?

In tal caso dovremmo "potenziare" il partitore di tensione interno che già normalmente abbassa la tensione esterna a quella presente ai morsetti del ADC.

Quindi inserendo un'ulteriore resistenza esterna (Radd) possiamo leggere tensioni superiori ai 3,3 V senza causare problemi al microcontrollore che continuerà a funzionare all'interno del range di tensione consentito.



Ad esempio per Radd pari a 1 MΩ, potremmo leggere tensioni esterne anche di 12V:

12 V (V_ext) --> 100 / (100 + 220 + 1000) X 12 V ≈ 0,91 V (V_ADC) < 1 V

Utilizzare più sorgenti esterne con unico pin A0 

Il fatto che ESP8266 abbia un unico PIN analogico potrebbe essere vincolante nel caso di utilizzo in situazioni reali per monitorare sensori o grandezze esterne. Del resto la comodità del WiFi integrato, ci fa spesso preferire l'utilizzo di questo interessante modulo in progetti IoT rispetto a microcontrollori con più elevato numero di PIN a disposizione.  

Per esempio spesso il modulo è utilizzato in progetti dove è presente una doppia alimentazione, una relativa al circuito logico del modulo stesso e un'altra che alimenta il circuito di potenza, come un'elettrovalvola o un motore.

In questo caso ci interessa misurare periodicamente le due tensioni di alimentazione in modo da monitorarne i consumi oppure auto bloccare il programma per evitare problemi dovuti all'insufficiente livello di carica.

Per il mio progetto di irrigazione automatica a batteria, ho utilizzato due transistor MOSFET collegati a ciascuna alimentazione da misurare. Il programma piloterà ciascun MOSFET alternativamente in modo che la misurazione della tensione fatta tramite PIN A0 sia fatta sequenzialmente.

Di seguito vediamo i collegamenti su breadboard:





Ho utilizzato per entrambi i rami, una resistenza Radd da 1 MΩ in quanto più che sufficiente per misurare una batteria da 9 V e un pacco da 3 batterie AA da 1,5 V.

Il MOSFET, funzionando come un interruttore, consente anche di tenere normalmente scollegata le batteria dal partitore di tensione e quindi di evitare il consumo elettrico da parte dello stesso circuito di misura.

Scelta del MOSFET 

Per la scelta del MOSFET, in particolare per dispositivi elettronici funzionanti a basso voltaggio (vedi i 3,3V di ESP8266), è importante che questi soddisfino particolari requisiti.

Occorre usare un MOSFET di tipo Logic che ha peculiarità diverse rispetto ai classici dispositivi MOSFET di potenza. 

Non è sufficiente per la scelta considerare esclusivamente la tensione di threshold tra GATE e SOURCE. Quando la tensione tra Gate e Source è superiore alla tensione di threshold, il dispositivo infatti è vero che inizia a condurre, ma la resistenza tra Drain e Source è ancora troppo alta. 

Occorre quindi considerare come significativi valori di VGS sufficienti a far transitare sufficiente corrente di DRAIN, ovvero quando la resistenza si riduce al valore RDS(ON).

E' quindi importante scegliere il MOSFET che vorremo comandare con i 3,3 V, in modo che il data sheet mostri quasi tutta la corrente nominale per questo valore di tensione.


Se avessimo usato un altro MOSFET tipo IRF520NPbF, ovvero quello presente nello starter kit di Arduino, non avremmo raggiunto il nostro obiettivo.  

Si vede infatti dal grafico di cui sotto che praticamente il MOSFET non conduce se collegato ai PIN di ESP8266 (IDS  0 A per VGS = 3,3 V), mentre lo può fare con i PIN di Arduino (IDS ≈ 5,5 A per VGS = 5 V)


 

Programmazione

Formula per il calcolo delle tensioni

Abbiamo detto che il valore della tensione deriva dal valore (qui chiamato rawvalue) di uscita del ADC:

Calibrazione

La costante 13,20 vista al punto precedente in realtà è valida solo dal punto di vista matematico.

Nella pratica il valore reale dipende dai resistori usati, dal cablaggio e dallo stesso transistor MOSFET, per cui va adattato al contesto.

E' utile procedere alla misura sul campo con un multimetro e adeguare il valore di questa costante confrontando, per entrambe le batterie, i valori misurati con quelli calcolati dallo sketch.

E' inoltre importante tenere in considerazione che, affinchè la misura condotta con l'ADC sia il più possibile accurata (in questo video è spiegato bene quali sono i limiti degli ADC usati nei moduli di sviluppo più comuni), il valore debba essere mediato su diverse iterazioni.

Conviene inoltre, sempre nell'ottica di rendere più accurata la misurazione, disattivare il WIFI responsabile di spike di corrente che la influenzerebbero negativamente. A questo scopo si può sfruttare ad esempio il funzionamento senza WIFI dopo un ciclo deep sleep per effettuare la misura.

Di seguito le funzioni utilizzate.

Funzioni

Le funzioni di seguito illustrate possono essere usate all'interno dello sketch. E' fondamentale che i PIN collegati ai GATE dei MOSFET abbiano lo stato tra di loro opposto in modo da alimentare il PIN A0 non nello stesso momento. 

Per lo sketch completo rimando ad un articolo successivo che riguarderà anche un caso di applicazione. 

Funzione per acquisizione tensione di alimentazione del modulo:

float Vbat_module_read() {
  unsigned int x;
  digitalWrite(mosfetpin1, LOW);
  digitalWrite(mosfetpin2, HIGH);
  for (int i = 0; i < 100; i++) {
    x = analogRead(A0);
    rawvalue = (x + i * rawvalue ) / (i + 1);
    VbatM = (11.03 * rawvalue / 1024.0); //11.03 Vs 13.20 as for multimeter read
    yield(); //to avoid watchdog(WDT) reset issue
  }
  if (VbatM < VbatmodMin) {
    Vbat_module_Flag = LOW;
  }
  digitalWrite(mosfetpin1, LOW);
  digitalWrite(mosfetpin2, LOW);
  return VbatM;
}
Funzione per acquisizione tensione della batteria del solenoide:
float Vbat_solenoid_read() {
  unsigned int x;
  digitalWrite(mosfetpin1, HIGH);
  digitalWrite(mosfetpin2, LOW);
  for (int i = 0; i < 100; i++) {
    x = analogRead(A0);
    rawvalue = (x + i * rawvalue ) / (i + 1);
    VbatS = (14.09 * rawvalue / 1024.0); //14.09 Vs 13.20 as for multimeter read
    yield(); //to avoid watchdog(WDT) reset issue
  }
  if (VbatS < VbatsolMin) {
    Vbat_solenoid_Flag = LOW;
  }
  digitalWrite(mosfetpin1, LOW);
  digitalWrite(mosfetpin2, LOW);
  return VbatS;
}
Conclusioni

Abbiamo visto come grazie a dei transistor MOSFET sia possibile gestire l'unico ingresso analogico di ESP8266 e quindi rimuovere un potenziale vincolo per i progetti.

In un post successivo vedremo come questo tornerà utile nell'impianto di irrigazione a batteria per tenerne sotto controllo l'efficacia e l'autonomia.

Resto a disposizione per eventuali richieste.

Commenti

Posta un commento

Post più popolari