Il progetto che stiamo per discutere ha certamente bisogno di un'interfaccia utente più accattivante, tuttavia funziona molto bene. Si tratta di un esperimento condotto da Tuomas Nylund con sensori capacitivi per verificarne la funzionalità quando connessi ad un singolo pin di un ADC.
Solitamente, quando si sceglie di utilizzare sensori di contatto capacitivi, è necessario utilizzare chip differenti; tuttavia, grazie ad alcuni "trucchi", è possibile comunque utilizzare un normale micro-controllore per svolgere questo lavoro, anche utilizzando un solo pin ed un resistore.
La libreria attualmente fornita da Atmel per l'utilizzo di sensori capacitivi sui loro micro controllori va sotto il nome di QTouch. Sebbene disponibile, sfortunatamente non si tratta di un progetto open source; questo non è stato, per Tuomas Nylund, un grosso problema. La documentazione è stata sufficiente per iniziare da subito a sperimentare. Come accennato in apertura, la libreria supporta l'utilizzo di un singolo input all'ADC e di un resistore per rilevare il segnale proveniente dal sensore.
L'approccio al problema ha richiesto a Nylund di fare alcune ricerche sulla teoria che sta dietro l'utilizzo ed il funzionamento di questi sensori; certamente la procedura potrebbe non essere la stessa utilizzata da Atmel ma i risultati dimostrano, dicevamo, che funziona molto bene.
Con questa immagine vogliamo mostrare la semplice configurazione circuitale da implementare.
Qui il condensatore, sulla sinistra, rappresenta proprio il sensore che ha la forma di un piccolo pad circolare. In teoria sarebbe necessario che il segnale passi attraverso un resistore prima di andare all'AVR, tuttavia è in questo caso non è stato utilizzato.
La rete di pull-up rappresenta una sezione standard su un AVR nella circuiteria di I/O mentre il blocco denominato “AD Multiplexer” viene utilizzato con lo scopo di selezionare il pin utilizzato per convogliare il segnale all'ADC; esso può essere utilizzato per cortocircuitare il segnale a massa, qualora necessario.
Il blocco che va sotto il nome di “Sample & Hold” non è altro che una porzione dell'ADC. Questa si occupa di, letteralmente, campionare e mantenere il valore della tensione letto. All'inizio della conversione da analogico a digitale, lo switch è chiuso e questo permette al condensatore di caricarsi fino a raggiungere il valore di tensione ad esso applicato. Com'è noto, questa operazione richiede un certo tempo per essere completata, dato che la relazione di lato dimostra che c'è sfasamento tra corrente e tensione in questo elemento. Questo da' luogo ad una costante di tempo che, volta per volta, deve essere calcolata.
Una volta che il condensatore si è caricato, l'interruttore viene aperto ed il valore presente nel blocco di mantenimento può essere finalmente convertito.
In pratica, quello che si fa è in misura del valore della capacità all'esterno e per farlo è possibile utilizzare proprio questa configurazione.
La spiegazione è la seguente:
Abilitando la rete di pull-up viene effettuata la carica del condensatore esterno, ovvero del sensore, il cui valore di tensione diventa pari a 5V (o più in generale alla tensione di polarizzazione del circuito) indipendentemente dal fatto che esso sia premuto o meno. Contemporaneamente, impostando il multiplexer in modo che commuti a massa, il condensatore interno viene posto a tensione nulla. Successivamente, viene disabilitata la rete di pull-up, evidentemente non più necessaria, impostato il multiplexer perché si crei un percorso conduttivo che porti il segnale dal sensore fino al convertitore e finalmente la conversione può cominciare.
In sostanza, quello che viene realizzato da questa rete è un parallelo tra due capacità: ciò che ci aspettiamo che succeda è che parte dalla carica proveniente dal sensore innalzi il valore di tensione rilevato sulla capacità interna almeno fino a quando la tensione ai loro capi non sia uguale. Il valore finale della tensione dipenderà dal valore di capacità dei due condensatori, ovviamente. Dato che la capacità di campionamento ha, però, un valore fisso pari a 14 pF, la tensione dipenderà molto dal valore relativo al sensore.
Così, se i due dovessero essere uguali, il valore di tensione “all'equilibrio” sarà pari a VDD/2, in questo caso 2.5 V. Se, invece, il sensore dovesse dimostrare capacità maggiore, troveremo una tensione ai suoi capi superiore a VDD/2. Evidentemente, infine, se il più grande dei due dovesse essere quello interno, allora sarà su di esso che si localizzerà un valore di tensione superiore a quello all'equilibrio.
In linea teorica sarebbe necessario valutare i valori dell'ADC e solo successivamente scegliere i sensori sulla base del loro valore di capacità proposta, per poi eventualmente aumentarlo.
Fatte queste doverose considerazioni preliminari, possiamo passare alla parte hardware.
Stando a quanto scrive Nylund, trasformare tutto questo in istruzioni progettuali non è difficile; il circuito non ha una complessità elevata e dopo appena un paio d'ore spese su KiCAD è possibile completare il progetto del circuito. Ovviamente, la fase successiva richiede l'assemblaggio su board. Nylund ha avuto l'opportunità di farlo all'Università, in Italia questo è un po' più difficile che accada… tuttavia, mettere in pratica l'idea di questo circuito non è affatto complesso. Vale la pena di ricapitolare quali sono i componenti del circuito:
- micro-controllore ATMega32u4 con, integrato, il controllo USB
- tre pulsanti capacitivi
- slider capacitivo a quattro elementi
- ADC a 10-bit
- un LED RGB
- 2 LED ulteriori, che fungeranno da indicatori
I sensori capacitivi sono semplicemente connessi alla resistenza da 10 kOhm e da qui all'ADC. Il motivo per cui in questo progetto non compare alcun piano di massa tra i sensori capacitivi e lo strato inferiore è presto detto: la capacità totale risultante sarebbe stata maggiore mentre noi vogliamo che resti la più piccola possibile, proprio in virtù delle considerazioni fatte in precedenza.
Sull'hardware non c'è molto altro da dire, pertanto possiamo passare al software.
Il compilatore utilizzato per scrivere il codice è AVR GCC, preferito da alcuni, bistrattato da altri ma comunque molto efficace e funzionale. Il linguaggio di programmazione, ovviamente, è il C. Anche sul suo blog non è stato riportato da Nylund l'intero codice, anche perché molto di esso serve principalmente per interfacciarsi con la connessione USB. Tuttavia quello che pare interessante della programmazione è la struttura modulare, ottima sia per rendere il codice più facilmente leggibile sia per permettere allo stesso programmatore di modificarlo. Inoltre, questa tecnica permette l'aggiunta di nuove funzioni senza stravolgere ciò che già era stato scritto e testato.
A ciascuno dei sensori viene assegnata una singola istanza riconducibile ad una struttura, in modo tale da renderli autonomi. L'inizializzazione, che qui non manca, è l'operazione che viene comunemente svolta in un normale ADC; fatta questa, si passa all'implementazione. Vengono effettuate, come il codice dimostra, misure successive che vengono mediate nel tempo, in modo da avere valori d'uscita più attendibili.
L'autore dichiara che c'è molto spazio per chiunque abbia voglia di provare a migliorare il codice nella sua implementazione; ad esempio, l'ultima versione rilasciata potrebbe essere migliorata per quanto concerne il tempo d'attesa necessario perché la conversione finisca. Operazioni di interrupt e timer opportuni potrebbero rappresentare la soluzione al problema, rendendo tutto l'algoritmo più efficiente.
I risultati, che vi proporremo tra un attimo, dimostrano che il progetto funziona ed è anche piuttosto gradevole, esteticamente, rispetto a molti altri “fatti in casa”.
Altro margine di miglioramento è rappresentato dal fatto che un ADC a 10 bit ha un range di valori compreso tra 0 e 1023; su questa scala i valori “idle” di tutti i pulsanti si attestano intorno 500 e durante il “tocco” essi arrivano anche intorno ad 800. Questo valore resta però indicativo perché molto dipende dall'intensità della pressione sul tasto; come vedremo nel video, infatti, anche l'intensità della pressione fa variare la luminosità del LED indicatore.
Meglio di ogni altra parola, però, sarà proprio il video a farvi avere un'idea più completa dei risultati ottenuti.
Che ne pensate?
ATMega32U4 è disponibile da Farnell
Sono consulente Qtouch (o almeno lo ero fino a quando il marchio era della Quantum, ora invece è passato alla Atmel dove non mi sembra ci sia spazio ai consulenti) e quindi conosco molto bene gli integrati che si occupano di gestire i sensori capacitivi. Sono componenti molto versatili ed anche configurabili. La cosa buffa è che all’inizio utilizzavano dei PIC, ma poi sono stati acquisiti dalla Atmel….
Comunque la soluzione integrata è molto orientata al time to market. Metti il componente e funziona, semmai predisponi un minimo di calibrazione. Integrare invece la routine (anche Microchip offre una routine ad hoc) se da una parte offre maggiore versatilità e minori costi, può comunque essere fonte di problematiche…..
In un mio ultimo progetto ho utilizzato un Qprox (senza calibrazione) ed un micro Renesas, tanto per nominare tutti 🙂
Ciao Emanuele,
vorrei sapere dove è possibile acquistare sensori Qprox. Grazie!
Giuseppe
Attualmente i Qprox sono passati da Quantum ad Atmel. Quindi tutti i distributori Atmel, tra i quali, a catalogo posso consigliarti Farnell (consegna in 24h)