Robotica educativa/Telepass

Indice del libro

Ora che si è imparato come misurare una distanza e come emettere un segnale acustico è possibile aggiungere un servomotore per alzare e abbassare una sbarra al passaggio di un veicolo ricostruendo, così, il funzionamento di un tipico telepass autostradale.


Descrizione del progetto

modifica
 
Servomotore

Il sistema ha il seguente funzionamento:

  1. in ingresso il sensore di prossimità rileva la distanza dell'oggetto di fronte a lui, distanza che poi verrà convertita in centimetri;
  2. in uscita si hanno:
    1. un segnale acustico, generato dal cicalino piezoelettrico;
    2. un servomotore, per alzare e abbassare la sbarra.

Questo processo ha il suo avvio quando il sensore a ultrasuoni rileva un valore al di sotto di un livello stabilito dall'utente. A questo punto si eseguono i seguenti eventi:

  1. il cicalino produce un suono ( ) per un breve istante;
  2. il servomotore alza la sbarra alla velocità scelta dall'utente;
  3. si attende il passaggio dell'autoveicolo;
  4. il cicalino produce un altro suono ( ) per un breve istante;
  5. si richiude la sbarra.

Tutti i parametri sono gestibili attraverso le variabili nella prima sezione del codice.

Il sensore capta la distanza, convertita in centimetri nel codice, inviando e ricevendo un segnale a ultrasuoni.

Se il segnale è minore o uguale a un valore prestabilito (distanza massima del veicolo dal telepass), si attiva il cicalino piezoelettrico, il quale riproduce un segnale acustico la cui tonalità è regolabile; mentre il servomotore viene utilizzato per alzare e abbassare una sbarra (realizzata con una cannuccia).

Schema di montaggio

modifica
 
Schema di montaggio

Rispetto al progetto precedente è stato inserito soltanto il servomotore. Questo si controlla inviando un numero corrispondente all'angolo della sbarra in gradi sessagesimali.

Di seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:

  1. inclusione di librerie, definizione delle costanti e variabili;
  2. codice da eseguire all'avvio del programma e alla pressione del tasto di reset;
  3. programma di controllo.

Librerie, costanti e variabili

modifica
#include <Servo.h>            // Libreria per il controllo delservomotore

#define pin_servo 11          // Pin a cui è collegato il servomotore
Servo sbarra;                 // Nome del servomotore

int attesasbarra   = 1500;    // Tempo di attesa prima della discesa della sbarra
int velocitaservo  = 10;      // Velocita' di movimeno della sbarra
int angolosbarra   = 90;      // Angolo finale della sbarra
int pos            = 0;       // Angolo iniziale della sbarra

int piezo          = 2;       // Pin a cui è collegata al cicalino 
int duratasuono    = 300;     // Durata del beep in millisecondi
int tonalita       = 800;     // Frequenza primo beep
int tonalita2      = 700;     // Frequenza secondo beep
                          
const int trig_pin = 10;      // Pin TRIG del sensore a ultrasuoni
const int echo_pin = 9;       // Pin ECHO del sensore a ultrasuoni
int larghezzacarr  = 10;      // Distanza in cm per il quale la sbarra si alzerà

int freqdiagg = 500;          // Intervallo in millisecondi tra un ciclo e il successivo

Inizializzazione

modifica

Inizializzazione del progetto, dove vengono identificate le uscite e le entrate di Arduino verso i vari componenti, e si inizializza il servomotore.

void setup() {
    Serial.begin(9600);                 // Inizializzazione della porta seriale 

    sbarra.attach(pin_servo);           // Identificazione pin servo motore
    sbarra.write(pos);                  // Abbassa la sbarra

    pinMode(trig_pin, OUTPUT);          // Setup del sensore di prossimita' 
    pinMode(echo_pin, INPUT);
    pinMode(piezo, OUTPUT);             // Setup del pin per il cicalino
}

Programma principale

modifica
void loop() {
    long durata, distanza;          
    
    digitalWrite(trig_pin, LOW);        // Inizializzazione del sensore a ultrasuoni
    delayMicroseconds(5);
    digitalWrite(trig_pin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig_pin, LOW);
    
    durata = pulseIn(echo_pin,HIGH);
    distanza = durata / 29.1 / 2 ;      // Conversione della durata in cm (distanza)
    
    if (distanza <= larghezzacarr){     // Se la distanza è conforme
        Serial.println("OK");           // Scrive OK sul monitor seriale (fase di test)
        
        tone(piezo, tonalita);          // Esegue il primo beep
        delay(duratasuono);
        noTone(piezo);
        
        // Alza la sbarra
        for( int i = pos; i < angolosbarra; i++){
            sbarra.write(i);
            delay (velocitaservo);
        }
        delay (attesasbarra);           // Fa passare il veicolo
        
        tone(piezo, tonalita2);         // Esegue il secondo beep
        delay(duratasuono);
        noTone(piezo);
        
        // Abbassa la sbarra
        for(int i = (angolosbarra - 1) ; i>= pos; i--){
            sbarra.write(i);
            delay (velocitaservo);
        }
    }
    else {
        // Altrimenti scrive sul monitor seriale la distanza in cm (test)
        Serial.println(distanza + " cm");          
     }
    delay(freqdiagg);
}

Espansioni suggerite

modifica
  • Una possibile espansione di questo progetto è il conteggio delle automobili in ingresso (utile per un parcheggio, zone a traffico limitato e altro). Attenzione: se le autovetture entrano ed escono dal medesimo ingresso saranno necessari due sensori di prossimità, per determinare il verso di percorrenza.
  • Un'altra – che richiede una sensoristica ulteriore – è l'apertura della sbarra solo alle automobili autorizzate (possibile con sensore RFID).