Sensore di livello troppo pieno per liquidi polari con PIC12F

Il progetto in questione è nato perchè lo scenario in cui mi sono trovato è il seguente: un sistema riempie una tanica con un liquido e periodicamente è necessario svuotare questa tanica per evitare che il liquido in essa tracimi e allaghi l’ambiente circostante. Questo accade perchè la tanica non è immediatamente visibile in quanto rinchiusa in un mobile. Capita quindi spesso che non ci si accorga che il recipiente sia troppo pieno.

Il liquido con cui viene riempita la tanica è polare (costituito per l’80% da acqua), per cui ho pensato da subito ad un sensore di tipo conduttivo: si posizionano in cima alla tanica due elettrodi (chiaramente che non possano essere corrosi dal liquido che devono controllare). Un elettrodo viene posto a potenziale alto. Quando il liquido entra in contatto con l’elettrodo, la corrente scorrerà nel liquido (che è polare, quindi capace di trasmettere corrente) e l’altro elettrodo la capta e la invia ad un sistema di misura per fare tutte le sue elaborazioni.

Per queste cose non può essere assolutamente utilizzata una corrente continua dal momento che causerebbe elettrolisi, per cui viene utilizzata una corrente alternata.

Mi scuso per l’imprecisione più volte segnalata. In realtà in questo progetto non viene utilizzata una corrente alternata, bensì una corrente “pulsata” (un’onda quadra che va da 0 a 5V). Anche una corrente pulsata causa elettrolisi, ma in un tempo minore. Dal momento che questa è una segnalazione di allarme, si presuppone che non si lasci il sistema continuamente in allarme con la sonda in conduzione.

Ho chiaramente pensato da subito ad un PICmicro come cuore del sensore e la scelta è ricaduta su un minuscolo PIC12F675 o PIC12F629 (che sono anche decisamente sovradimensionati per lo scopo ma questi avevo nel cassetto). Lo schema elettrico è il seguente:

Il pic12F675 invia un segnale ad onda quadra (a 50Hz, ma magari si possono fare degli esperimenti su quale frequenza sia più adatta) sul pin n°7 (GPIO0) tramite un mosfet a canale N (BS170). Sul drain del mosfet è collegata una resistenza di pullup e il primo elettrodo della sonda. Il mosfet mi serve quindi unicamente a garantire un certo isolamento tra il picmicro e il liquido e a fornire un certo quantitativo di corrente se necessario.

Il pin6 viene configurato come ingresso analogico (AN1). Dal secondo elettrodo della sonda viene prelevato il segnale trasmesso nel liquido, raddrizzato tramite diodo e condensatore, e quindi misurato e confrontato con il livello di tensione impostato dal trimmer da 10KΩ collegato sul pin n°5, configurato anch’esso come ingresso analogico (AN2).

La sonda è costituita semplicemente da due asticelle in metallo (io l’ho realizzata con due pezzi di elettrodo per saldatura acciaio inox), separati tra di loro con materiale isolante e collegati al cavo con due mammut: 

Nel momento in cui su AN1 viene rilevata una tensione accettabile (dal confronto con AN2 e dopo 32 misurazioni successive di cui viene fatta la media), il led collegato al pin2 si accende, ma… la condizione di allarme non viene ancora innescata!

Se dopo 3 secondi (modificabili via firmware), la condizione di attivazione persiste in maniera continuativa, allora viene innescato l’allarme e fatto suonare il cicalino collegato sul pin3, pilotato tramite un transistor NPN a bassa potenza. Il cicalino deve essere del tipo attivo (cioè deve suonare in maniera autonoma quando gli viene applicata una tensione continua di 5V).

Il cicalino continuerà a suonare anche se la condizione di allarme viene rimossa (ovvero: gli elettrodi non sono più in contatto con il liquido), questo per questioni di sicurezza: per segnalare che “qualcosa è successo” anche se ciò che ha causato l’allarme è scomparso. La condizione viene ripristinata premendo il pulsante di reset collegato al pin4.

Il circuito l’ho realizzato su un pezzetto di millefori su cui ho incluso anche un regolatore da 5V (non presente sullo schema elettrico) dal momento che lo andrò ad alimentare con un alimentatore da parete da 9 – 12V, ed è presente uno screw terminal a 4 posizioni per collegare alimentazione e cavo della sonda:

Il pic viene fatto funzionare con l’oscillatore interno (non settabile su questo pic e fisso a 4MHz) e utilizzo l’interrupt sul Timer0 impostato per scattare ogni millisecondo.

Nell’interrupt service routine accade questo:

  • genero l’onda quadra a 50Hz sfruttando un contatore che inverte lo stato di GPIO0 ogni 10mS
  • controllo se è stato settato il flag di allarme per fare in modo che il buzzer anzichè suonare di continuo suoni ad intermittenza
  • avvio il contatore di ricontrollo se è stato rilevato contatto col liquido, per fare in modo che soltanto dopo 3 secondi di contatto continuativo possa essere innescata la condizione di allarme, evitando falsi allarmi

La funzione settings(), come trovate solitamente nei miei software, esegue tutte le impostazioni del picmicro (ho aggiunto anche delle righe inutili, come ad esempio lo spegnimento del modulo comparatore, giusto per avere sottomano righe di codice nel momento in cui andremo a riscrivere un firmware che magari ne avrà bisogno).

Nel main eseguo semplicemente la lettura prima di una porta analogica e poi dell’altra. I valori di una singola porta sono sommati in una variabile integer senza segno. Arrivati a 32 misurazioni mi fermo e trovo il valore medio: avendo già la somma non mi resta che dividere per 32, e la cosa più intelligente da fare è chiaramente eseguire un bitshift verso destra di 5 posizioni (2^5 = 32) anzichè eseguire la divisione aritmetica per 32. Quindi capite perchè ho scelto proprio 32 e non un altro numero. Avrei potuto scegliere 64 per avere una misura ancora più precisa (ma anche più lenta), ma ipotizzando di rilevare tutte misurazioni al massimo della risoluzione  (10bit=2014) la somma in un integer non ci sarebbe stata.

Se il valore misurato sulla sonda è maggiore o uguale a quello impostato dal trimmer, accendo il led e attivo un flag che avvia tutta una routine per controllare se entro 3 secondi questa condizione permane. Se la condizione permane senza interruzioni, allora si attiva il flag di allarme, che è indipendente dal led di segnalazione. Il pulsante di reset azzera tutti i contatori e il cicalino.

La taratura è semplicissima: si immerge la sonda nel liquido da controllare, al livello massimo per noi accettabile, e si gira il trimmer nel punto in cui il led di segnalazione si accende. Se il led già si accende nell’immersione, giriamo il trimmer fino a che non troviamo il punto in cui basta poco per farlo spegnere e quindi riaccendere. Chiaramente non conta la dimensione della tanica: in questo tipo di misurazione è importante unicamente la distanza tra i due elettrodi: più saranno distanti, più il liquido opporrà resistenza al passaggio di corrente.

Di seguito ci sono delle misurazioni fatte all’oscilloscopio. In giallo è riportato il segnale misurato sull’elettrodo che invia l’onda quadra e in azzurro il segnale presente sull’elettrodo di misura. L’immagine seguente riporta i segnali misurati sui due elettrodi in aria libera:

come potete notare mi ritrovo degli strani spike sull’elettrodo di misura, che non riesco a spiegarmi, e seguono anche l’andamento a 50Hz del segnale di misura, probabilmente sono disturbi induttivi causati dal cavo del sensore troppo lungo? A vuoto difatti sul pin di misura ottengo una tensione di quasi 3V (e questa situazione non è ottimale: vedi edit a fine articolo). Di seguito sono invece riportati i segnali misurati con la sonda immersa nel liquido:

Come vedete sono quasi perfettamente sovrapponibili.

Download

Questo è il primo progetto qui su settorezero che fa utilizzo del nuovo ambiente di mamma microchip: MPLAB X, e del nuovo compilatore XC8. Prima o poi dovevo convertirmi anch’io all’utilizzo dei nuovi strumenti e devo dire la verità, ho trovato tutto organizzato in maniera migliore anche se c’è ancora molto da lavorare. Se non siete ancora passati dal vecchio MPLAB IDE al nuovo MPLAB X e dai vecchi compilatori C ai nuovi XC, vi conviene farlo al più presto. Io ho trovato molto utili le guide che ha scritto il buon amico Mauro: MPLAB X , il nuovo IDE della Microchip e Il nuovo compilatore XC 8. Ho fatto anche un esperimento, qualche mese fa, in cui il classico programma del led che lampeggia, mi occupava meno spazio in memoria col nuovo compilatore.

Il progetto è preimpostato per il PIC12F675 e il PICKit2. Per far comparire il progetto in MPLAB X dovete estrarlo nella cartella MPLABXProjects (a me, che utilizzo windows7, si trova in C:\Users\Gianni\MPLABXProjects). Deve comparire una cartella chiamata “Level_Sensor.X”. A questo punto potete aprire MPLAB X e il progetto vi compare nella finestra dei progetti. Nel file zip non è riportato lo schema, che potete prendere qui dall’articolo.

Questo è il firmware della prima versione, l’ho lasciato per motivi didattici. Dopo il paragrafo di edit c’è la nuova versione che sfrutta un sistema di controllo più accurato.

Overfill Sensor (288 download)

EDIT del 20/08/14

Ho modificato il firmware del sensore dal momento che sfruttando l’ingresso analogico era anche possibile rilevare falsi positivi dovuti ad interferenze sul cavo di misura (come avevo già notato e ho mostrato con la seconda immagine catturata dall’oscilloscopio). Ho quindi adottato un sistema completamente diverso che rende il sensore più efficace e completamente immune ai disturbi: configuro il pin6 come ingresso digitale rilevando proprio il segnale ad onda quadra trasmesso nel liquido, che come abbiamo potuto notare, è perfettamente sovrapponibile a quello trasmesso e non soffre di disturbi. Ho anche inscatolato il tutto e messo etichette realizzate con la Dymo e nastro nero su trasparente:

Lo schema elettrico va quindi modificato in questo senso: eliminare tutta la circuiteria collegata al pin5 dal momento che non ci serve più  (abbiamo quindi anche un pin libero in più!). Sul pin 6 andremo quindi ad eliminare sia il diodo che il condensatore e metteremo una resistenza da 1KΩ in serie al pin (da pin verso sensore) e un’altra da 10KΩ dal pin verso massa per forzare l’ingresso digitale a livello logico basso.

Qui c’è il nuovo download:

Overfill Sensor (versione 2) (231 download)

E qui un video che mostra il funzionamento del sensore:



Questo articolo ti è stato utile? Ti ha permesso di risolvere un problema o di migliorare le tue applicazioni? Ci lavori? Ti ha permesso di scrivere la tua tesina? Ti ha semplicemente fatto spendere un po' del tuo tempo in maniera costruttiva? Allora clicca il banner qui sotto:


Settorezero.com è un blog personale di Giovanni Bernardo aperto dal 25 Ottobre 2007. Non è una testata giornalistica né un sito a carattere commerciale.
Settorezero.com, il logo Zroid™ e la tagline "Play embedded electronics™" sono copyright ©2007÷2019 Giovanni Bernardo.
La navigazione su settorezero.com e la fruizione dei contenuti ivi presenti sono soggette ai seguenti Termini di utilizzo - Informativa sulla privacy - Utilizzo dei Cookie.
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche.
Per poter contattare il gestore del sito potete utilizzare la sezione contatti o inviare una email a gianni[at]settorezero[dot]com.
Per seguire gli aggiornamenti del blog Settorezero, oltre al feed RSS, puoi anche seguire la pagina Facebook o iscriverti al canale Telegram.
Su Twitter, invece, pubblico un po' di tutto e, quando mi va, uso anche Tumblr - Google+ - Blogspot - Youtube.