In questo articolo vedremo come utilizzare il sensore di tilt del kit Elegoo. Si tratta di sensori standard accomunati dallo stesso principio di funzionamento.
Sono composti di una cavità interna (in genere cilindrica), che contiene una massa conduttiva libera di muoversi, che può essere una sferetta metallica o anche una goccia di mercurio.
Quando il sensore è inclinato nella giusta direzione, la massa conduttiva mette in corto i poli, e si crea un percorso conduttivo per la corrente.
È un po’ come un pulsante, ma azionato dalla forza di gravità.
Un tempo contenevano per lo più mercurio, oggi questi sono rari da trovare proprio per la tossicità di questo elemento. Tuttavia il mercurio, a causa della sua densità, era ottimo per evitare il cosiddetto “rimbalzo” (in inglese bounce). L’effetto di bounce è legato proprio all’effettivo rimbalzo della sferetta all’interno.
Al contrario degli accelerometri, che vedremo a breve, questi sensori sono molto economici, consumano pochissimo, e sono molto semplici da usare. Possono quindi sostituire i primi in applicazioni semplici, come ad esempio rilevare l’apertura del coperchio di una scatola.
Possiamo anche trovare il sensore in moduli più complessi, come il seguente:
Struttura Modulo
Specifiche Tecniche
Tensione di Alimentazione | 3.3V – 5V |
Tempo di vita | 50 000+ commutazioni |
Corrente | < 5mA (durante la commutazione) |
Schema Collegamento
Come i sensori visti finora, questo sensore di tilt con Arduino necessita di una resistenza di pull-up di 10kΩ.
Nel nostro modulo, la resistenza è già integrata, quindi provvediamo semplicemente a fare i collegamenti come segue:
Codice
Il codice per utilizzare il nostro sensore è molto semplice. L’unica accortezza che dobbiamo avere è l’implementare una semplice funzione anti-rimbalzo, perché nel nostro modulo il sensore non contiene ovviamente mercurio.
#define PIN_SENSORE 2
#define DEBOUNCE 50 //ms
void setup() {
//Configuro direzioni pin
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PIN_SENSORE, INPUT);
}
bool prevFixedState = HIGH; //Ultimo stato che ha passato il test dei rimbalzi
bool bounceState = HIGH; //Stato rimbalzo che ha fatto resettare il timer
unsigned long lastChange = 0; //Istante dell'ultimo rimbalzo
/*
* Aumentare il DEBOUNCE se si verificano rimbalzi
*/
void loop() {
//Rilevo la vibrazione
bool currState = digitalRead(PIN_SENSORE);
//Se rileviamo un cambiamento, aspettiamo che si stabilizzi
if (currState != bounceState){
lastChange = millis(); //Resettiamo il timer del cambiamento
bounceState = currState;
}
//Deve passare almeno un DEBOUNCE tra cambiamenti successivi
if ((bounceState != prevFixedState) && (millis() - lastChange > DEBOUNCE)){
//Il sensore è rimasto nello stesso stato abbastanza
//Lo segnaliamo con un blink del led integrato
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
prevFixedState = bounceState; //Ci segnamo lo stato
}
}
Se il sensore non dovesse rimanere a 0 ma dovesse solo dare un impulso, possiamo usare lo stesso codice visto per il sensore di vibrazione.