Robotica educativa/Sensore di parcheggio

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

Codice[modifica]

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

Setup[modifica]

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