Gestione di un telepass con Arduino

laboratorio
Gestione di un telepass con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi automatici per le superiori 1
Avanzamento Avanzamento: laboratorio completa al 100%.

In questa lezione si mostrerà come sia possibile ricostruire il funzionamento di un ipotetico telepass autostradale, tramite la scheda Arduino, con l'utilizzo di un sensore ad ultrasuoni, un cicalino piezoelettrica per la segnaletica acustica, un monitor per la messaggistica e un servomotore per alzare e abbassare la sbarra.

Descrizione del progettoModifica

 
Il sensore a ultrasuoni HC-SR04
 
Display 16 linee x 2 righe

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 testo, generato dal display LCD 16x2;
    3. 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. si scrive "Benvenuti a Riccione" nel display;
  2. il cicalino produce un suono ( ) per un breve istante;
  3. il servomotore alza la sbarra alla velocità scelta dall'utente;
  4. si attende il passaggio dell'autoveicolo;
  5. si scrive "Arrivederci" nel display;
  6. il cicalino produce un suono ( ) per un breve istante;
  7. si richiude la sbarra.

Tutti i parametri sono regolabili 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.

  Per approfondire questo argomento, consulta la pagina Misurazione della distanza con sensore a ultrasuoni.

Se il segnale è minore o uguale a un valore stabilito (distanza massima del veicolo dal telepass), Arduino attiva il cicalino piezoelettrico, il quale riproduce un segnale acustico la cui tonalità è regolabile; invece, nel display LCD 16x2 viene inviato un messaggio analogo a quello autostradale (Arrivederci o Benvenuti); mentre il servomotore viene utilizzato per alzare e abbassare una sbarra (quella visibile nel video è stata realizzata con una cannuccia).

Schema di montaggioModifica

Di seguito viene riportato lo schema di montaggio.

Componenti utilizzatiModifica

Elenco componenti
Componente Descrizione Q.tà
LCD 16x2 Display 1
HC-SR04 Sensore di prossimità 1
SG90 9g Servomotore 1
- Cicalino 1
- Resistenze elettriche 3

CodiceModifica

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

  1. inclusione delle 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 variabiliModifica

// Librerie per il controllo del display e servomotore
#include <LiquidCrystal.h>
#include <Servo.h>

#define pin_servo 6          // Pin a cui è collegato il servomotore
Servo servo;                 // Nome del servomotore

int attesasbarra   = 1500;
int velocitaservo  = 10;
int angolosbarra   = 90;
int pos            = 0;       // Posizione iniziale del servomotore

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

int scritta1       = "Benvenuti a";
int scritta2       = "Riccione";
int messaggio      = "Arrivederci";
                              
int freqdiagg = 500;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Pin è collegato lo schermo LCD

InizializzazioneModifica

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

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

    lcd.begin(16, 2);                   // Setup schermo LCD, con colonne e righe
    lcd.print(scritta1);                // Scritta iniziale, "Benvenuti a Riccione"
    lcd.setCursor(0, 1);
    lcd.print(scritta2);

    servo.attach(pin_servo);            // Identificazione pin servo motore
    servo.write(0);                     // Ritorno alla posizione iniziale

    pinMode(trig_pin, OUTPUT);          // Setup del sensore di prossimita' 
    pinMode(echo_pin, INPUT);

    pinMode(piezo, OUTPUT);             // Setup del pin per il cicalino
}

Corpo del programmaModifica

void loop() {
    long durata, distanza;          
    
    digitalWrite(trig_pin, LOW);      // Inizzializzazione del sensore a ultrasuoni
    delayMicroseconds(2);
    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 è minore uguale del parametro atteso
        Serial.println("OK");           // Scrive OK sul monitor seriale (in fase di test)
        
        lcd.clear();                    // Cancella il monitor LCD e scrive "Arrivederci"
        lcd.print(messaggio);        
        
        tone(piezo, tonalita);          // Suona il cicalino per la durata prestabilita
        delay(duratasuono);
        noTone(piezo);
        
        // Alza la sbarra
        for( int i = 0; i < angolosbarra; i++){
        servo.write(i);
        delay (velocitaservo);
        }
        delay (attesasbarra);
        
        tone(piezo, tonalita2);         // Suona il cicalino per la durata prestabilita
        delay(duratasuono);
        noTone(piezo);
        
        // Abbassa la sbarra
        for(int i = (angolosbarra - 1) ; i>= 0; i--){
            servo.write(i);
            delay (velocitaservo);
        }
        
        lcd.clear();
        
        lcd.print(scritta1);             // Riscrive "Benvenuti a Riccione"
        lcd.setCursor(0,1);
        lcd.print(scritta2);
    }
    else {                              // Altrimenti
       Serial.print(distanza);          // Scrive sul monitor seriale la distanza in cm (test)
       Serial.println(" cm");
       Serial.println();
     }
    delay(freqdiagg);
}

Espansioni suggeriteModifica

Una possibile espansione di questo progetto è il conteggio delle automobili in ingresso (utile per un parcheggio, zone a traffico limitato e altro).

Un'altra - che richiede una sensoristica ulteriore - è il riconoscimento delle automobili autorizzate (possibile con sensore RFID).