Sensore Scuotimento (Shake sensor)

Il prossimo sensore che andiamo a vedere fa sempre parte della famiglia di sensori di vibrazione e tilt. Si tratta del sensore di scuotimento (in inglese shake sensor).

Questo sensore è composto da una molla chiusa in un contenitore in plastica, isolante. Un’estremità della molla è collegata ad un polo, mentre all’altra estremità troviamo un piatto metallico, posizionato vicino alla molla.

Il piatto metallico non tocca la molla, quindi normalmente non c’è un percorso conduttivo tra i due poli del sensore.

Quando agitiamo il sensore, la molla oscilla e, non appena tocca il piatto, si crea molto brevemente un canale conduttivo.

Andiamo a vedere questo sensore, che fa parte del kit Elegoo.

Struttura Modulo

Specifiche Tecniche

Niente di particolare da segnalare. La tensione di alimentazione va tenuta compatibile con quella di Arduino, quindi tra 3.3V e 5V.

Schema Collegamento

Come abbiamo già accennato, il nostro sensore di scuotimento, come quasi tutti i sensori visti finora, non presenta normalmente un percorso conduttivo tra i poli.

Dobbiamo comportarci quindi come avevamo fatto per il push button: non possiamo tenere il pin scollegato, altrimenti non saremo più in grado di distinguere i disturbi dal segnale del sensore.

Utilizziamo quindi una resistenza come pull-up, in modo da tenere il pin a 5V nello stato normale del sensore. Quando rileveremo lo scuotimento, il sensore porterà brevemente il segnale a 0V.

Nel nostro modulo, la resistenza di pull-up da 10kΩ è già integrata. Facciamo quindi i soliti semplici collegamenti:

Schema collegamento

Codice

Il codice è sempre il solito. In questo caso però è importante che l’esecuzione della funzione loop sia veloce, in modo da cogliere l’istante in cui il sensore ci presenta il fronte di discesa.

Nel codice qui sotto andiamo a sfruttare il led integrato sul pin 13.

#define PIN_SENSORE 2

void setup() {
  //Configuro direzioni pin
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PIN_SENSORE, INPUT);
}

void loop() {
  //Rilevo la vibrazione
  bool sensor = digitalRead(PIN_SENSORE);
  if (sensor == LOW){
    //Non abbiamo garanzie che questa sezione venga eseguita una sola volta
    digitalWrite(LED_BUILTIN, HIGH); //Accendo il led quando la vibrazione è attiva
    delay(1000); //Teniamo acceso per poterlo vedere
  }else{
    digitalWrite(LED_BUILTIN, LOW);
  }
}
#define PIN_SENSORE 2

void setup() {
  //Configuro direzioni pin
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PIN_SENSORE, INPUT);
}

bool prevState = HIGH;

void loop() {
  //Rilevo la vibrazione
  bool sensor = digitalRead(PIN_SENSORE);

  if (sensor != prevState){
    if (sensor == LOW){
      //Fronte discesa
      digitalWrite(LED_BUILTIN, HIGH); //Accendo il led quando la vibrazione è attiva
      delay(1000); //Teniamo acceso per poterlo vedere
    }else{
      //Fronte salita
      digitalWrite(LED_BUILTIN, LOW);
    }
    prevState = sensor;
  }
}