Arduino e tilt ball switch: rilevamento di inclinazione

Un rilevatore di inclinazione molto diffuso ai giorni nostri è l’accelerometro installato nei nostri smartphone e tablet: grazie ad esso, ogni volta che ruotiamo lo schermo, la visualizzazione del display passa dalla modalità portrait a quella landscape e viceversa. Anche con Arduino è possibile rilevare l’inclinazione di un oggetto e in qualche modo reagire ad essa (invertendo la direzione di marcia di un motore passo passo o ruotando l’angolo di un motore servo ad esempio); uno dei sensori più semplici da gestire in questo senso è l’interruttore a inclinazione, detto anche tilt ball switch.

Cos’è un tilt ball switch

Il tilt ball switch (o interruttore di tilt) è un sensore cilindrico, o comunque cavo, in cui una massa al suo interno ha un certo spazio per muoversi. A una delle due estremità del sensore si trovano due poli non in contatto tra di loro, in grado di condurre elettricità. Se questi poli vengono toccati dalla massa in movimento (di solito una sfera metallica), il circuito si chiude, facendo passare la corrente elettrica. Non si tratta di un sensore molto preciso, ma molto spesso il suo meccanismo di funzionamento è sufficiente per la maggior parte dei progetti con Arduino. Pensiamo ad esempio ad un robottino o un autoveicolo che deve avvisare con un allarme quando raggiunge un punto di inclinazione critico.

Dall’altra estremità del sensore, invece, si protendono due piedini utili per la connessione su breadboard o con cavetto jumper (o comunque per la connessione a qualsiasi circuito).

Ecco come si presenta l’interruttore ad inclinazione:

Tilt ball switch
Tilt ball switch

Provate a ruotarlo per avvertire la massa al suo interno.

In questo articolo, modificheremo lo sketch utilizzato per far suonare un buzzer attivo, per fare in modo che si avvii un allarme se il sensore di tilt viene inclinato.

Il materiale necessario e il circuito di prova

Per assemblare il circuito di avvio allarme tramite il tilt ball switch, ci serviranno:

  • un tilt ball switch o sensore di inclinazione
  • un buzzer attivo
  • una breadboard
  • due ponticelli ricavati da doppino telefonico
  • due cavetti jumper maschio-maschio (meglio se di diverso colore)
  • due cavetti jumper maschio-femmina (meglio se di diverso colore)
  • una scheda Arduino
  • un cavo usb per collegare Arduino al pc

Ecco grosso modo come si presenta il circuito finale:

Circuito tilt switch Arduino
Circuito tilt switch Arduino

Un cavetto jumper collega la linea negativa della breadboard (visibile dal segno meno) al pin GND di messa a terra di Arduino, mentre un altro jumper connette il pin 7 alla linea positiva (visibile dal segni più).

I ponticelli rosso e bianco mettono in comunicazione i poli positivo e negativo del buzzer al pin 7 e al canale negativo della breadboard.

Infine il cavetto jumper maschio-femmina verde connette un terminale dell’interruttore di tilt al pin 2 e il cavetto nero collega l’altro terminale alla messa a terra.

Lo sketch di test

Il listato è quasi del tutto identico al programma di gestione del cicalino attivo, con la differenza che definiamo il pin collegato al tilt ball switch e modifichiamo la funzione suona inserendo all’inizio del blocco di istruzioni la lettura del valore dal medesimo pin:

void suona() {
  int digitalVal = digitalRead(PIN_TILT);
  
  Serial.print("PIN_TILT esterno al ciclo while: ");
  Serial.println(digitalVal);
  
  while(digitalVal == HIGH) {    
    
    frequenza_1();
    frequenza_2();
    
    digitalVal = digitalRead(PIN_TILT);
    
    Serial.print("PIN_TILT interno al ciclo while: ");
    Serial.println(digitalVal);
    
  }
}

Il ciclo while non è più un ciclo infinito, ma dipende dal valore del pin 2, di cui si testa se è uguale o meno alla costante HIGH. Se il flusso di esecuzione entra nel blocco di while, eseguiamo le funzioni frequenza_1 e frequenza_2. Successivamente rileggiamo il valore del pin digitale, sempre tramite digitalRead, in modo da riassegnare il valore per la condizione di fine ciclo.

Ecco lo sketch completo:


#define PIN_BUZZER 7
#define PIN_TILT 2

void frequenza_1() {
  
  for(int i=0;i<80;i++)
  {
    digitalWrite(PIN_BUZZER,HIGH);
    delay(1);
    
    digitalWrite(PIN_BUZZER,LOW);
    delay(1);
    
  }
}

void frequenza_2() {
  for(int i=0;i<100;i++)
  {
    digitalWrite(PIN_BUZZER, HIGH);
    delay(2);
        
    digitalWrite(PIN_BUZZER, LOW);
    delay(2);
  }
}

void suona() {
  int digitalVal = digitalRead(PIN_TILT);
  
  Serial.print("PIN_TILT esterno al ciclo while: ");
  Serial.println(digitalVal);
  
  while(digitalVal == HIGH) {    
    
    frequenza_1();
    frequenza_2();
    
    digitalVal = digitalRead(PIN_TILT);
    
    Serial.print("PIN_TILT interno al ciclo while: ");
    Serial.println(digitalVal);
    
  }
}

void setup() {
  Serial.begin(9600);

  pinMode(PIN_BUZZER,OUTPUT);
  pinMode(PIN_TILT,INPUT);
  digitalWrite(PIN_TILT, HIGH);
}

void loop() {
  suona();
}

Ovviamente, a fini di debugging, sono state inserite delle istruzioni di stampa sul monitor seriale.

Provate a giocare con le inclinazioni del sensore di tilt per avviare o sospendere l’allarme, e ad immaginare qualcuno degli innumerevoli usi che potreste farne in un vostro progetto.

Conclusione

Il sensore di inclinazione, o sensore di tilt o tilt ball switch, è un componente economico e molto semplice da usare, laddove non sia richiesta una certa precisione nel rilevamento di movimento. In questa breve guida ne abbiamo visto sommariamente le caratteristiche e abbiamo costruito un semplice circuito che attiva un allarme se viene rilevata un’inclinazione del sensore.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.