Robotica educativa/Sensore di parcheggio

Indice del libro

Seguendo passo, passo questo progetto si realizzerà un sensore di parcheggio, sfruttando quanto utilizzato nel modulo Misurazione della distanza.


Descrizione del progetto

modifica

Di seguito vengono mostrati dei sensori di parcheggio, come siamo abituati a vederli quotidianamente.

Schema di montaggio

modifica

Di seguito lo schema di montaggio:

 
Sensore di parcheggio realizzato con Arduino

Il quale utilizza i seguenti componenti:

Componenti
Componente Descrizione Q.tà
Sensore di prossimità Sensore a ultrasuoni HC-SR04 1
Buzzer Cicalina piezoelettrica   1
 
Tipico buzzer elettromagnetico.

Rispetto al progetto precedente aggiunge soltanto una cicalina (o buzzer). Alcune di queste, come quella in figura sono molto piccole.

Avendo usato una breadboard per inserire i componenti elettronici, si è alloggiato lì anche il buzzer, ma – osservandolo bene – i suoi pedini distano quanto tre ingressi/uscite della breadbord (e di Arduino). Quindi, se un pedino deve andare a massa, l'altro può utilizzare il pedino 12 di Arduino (modificando la linea 2 del codice).

Così facendo sarà possibile inserire il buzzer direttamente nella scheda Arduino.

Attenzione: questo non vale per i diodi led, poiché questi necessitano di una resistenza.

In questo caso il codice verrà suddiviso in più parti, così da comprenderne fino in fondo il senso. La cosa più importante è copiarlo nell'esatto ordine in cui si presenta.

Connessione dei vari pin

modifica

Come prima cosa si definiscono i pin ai quali si collega la cicalina e il sensore a ultrasuoni (trigger ed echo).

// Connessione dei pin
#define beep      6  // Buzzer
#define echo      7  // Echo
#define trigger   8  // Trigger
  • triggerè il pin “Trigger”: comunica al sensore quando inviare un segnale;
  • echo è il pin "Echo" riceve il ritorno del segnale inviato dal sensore (ammesso che vi sia un ritorno).

Parametri del codice

modifica

Quindi vengono definite: la distanza massima di lettura del sensore distanzaMax; la distanza minima del buzzer (al di sotto della quale si avrà un suono continuo) distanzaMin; la velocità di dialogo col monitor seriale (espresso in baud) baud, infine la velocità del suono (espressa in centimetri al microsecondo) c.

// Parametri editabili dall'utente
#define distanzaMax      80 // centimetri
#define distanzaMin       4 // centimetri
#define baud           9600 // bit / secondo
#define c            0.0343 // cm / us

A questo punto vengono definite le variabili, ovvero grandezze che potranno essere modificate durante il ciclo di lavorazione. long è un dato che può contenere numeri a 32 bit, con segno, necessario perché il tempo viene misurato in microsecondi, pertanto è facile ottenere numeri molto alti.

// Variabili
long tempo;    // tempo in microsecondi trascorso tra trigger ed eco
float spazio;   // distanza dell'ostacolo

Nel setup si definiscono i perdini e il loro utilizzo (ingresso/uscita) e – dopo aver inizializzato la porta seriale – si invia al computer l'intestazione di quel che farà il programma.

void setup() {
    // definizione di ingressi e uscite
    pinMode( trigger, OUTPUT );
    pinMode( echo,  INPUT );
    pinMode( beep, OUTPUT );
    // Inizializzazione porta seriale
    Serial.begin( baud );
    // Scrittura delle prime tre linee di testo
    Serial.println( "+---------------------+" );
    Serial.println( "|Sensore di parcheggio|" );
    Serial.println( "+---------------------+" );
}

Programma principale

modifica

Nel programma principale si scrive il programma principale. La particolarità di loop è che i comandi vengono ripetuti fino allo spegnimento o al reset della macchina.

void loop() {
    // Prima della misurazione, si porta il trigger a livello basso
    digitalWrite( trigger, LOW );
    delayMicroseconds( 5 );
    
    // Invio di un impulso della durata di 10 microsecondi
    digitalWrite( trigger, HIGH );
    delayMicroseconds( 10 );
    digitalWrite( trigger, LOW );
    
    // Attende la ricezione dell'impulso e lo divide per 2 (andata e ritorno)
    tempo = pulseIn( echo, HIGH ) / 2;
    spazio = c * tempo;
    
    // Invia i dati acquisiti nel monitor seriale ([Ctrl] + [Shift]  + M)
    // approssimati alla prima cifra decimale
    Serial.println("Distanza = " + String(spazio, 1) + " cm" );

    // A seconda della posizione dell'ostacolo produce un
    if( spazio < distanzaMax ){
        // suono intermittente proporzionale alla distanza (1 m = 400 ms)
        tone(beep, 1000);
        delay(40);
        //  Il suono e' intermittente solo se non si arriva alla distanzaMin
        if ( spazio > distanzaMin )  {
            noTone( beep );
            delay( spazio * 4 );
        }
    }
    // Attende 50 millisecondi prima di un'altra misurazione  
    delay( 50 );
}

Il risultato finale

modifica

Di seguito, un video che mostra il funzionamento del sensore di parcheggio, mostrando le fasi in cui non vi è segnale acustico, vi è un avviso di prossimità e – infine – la segnalazione di pericolo, per poi ripercorrere i passaggi a ritroso.

Espansioni suggerite

modifica

Naturalmente, il sensore di prossimità, trova numerose altre applicazioni. A titolo di esempio:

  • interruttore di prossimità, quando è presente una persona;
  • contapersone (ne occorrono due, per determinare la direzione);
  • misuratore di altezze e profondità (come l'acqua presente in una piscina);
  • canestro contapunti automatico (solo il numero di canestri, naturalmente).