Sensore Tilt

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 Alimentazione3.3V – 5V
Tempo di vita50 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:

Schema collegamento

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.