Robotica educativa/Sensore di parcheggio
Seguendo passo, passo questo progetto si realizzerà un sensore di parcheggio, sfruttando quanto utilizzato nel modulo Misurazione della distanza.
Descrizione del progetto
modificaDi seguito vengono mostrati dei sensori di parcheggio, come siamo abituati a vederli quotidianamente.
Schema di montaggio
modificaDi seguito lo schema di montaggio:
Il quale utilizza i seguenti componenti:
Componente | Descrizione | Q.tà |
---|---|---|
Sensore di prossimità | Sensore a ultrasuoni HC-SR04 | 1 |
Buzzer | Cicalina piezoelettrica | 1 |
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
modificaIn 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
modificaCome 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
modificaQuindi 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
modificaNel 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
modificaDi 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
modificaNaturalmente, 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).