Home
Accesso / Registrazione
 di 

Creiamo un pulsante capacitivo con Arduino

theredue

Un pulsante capacitivo per accendere le luci di una stanza

Immaginiamo che bello poter arrivare a casa e dover accendere la luce solo sfiorando con un dito una piccola porzione di muro, che ha al suo interno un interruttore nascosto, quello di cui sto parlando è di creare un pulsante capacitivo in grado di far accendere e spegnere una luce in una stanza. L’idea di questa realizzazione non è ovviamente mia, ma di Paul Bagder, il concetto che sta alla base di tutto il progetto è data dallo strumento Theremin, che è quello strumento “musicale” che si suona avvicinando e allontanando le mani da un asta di ferro, ecco un'immagine rappresentativa:

Come funziona è semplicissimo, questo strumento semplicemente rileva la presenza di carica su un corpo nelle sue vicinanze e ne calcola la sua capacità complessiva.
E' disponibile online una libreria scritta da Paul Bagder da utilizzare con Arduino Uno e si chiama Capacitive Sensing Library, abbreviata capSense, scaricabile gratuitamente da:
http://www.arduino.cc/playground/Main/CapSense

Oltre alla libreria c’è anche un descrizione dettaglia del suo utilizzo e del principio di funzionamento di questo tipo di sensore compreso la sintassi utilizzata per richiamare le varie funzioni al suo interno.

Passiamo ora alla realizzazione pratica, per prima cosa ecco cosa ci occorre:
- Arduino Uno ovviamente oppure anche Arduino 2009
- Un foglio di alluminio piccolo
- Un led verde o qualsiasi altro va bene ugualmente
- Una resistenza nell’ordine dei Mega ohm

Per quanto riguarda la resistenza apro una piccola parentesi, più è grande la resistenza inserita è piu è sensibile il nostro pulsante alla nostra presenza, il che significa che se noi ad esempio mettiamo una resistenza nell’ordine dei 10 – 20 Mega ohm il sensore ci rileva la presenza della mano a una distanza di qualche cm di distanza dal sensore. Io ho preferito optare per una resistenza di 2 Mega ohm, funziona lo stesso discretamente, mettendo quella basta sfiorare il foglio di alluminio e il sensore ti rileva.

Passiamo al circuito da costruire:

Il sensore è un filo con una estremità scoperta, abbastanza lungo, questo filo va messo in mezzo ad un foglio piccolo di carta stagnola piegato in due.
La resistenza da 2 Mega ohm và collegata tra i pin digitali 2 e 4, mentre il led tra GND e il pin digitale 12, ricordatevi solo di mettere una piccola resistenza tra il led e gnd o tra led e pin 12, in modo da non farlo bruciare.

Giusto per mettervi a conoscenza, per chi non lo sapesse, il disegno del circuito l'ho creato con un programma che si chiama Fritzing, disponibile gratuitamente a questo indirizzo:
http://fritzing.org/

Ora l'unica parte che ci manca è programmare il firmware per Arduino, ecco il sorgente:

#include <CapSense.h>
CapSense cs_4_2 = CapSense(4,2);
int i = 0;
void setup()
{
   pinMode(12,OUTPUT);
   cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
   Serial.begin(9600);
}
void loop()
{
   long total = cs_4_2.capSense(30);
   delay(150);
   Serial.println(total);
   if (total >60)
   {
      i++;
      Serial.println("Acceso");
   }

   switch (i)
   {
      case 1:
         digitalWrite(12,HIGH);
         break;
      case 2:
         digitalWrite(12,LOW);
         i=0;
         break;
   }
}

Vediamo ora la sintassi base della libreria CapSense.h:

- CapSense cs_4_2 = CapSense(4,2);

Questa stringa ci dice dove viene collegata la resistenza, ossia tra il pin 4 e il pin 2, ovviamente questi due valori possono essere cambiati, l'importante e che siano pin digitali.

- cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);

Serve per impostare il tempo di auto calibrazione del sensore, ponendo la funzione in questo modo viene disattivata l’auto calibrazione del sensore.

- long total = cs_4_2.capSense(30);
Questa variabile registra la capacita totale misurata sommando 30 campioni, anche qui il 30 può essere cambiato come si vuole.

Ho aggiunto nel sorgente anche la possibilita di far comunicare arduino con il serial monitor, è una funzionalità in più che si può anche eliminare perché non compromette la corretta esecuzione del firmware.
Con le corrette modifiche al circuito, collegando ad esempio dei relè e altri componenti potremmo trasformare questo progettino e considerarne un reale utilizzo in casa.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di maurotec

#include cosa?

Ciao, non ho approfondito più di tanto, ma da programmatore la prima cosa che ho notato e la mancanza del header file, che guardando al link http://www.arduino.cc/playground/Main/CapSense, si capisce qual'è l'header da includere.

 

Le applicazioni di questo sensore sono molteplici, la prima che mi viene in mente riguarda la sostituzione del pulsante con cui accendiamo le luci di casa, anche se mi sembra di ricordare che alcune aziende del settore abbiano già interruttori di questo tipo.

Tuttavia io rimango della idea che un bel deviatore è ancora meglio del pulsante più relè per accendere le luci.

Ciao.

ritratto di Emanuele

Grazie della segnalazione

Grazie della segnalazione,
l'include vuoto era sfuggito anche a me :)

(problema dovuto solo alla visualizzazione, in html l'include è presente. Risolto con l'uso dei caratteri html speciali)

a proposito, nel codice relativo alla libreria che hai linkato, mi sembra ci sia una svista:

CapSense cs_4_2 = CapSense(4,2); // 10 megohm resistor between pins 4 & 2....
CapSense cs_4_5 = CapSense(4,5); // 10 megohm resistor between pins 4 & 6....
CapSense cs_4_8 = CapSense(4,8); // 10 megohm resistor between pins 4 & 8....

sbaglio o il 5 andrebbe sostituito con 6 (o viceversa) ?

ritratto di Francesco.Bevacqua

il lista è completo?

ciao a tutti,

ho intenzione di relaizzare il circuito in oggetto. Sono un novizio della programmazione, quindi ti chiedo:

il listato riportato nell'articolo tiene conto delle varie modifiche o va riguardato tenendone conto?

Grazie

Franco

ritratto di stefano88

Pensavo di essermi

Pensavo di essermi dimenticato qualche pezzo, comunque nel caso
CapSense cs_4_5 = CapSense(4,5); // 10 megohm resistor between pins 4 & 6....
la resistenza è tra i pins 4 & 5 e non tra i 4 & 6

ritratto di K0ral

scusa, non capisco di quale

scusa, non capisco di quale resistenza parli...:-??

ritratto di K0ral

errori...

Ciao a tutti, mi sto affacciando da pochissimo al mondo di arduino e anche dell'elettronica..
Questo progetto mi è sembrato carino, ma non sono riuscito a portarlo a termine.
Ammesso di aver collegato tutto bene...mi sembra che lo sketch non sia corretto.
A partire dal nome della libreria che non è scritto dopo include..per il resto mi dà una serie di errori nella compilazione tipo...

sketch_oct07a:11: error: stray '\' in program

Altri errori sono:

sketch_oct07a.cpp: In function 'void setup()':

sketch_oct07a:5: error: 'u2002' was not declared in this scope
sketch_oct07a:5: error: expected `;' before 'u2002'

Questi non li riesco a capire...premetto che ho solo un'infarinatura di programmazione..
Mi aiutate?:)

ritratto di maurotec

>Questi non li riesco a

>Questi non li riesco a capire...premetto che ho solo un'infarinatura di programmazione..
Mi aiutate?:)<

mmmm... rileggiti i post e il codice dell'articolo che ora è corretto.
Per la resistenza dal momento che c'è ne una solo si riferisce per forza a quella che nell'articolo dice di avere messo da 2 Mega ohm.

Ciao.

ritratto di K0ral

errore compilazione

non so se l'hai corretto..ma a me da ancora l'errore di compilazione...

stray '\' in program

cos'è??

ritratto di maurotec

Non conosco quell'errore,

Non conosco quell'errore, riprova a scrivere il programma nell'ide senza copiare.
Il loop per la prova di compilazione lo puoi lasciare vuoto, se compila riempi il loop.

Sembra più un errore di battitura, non so hai inserito qualche carattere "\" inavvertitamente. Potrebbe anche essere che non trova il file header che hai incluso.

Riprova un pò con calma, con la convinzione che hai scritto qualcosa di sbagliato, se non trovi nulla poi vediamo.

Ciao.

ritratto di stefano88

Ciao, come dice maurotec

Ciao,
come dice maurotec prova a scriverlo direttamente tu sull' IDE, magari possono esserci problemi di battitura, per quanto riguarda la resistenza il sorgento è compilato per funzionare con il circuito della foto. Per quanto riguarda il valore della resistenza puoi variarla a tuo piacimento, per il grado di sensibilità, io quando l'ho sperimentato ne avevo solo una da 2M ohm e i risultati ottenuti erano più che accettabili

ritratto di K0ral

ok, riproverò a

ok, riproverò a scriverlo.
Ma..per la resistenza..a quanto ho capito io, ci sono 2 resistenze, no?
Una quella che si vede nel circuito disegnato e poi quando dice di mettere una piccola resistenza tra gnd e diodo o tra diodo e pin12...giusto?

ritratto di maurotec

Esatto KOral, ci sono due

Esatto KOral, ci sono due resistenze, una va sul diodo per evitare che l'uscita del microcontroller si bruci ma anche per limitare la corrente che scorre nel diodo led.
Comunque Stefano88 si riferisce alla resistenza da 2M ohm come ha ribadito lui stesso. Ti consiglio di inscriverti al forum di Arduino e di studiare un pò di elettronica di base, niente di complicato solo l'ABC. Sul forum di arduino troverai vecchi post dove si discute della capacità di corrente massima fornibile dal microcontroller come la potenza massima, insomma da leggere c'è tanto. Ti fornisco alcuni nick di utenti Arduino che sanno il fatto loro:

Ovviamente Io MauroTec, Astrobeed, Leo72, Menniti, lesto, uwefed ecc,
Troverai di sicuro modo di crescere ed imparare.

Ciao.

ritratto di K0ral

Grazie!

non mi è chiara una cosa..ma..per forum di arduino intendi quello sul sito arduino.cc? la sezione italiana...giusto?

ritratto di K0ral

WOW!

Ce l'ho fatta!
Era l'aver "copiato e incollato" il codice che non andava..:)
Solo ancora un paio di domande...

1) Ho dovuto "commentare" e quindi togliere la riga

Serial.begin(9600);

altrimenti il led TX restava lampeggiante e non funzionava niente.
come mai?

2) Come mai se tengo il dito fermo sul foglio di alluminio, il led lampeggia?
e resta acceso o spento a seconda dell'istante in cui lo tolgo..:)Se lo tolgo quando lo becco acceso resta acceso, altrimenti resta spento..

Grazie ancora per l'aiuto!

ritratto di stefano88

Scusa ma avevo perso un po’

Scusa ma avevo perso un po’ di vista il post, che il led Tx lampeggi è normale perché Arduino invia dati al pc sul Serial Monitor, il motivo che non ti funzioni nulla può essere magari l'errata configurazione della velocità, dove è collegata l’usb di arduino, io ho impostato 9600 magari la tua è diversa, per impostare questa velocità basta andare su gestione dispositivi e poi alla voce Arduino, tasto destro, proprietà se non mi sbaglio. Magari è quello il problema che non funzionava più nulla.
Per quanto riguarda la seconda domanda sinceramente non ci ho mai fatto caso e non ho mai fatto quel tipo di prova.

ritratto di tazzo

stray '\' in program

Per risolvere l'errore prova a cancellare gli spazi all'inizio di ogni riga.
Per me ha funzionato
Ciao

ritratto di d.ac

salve, sto provando con la

salve,
sto provando con la programmazione in base al codice che avete scritto
l'ho riportato scrivendolo io su arduino.... il problema che quando vado a fare la verifica mi da "CapSense' does not nome a type " evidenziandosi la seconda riga;
Mi aiutate a risolvere questo problemino ...

ritratto di matte xd

ciao a tutti

ciao a tutti

vorrei provare a capire qualcosa di programmazione potete darmi una mano?
Che so io ,per esempio mostrarmi un progetto e spiegarmelo oppure consigliarmi un sito

grazie...........

ritratto di Bazinga

Imparare a programmare

Cosi mi sembra un po troppo generica la domanda. COSA vuoi imparare a programmare?
Una volta che hai le idee chiare fai una ricerca su questo sito.

ritratto di Filippop

Ciao a tutti! Io vorrei creare una pulsantiera a sfioro per c

Ciao a tutti!
Io vorrei creare una pulsantiera a sfioro per controllare da due o tre punti del mio salone 9 punti luce diversi gli uni dagli altri. In pratica 9 interruttori deviati a sfioro raccolti in un unica "placca" per evitare 9 pulsanti a sfioro Ticino o altre marche...pensate sia possibile usando arduino?

Grazie,

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 1 utente e 46 visitatori collegati.

Utenti online

Ultimi Commenti