Robotica educativa/Telepass

Wikibooks, manuali e libri di testo liberi.
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]

Telepass con Arduino
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.

Codice[modifica]

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).