Assistente di parcheggio a laser con tecnologia ToF

Sfruttando un recentissimo metro laser basato sulla tecnologia ToF, realizziamo un assistente di parcheggio per box e garage.

Il problema dello spazio in garage

L’aumento delle dimensioni delle automobili avvenuto negli anni, a parità di segmento, se da un lato ha regalato quella comodità degli occupanti che nelle utilitarie di trent’anni fa era un miraggio, dall’altro ha costretto molti automobilisti a fare i conti con box e parcheggi sotterranei costruiti e dimensionati per i veicoli di una volta. Non si parla solo di larghezza (i posti auto in Italia hanno spesso dimensioni ridicole…) ma anche di lunghezza. Ecco quindi che più d’uno riveste il fondo del box con strisce in materiali morbidi come le schiume, perché inevitabilmente, per farci entrare tutta l’auto, una volta si e una volta no urta la parete di fondo.

L’elettronica, che ha dimostrato di avere una soluzione per tutto, naturalmente ce l’ha anche per questo problema; ve lo dimostriamo in questo articolo, dove proponiamo un sistema di misura basato sulla tecnologia ST Flight Sense (ToF) per il rilevamento di prossimità implementata da uno specifico integrato della ST stessa e dotato di un visualizzatore anulare a LED che cambia colore a seconda della distanza. Qualcosa, quindi, di simile ai sensori di parcheggio montati sulle auto, che però stavolta è fisso sulla parete di fondo del posto auto.

Quando ci avviciniamo, i LED si accendono a luce verde, poi man-mano divengono gialli, quindi rossi e, appena la distanza si riduce al minimo, lampeggiano di rosso indicando che occorre fermarsi.

Il principio del tempo di volo

Per ottenere tutto questo ci avvaliamo di un recentissimo prodotto della ST, ovvero un misuratore di distanza a laser che possiamo considerare l’evoluzione di quello descritto nel fascicolo di aprile 2017, cui rimandiamo chi volesse conoscere nel dettaglio fondamenti e teoria di funzionamento dei sensori basati sul tempo di volo (ToF) degli impulsi laser.

Per effettuare una misura, invia contro l’oggetto o parete da rilevare un raggio di luce e rileva la riflessione su di essa; ciò funziona solo se la superficie dell’oggetto o la parete non assorbono eccessivamente ciò che li investe. La misura si basa sul conteggio del tempo impiegato da un impulso ad andare da un emettitore alla superficie dell’oggetto da rilevare, quindi a tornare al sensore; la distanza (d) si determina come prodotto della velocità di propagazione dell’impulso (v) per la metà di tale tempo (t) secondo la relazione:

d = v x t/2

La velocità di propagazione della luce nell’aria si approssima a quella nel vuoto: 300.000 km/s.

Tempi di risposta e precisione della misura

La misura avviene così: quando si alimenta il diodo laser, si triggera un contatore che viene bloccato nel momento in cui il dispositivo ricevente viene eccitato dalla radiazione riflessa dall’oggetto sul rispettivo sensore.

Il tempo così conteggiato risente del tempo di risposta dell’emettitore (quello che passa dall’instante in cui si fornisce alimentazione a quello in cui la radiazione appare dalla superficie emittente) e di quello del sensore ricevente (tempo che intercorre da quando i fotoni componenti la radiazione investono la superficie sensibile a quando si registra il segnale elettrico corrispondente). Altro elemento che introduce tolleranza nella misura è la latenza del contatore e dei dispositivi logici frapposti. Tali tempi, considerati i brevissimi intervalli di viaggio dell’impulso di luce, devono essere ridottissimi.

Un metodo utile a limitare l’errore (così da elevare la precisione, specie sulle piccole distanze) consiste nel posizionare un secondo sensore di luce rivolto verso l’emettitore (ma senza coprire la superficie emittente di quest’ultimo) in modo che rilevi la luce nel momento in cui esce; ciò compensa sia il ritardo di risposta dell’emettitore che quello del sensore.

Il sensore VL53L0X

Dopo questa introduzione entriamo nel vivo del progetto, che risulta composto dall’integrato VL53L0X, montato su una breakout board della quale pubblichiamo lo schema elettrico, interfacciato con un microcontrollore che, nello specifico, è quella della piccolissima ed essenziale Beetle; a completare il progetto abbiamo un anello di LED neopixel, che ci permetterà di fornire le indicazioni visive del caso, ovvero che si illuminerà del colore corrispondente alla distanza rilevata.

La tecnologia ST Flightsense

Prima di vedere il sistema completo, dedichiamoci un attimo alla breakout board contenente il sensore di distanza ed al sensore stesso, che consente la misura fino 2 m con una precisione di pochi mm. Il nostro sensore, che si basa sulla tecnologia ST Flightsense, integra in un unico case SMD un sensore di luce di tipo Photon Avalanche Diode (SPAD) array, un sensore di luce ambiente (ALS=Ambient Light Sensor) tradizionale ad alta sensibilità (da 1 Lux a 100.000 Lux) e un emettitore a diodo laser di classe 1 del tipo Vertical Cavity Surface-Emitting Laser (VCSEL) che opera sulla lunghezza d’onda di 940 nm, quindi nel profondo infrarosso.

Indipendenza dal coefficiente di riflessione

L’architettura del sensore è tale che misure e rilevamenti sono praticamente indipendenti dal coefficiente di riflessione della luce della superficie da rilevare, grazie a una speciale circuitazione che consente di regolare il guadagno dello stadio ricevente e la luce nell’ambiente e di far emettere impulsi brevissimi.

Il dispositivo, dalla parte del sensore di luce (vedere la Fig. 1) incorpora un secondo rivelatore di luce che serve a determinare la luminosità dell’ambiente, così da ottenere un segnale che viene sottratto, perché uniforme, a quello impulsivo derivante dal ritorno dell’impulso laser riflesso; in questo modo l’ampiezza del segnale ottenuto rispecchia fedelmente la distanza.

Fig. 1 L’integrato misuratore della ST: a sinistra vedete lo schema a blocchi, mentre la figura a destra evidenzia, accanto alla finestrella per il rilevatore di luce (quella in basso), il foro cui si affaccia il sensore di luce ambiente. A sinistra vedete lo schema a blocchi dell’integrato.

In altre parole, è facile discriminare la luminosità nell’ambiente conoscendo la partenza degli impulsi di luce e attendendo il loro arrivo, mentre la luce ambiente è abbastanza costante.

Geometria di emissione e ricezione

La Fig. 2 schematizza il funzionamento del sensore: il cono rosa rappresenta la luce IR emessa dal laser e in verde vediamo il cono di ricezione del sensore, con i relativi angoli di apertura; notiamo che l’angolo di ricezione del fotosensore è nettamente superiore a quello di emissione del laser, che idealmente dovrebbe essere nullo, in quanto la soluzione migliore sarebbe emettere un raggio che non si apre, collimato all’infinito. In pratica un fascio conico consente di individuare con più facilità gli oggetti, specie quelli di piccole dimensioni.

Fig. 2 Struttura del sensore ST: il cono della luce emessa dal LED è ristretto rispetto all’apertura del sensore SPAD.

L’eliminazione della luce riflessa è in questo caso fondamentale, non tanto per il livello di disturbo che sovrappone al segnale di ritorno, quanto, piuttosto, per il calcolo del tempo di volo dell’impulso di luce, giacché l’onda riflessa all’interno del vetro arriverebbe prima della luce riflessa dall’oggetto di cui rilevare la distanza, determinando un errore di misura in difetto (la distanza misurata sarebbe inferiore).

Il rilevamento del VL53L0X

Vediamo ora, con l’aiuto della Fig. 3, in che modo avviene il rilevamento da parte del VL53L0X: il diodo laser (Emitter) emette impulsi di luce periodici dei quali una parte viene riflessa dal Target Object (oggetto o parete di cui rilevare la distanza) fino a tornare al sensore; sincronizzando l’emissione con l’attesa degli impulsi, è possibile rimuovere il disturbo determinato dalla luminosità nell’ambiente, elevando la sensibilità del dispositivo. La differenza sostanziale tra il VL53L0X e i tipici misuratori IR di prossimità sta nel fatto che questi ultimi si basano sull’intensità dell’onda riflessa, il che li rende poco affidabili perché essa dipende dal coefficiente di riflessione della superficie dell’oggetto da rilevare.

Fig. 3 Schematizzazione del funzionamento della famiglia di dispositivi VL53L0X.

Il fotodiodo SPAD

La peculiarità del diodo rivelatore, ossia il Single Photon Avalance Diode, è che funziona in polarizzazione inversa nella porzione di caratteristica corrispondente all’innesco dell’effetto valanga: mantenendo il diodo a una tensione anodo-catodo prossima a quella di breakdown, quando la superficie viene colpita dalla luce, il primo fotone di quest’ultima innesca la conduzione per effetto valanga e la corrente incrementa fortemente, per poi annullarsi quando la tensione scende sotto quella di breakdown. A questo punto serve un ulteriore fotone per innescare la conduzione. Disponendo un array di questi diodi si riesce a conteggiare i fotoni.

Schema elettrico della breakout board

Diamo adesso uno sguardo alla breakout board contenente il sensore VL53L0X, dove oltre all’integrato, troviamo un regolatore di tensione lineare a basso drop-out (U1) e un adattatore a MOSFET per l’interfaccia I²C-Bus utile a traslare i livelli logici 0/2,8 V dell’integrato per adattarli ai TTL standard di schede a logica tradizionale e ad Arduino.

Il traslatore di livello I²C

Per spiegare come funziona il traslatore partiamo dal clock, che sul lato dell’U2 fa capo alla linea del piedino 10, mentre verso il pin-strip di connessione è collegato a SCL (entrambe le linee sono provviste di un resistore di pull-up): quando SCL del connettore è a livello logico alto, il diodo di protezione interno al MOSFET (posto tra drain e source) è interdetto perché il source si trova negativo (è a 2,8 volt) rispetto al drain (che è mantenuto a 5 volt da R5) e pur se l’impulso non giunge all’SCL dell’U2, quest’ultimo è ad 1 logico. Invece quando il contatto SCL del pin-strip è a zero logico (0 V), il MOSFET è ancora interdetto (perché il suo gate è polarizzato con 2,8 volt) ma conduce il suo diodo di protezione, dato che il source è a 2,8 V mentre il catodo è a zero, quindi il livello basso su SCL trascina a zero logico (0,6 per l’esattezza) il piedino 10 del VL53L0X. Il canale SCL è unidirezionale, quindi la situazione opposta non si presenta, cioè U2 riceve il clock dall’host.

Passiamo adesso all’SDA, analizzando il caso in cui è l’host a inviare i dati: quando SDA è a zero logico, il diodo di protezione del Q2 conduce e trascina a 0,6 V il source e con esso il piedino 9 dell’U2; invece quando è a 5 volt, MOSFET e diodo sono interdetti, quindi SDA del VL53L0X è portata a 2,8V (livello alto) dal resistore di pull-up R7.

Se invece è l’U2 a trasmettere, quando pone il proprio piedino 9 a zero logico il MOSFET Q2 conduce fra drain e source, perché il suo source è a zero volt mentre il gate è a 2,8V, quindi la sua corrente di drain trascina a circa 0V l’SDA del connettore, a causa della caduta sul resistore di pull-up R6; invece quando il pin 9 dell’U1 è a livello alto (2,8 V) il source e il gate sono equipotenziali e il MOSFET rimane interdetto, lasciando che sia il resistore di pull-up R6 a mantenere a 1 logico (ma a 5 volt) la linea SDA che porta al pin-strip.

Il regolatore di tensione

Quanto al regolatore di tensione, è un MIC5504-2.8YM5-TR della Micrel, ossia un LDO da 2,8V di uscita (alimentabile all’ingresso tra 2,5 e 5V) capace di erogare 500 mA di corrente, incapsulato in contenitore SOT-23 e che presenta tra i piedini IN e OUT una caduta di tensione minima di 160 millivolt; è molto stabile in temperatura e integra una protezione dal cortocircuito all’uscita e dall’eccesso di temperatura, oltre che una dall’inversione di polarità all’ingresso.

L’integrato può essere posto in shutdown ponendo il suo piedino EN a 0 logico.

Comunicazione I²C e configurazione dei GPIO

La comunicazione con il dispositivo host, tipicamente un microcontrollore, avviene sull’I²C-Bus formato dai piedini SCL (5) e SDA (6), rispettivamente clock e canale dati bidirezionale; attraverso il bus (che funziona alla frequenza di 400 kHz) è possibile impostare modalità di funzionamento, sensibilità ecc., ma anche leggere il risultato della misura. In tema di modalità di funzionamento, va detto che il dispositivo può effettuare la misura con una certa periodicità impostabile, sia su richiesta (modalità che consente di ottimizzare i consumi, derivanti in gran parte dall’accensione del laser).

Prima di concludere la descrizione dello schema elettrico soffermiamoci un istante sui GPIO del VL53L0X, che possono essere configurati attraverso appositi comandi inviati via I²C-Bus; l’impostazione per il nostro progetto è contenuta nell’apposita libreria scaricabile dal nostro sito www.elettronicain.it insieme agli altri file del progetto. In essa:
• GPIO0: cambia di stato ad acquisizione terminata e può essere utilizzato per comunicare al microcontrollore Host che può leggere la misura;
• GPIO1, se portato a GND manda in standby il dispositivo ST; una volta portato in tale condizione, U1 può essere riattivato reinviandogli da I²C-Bus la configurazione richiesta per la misura (non basta quindi riportare il GPIO a livello alto).

Il VL53L0X viene alimentato attraverso i piedini AVDD (positivo) e GND (massa) per la sezione ricevente e AVDD_VCSEL e AVSS-VCSEL per il diodo laser.

La libreria di gestione del VL53L0X si scarica, oltre che dal nostro sito www.elettronican.it insieme agli altri file del progetto, da https://github.com/pololu/vl53l0x-arduino. Per poterla utilizzare, dopo averla scaricata dovete copiare la cartella contenuta nel file .zip all’interno della directory “libraries” dove è installato l’ambiente Arduino. Idem per la libreria di gestione dell’anello Neopixel.

L’assistente di parcheggio

Bene, ora che conoscete tutto della breakout board vediamo, con riferimento al disegno di cablaggio, come è stato realizzato il nostro sistema. La piccola Beetle ci basta perché utilizziamo solamente quattro I/O, ossia due per l’I²C-Bus con cui la piccola Arduino dialoga con la breakout board e una per il canale dati necessario a gestire l’anello neopixel, che nello specifico è un RING16NEOPIXEL, formato da 16 LED RGB di tipo neopixel (abbiamo già utilizzato più volte in passato questi speciali LED “intelligenti”). Il tutto si alimenta con la tensione applicata alla Beetle.

Il firmware

Quanto agli aspetti firmware, il progetto viene gestito con lo sketch (VL53L0X_Garage_v2) di cui trovate la porzione più rilevante nel Listato 1, il quale carica le librerie di gestione del VL53L0X e dell’anello neopixel, dopo aver inizializzato la connessione seriale e poi carica la libreria I²C-Bus per comunicare con la breakout board, quindi inizia a interrogare ciclicamente quest’ultima e a porsi in ascolto dei dati corrispondenti; lo stesso sketch invierà sulla porta seriale aperta per Arduino i dati sui Lux rilevati e la distanza dall’oggetto. Lo sketch inizializza anche la linea (pin 11) per pilotare l’anello di LED.

Notate che il sensore ha una portata predefinita di 1,2 metri; per elevarla ai 2 metri massimi dichiarati è necessario configurarlo con un apposito comando. Va inoltre considerato che i due metri si raggiungono negli ambienti chiusi e non all’esterno. Meno luce c’è e più sarà accurata la lettura, ma a noi poco interessa perché di norma il sistema verrà utilizzato in box e nei parcheggi coperti e sotterranei.

Lo sketch è scritto per un anello da 16 LED, ma nulla vieta di usarne uno più grande o diversi abbinati tra loro: allo scopo bisogna modificare l’istruzione #define PIXEL_COUNT 16.

Le soglie di colore

Quando il veicolo entra, viene rilevato ad una distanza di almeno 1,2 metri (valore impostato nello sketch) e automaticamente si illumina l’anello neopixel di verde, un LED per volta fino ad avere tutti i LED accesi. Avvicinandosi la macchina al muro (al sensore) cambia di conseguenza il colore del segnalatore luminoso; per l’esattezza, la luce è:
• verde: tra 120 e 60 cm;
• giallo: tra 60 e 30 cm;
• rosso: fra 30 e 15 cm;
• rosso lampeggiante: al di sotto dei 15 cm.

Da luce verde a gialla i LED si spengono gradualmente.

Se il veicolo si ferma, dato che viene rilevata sempre la stessa posizione (l’anello rimane sullo stesso colore), eseguito un certo numero di cicli (variabile MAX_ON nello sketch) il segnalatore si spegne. Attualmente nello sketch il tempo per lo spegnimento è impostato a circa 30 secondi, ovvero “MAX_ON * (DELAY_CYCLE +100)” dove 100 è un delay fisso presente nei vari cicli. Appena viene rilevato un cambiamento nella distanza il firmware riattiva il sistema. Tale artificio consente di limitare i consumi elettrici all’indispensabile.

Long Range e shutdown

Va precisato che il firmware è predisposto per i range sopra indicati, ma per una maggior precisione e per evitare errate rilevazioni, non è stato attivato il Long Range del sensore (fino a 2 metri); in questo modo la portata massima sarà 1,2 m, ma è un valore più che valido in un garage. Qualora si desiderasse attivare il Long Range, dovrà essere solo tolto il commento all’istruzione “#define LONG_RANGE” e quindi ricaricato il firmware sulla scheda.

Notate che il firmware prevede la possibilità di gestire lo shutdown della breakout board attraverso l’istruzione int pwrPin = 13 che imposta il pin 13 per agire sulla linea SHD.

Listato 1

#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_NeoPixel.h>
#define PIXEL_PIN 11 //Pin usato per pilotare il NeoPixel
#define PIXEL_COUNT 16 //Numero di NeoPixel da gestire
//#define LONG_RANGE //Attivare se si vuole che il ToF rilevi fino a 2m
//(non consigliato in ambienti luminosi) ivece di
//1.2m (consigliato per uso interno)
VL53L0X sensor;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

int val_max = 60;//Valore di luminosità (fino a 255)
int distance = 0;//valore di distanza letto dal ToF
int num_R = 0; //Numero accensioni colore rosso nello stesso range
int num_Y = 0; //Numero accensioni colore giallo nello stesso range
int num_G = 0; //Numero accensioni colore verde nello stesso range
int num_led_on = 0; //Variabile di comodo su alcuni effetti
//Se lo stesso colore rimane attivo per MAX_ON cicli, si spegne il
//segnalatore. Il tempo è in linea di massima definito da //MAX_ON * (DELAY_CYCLE + 100ms) (secondi)
int const MAX_ON = 200;
int const ALARM1 = 150; //Soglia allarme 1
int const ALARM2 = 300; //Soglia allarme 2
int const ALARM3 = 600; //Soglia allarme 3
int const ALARM4 = 900; //Soglia allarme 4
int const ALARM5 = 1200; //Soglia allarme 5
int const DELAY_CYCLE = 50; //Tempo di pausa in ms
int const DATO_OK = 4; //Numero di dati che devono essere validi per
//accendere l’indicatore. Serve per eliminare
//possibili spike dovuti alla luce

void setup()
{
strip.begin();
strip.show(); //Inizializzazione Pixel
Serial.begin(9600);
Wire.begin();
sensor.init();
sensor.setTimeout(500);
#if defined LONG_RANGE
//lower the return signal rate limit (default is 0.25 MCPS)
sensor.setSignalRateLimit(0.2);
//increase laser pulse periods (defaults are 14 and 10 PCLKs)
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
sensor.startContinuous();
}

void loop()
{
distance = sensor.readRangeContinuousMillimeters();
if (distance < ALARM1) //Se distanza minore di 15cm accendo colore rosso
{
if (num_R<MAX_ON)
{
num_R=num_R+1;
num_Y=0;
num_G=0;
//Accensione immediata perchè ostacolo troppo vicino
Colore(1,2,distance,ALARM1,0);
}
}
//Se distanza tra 15cm e 30cm accendo colore giallo
if ((distance > ALARM1) && (distance <= ALARM2)) {
if (num_R<MAX_ON)
{
num_R=num_R+1;
num_Y=0;
num_G=0;
//Accendo led solo con un numero DATO_OK di dati nello stesso range
if (num_R>=DATO_OK) Colore(1,1,distance,ALARM2,ALARM1);
}
}
//Se distanza tra 30cm e 60cm accendo colore giallo
if ((distance > ALARM2) && (distance <= ALARM3))
{
if (num_Y<MAX_ON)
{
num_R=0;
num_Y=num_Y+1;
num_G=0;
if (num_Y>=DATO_OK) Colore(2,1,distance,ALARM3,ALARM2);
}
}
//Se distanza tra 60cm e 90cm accendo colore verde
if ((distance > ALARM3) && (distance <= ALARM5))
{
if (num_G<MAX_ON)
{
num_R=0;
num_Y=0;
num_G=num_G+1;
if (num_G>=DATO_OK) Colore(3,4,distance,ALARM5,ALARM3);
}
}
if (distance > ALARM5) //Se distanza superiore a ALARM5 spengo segnalatore
{
num_R=0;
num_Y=0;
num_G=0;
Colore(0,1,distance,0,0);
}
if ((num_R>=MAX_ON) || (num_Y>=MAX_ON) || (num_G>=MAX_ON))
{
Colore(0,1,distance,8000,ALARM5);
}
if (sensor.timeoutOccurred()) { Serial.print(“ TIMEOUT”); }
delay(DELAY_CYCLE);
}

//Imposta il colore e la modalità di accensione
void Colore(int col, int mode, int dist, int alarm_MAX, int alarm_MIN)
{
uint32_t R;
uint32_t G;
uint32_t B;
switch(col)
{
case 0: //Tutto Spento
R=0;
G=0;
B=0;
break;
case 1: //Rosso
R=val_max;
G=0;
B=0;
break;
case 2: //Giallo
R=val_max;
G=val_max/2;
B=0;
break;
case 3: //Verde
R=0;
G=val_max;
B=0;
break;
}
switch(mode)
{
case 1:
num_led_on=0;
ColorOn(strip.Color(R, G, B)); //Accensione fissa
break;
case 2:
num_led_on=0;
ColorBlink(strip.Color(R, G, B)); //Colore lampeggiante
break;
case 3:
ColorCircleSingle(strip.Color(R, G, B)); //Accensione ciclica
break;
case 4:
ColorDistance(strip.Color(R, G, B),dist,alarm_MAX,alarm_MIN);
break;
}
}

//Accensione graduale del colore in base alla distanza in cui ci si trova
void ColorDistance(uint32_t c, int dist1, int almax, int almin)
{
double val1;
double val2;
uint16_t i;
val1=almax-almin;
val1=val1/PIXEL_COUNT;
val2=dist1-almin;
val2=almax-val2;
val2=val2-almin;
val2=val2/val1;
if (num_led_on==0)
{
for(i=0; i<strip.numPixels(); i++) //spengo tutti i led
{
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
//Accendo solo i led in base alla distanza (più vicino al muro si ha un
//numero di led accesi maggiori)
for(i=0; i<val2; i++)
{
strip.setPixelColor(i, c);
}
strip.show();
delay(100);
}
}

Piano di montaggio

Elenco componenti

R1: 47 kohm (0201)
R2,R3: 1 kohm (0201)
C1: 100 nF ceramico (0201)
Q1: SI2302DS
Q2: BCR112
D1: BAS316
D2: LED giallo (0201)
U1: PIC10F320T-I/OT (MF1341)

Varie:
- Strip maschio 6 vie
- Strip maschio 3 vie
- Strip maschio 2 vie
- Circuito stampato S1341
(16 x 11 mm)

Schema di cablaggio

Realizzazione pratica

Concludiamo questo articolo con la costruzione; partiamo dalla breakout board (in virtù della complessità del montaggio abbiamo deciso di renderla disponibile già montata…) che inizia dalla preparazione del circuito stampato, a doppia faccia, per la quale sul nostro sito www.elettronicain.it rendiamo disponibili per il download le tracce lato rame.

Preparazione e saldatura SMD

Incisa e forata la basetta, bisogna provvedere al montaggio, che richiede un minomo di attrezzatura, visto che i componenti sono per montaggio superficiale e che il sensore ToF è in case GAL, con contatti di sotto. Procuratevi quindi un saldatore a punta fine, del filo di lega saldante da 0,5 mm max di diametro, della pasta flussante poco densa e un pennellino per spargerla, oltre a una pinzetta per manipolare i componenti e una lente d’ingrandimento per verificare che siano prima posizionati e poi saldati correttamente. Vi farà comodo anche della trecciola dissaldante per rimuovere eventuali eccedenze di stagno, che potrebbero cortocircuitare pin o piazzole attigue.

Per saldare il VL53L0X occorre una stazione ad aria calda. Il montaggio va iniziato dal VL53L0X, stagnando e poi cospargendo di flussante le piazzole corrispondenti sulla scheda; poi se avete una piastra riscaldante sospendetevi a distanza adeguata il PCB, altrimenti scaldate la scheda dal lato opposto a quello dei componenti, con aria a 260 °C, per una decina di secondi, poi appoggiate lo stampato su un tavolo (non in plastica…) e dopo aver posizionato il chip con una pinzetta ben centrato nei rispettivi fori, scaldatelo con il getto d’aria calda finché non lo vedete “scendere” sulle piazzole. In quel momento rimuovete l’aria calda e spegnete la stazione.

Ora passate ai chip di resistenze e condensatori, poi posizionate il regolatore di tensione ben centrato nelle rispettive piazzole (spalmate con pasta flussante) e orientato come mostra il piano di montaggio; procedete con i MOSFET e terminate con il pin-strip che permette le connessioni con la Beetle.

Nell’utilizzare il flussante fate attenzione a non sporcare i fori sulla superficie del VL53L0X, che devono restare liberi e puliti, pena il malfunzionamento del sistema di rilevamento e misura della distanza. A montaggio terminato, con la lente d’ingrandimento verificate che tutti i componenti siano a posto, ben saldati (le saldature ben riuscite sono lucide, mentre quelle opache sono a rischio di ossidazione e falso contatto…) e centrati nelle rispettive piazzole; controllate anche che non vi siano baffi di stagno a creare cortocircuiti.

Assemblaggio finale

Una volta realizzata la breakout board sensore dovete collegarla alla Beetle come indicato nello schema di cablaggio e connettere poi la Beetle all’anello di LED; il tutto lo alimenterete fornendo 5V stabilizzati solo alle piazzole + e – della piccola Arduino, giacché da questa poi i 5V raggiungeranno sia la breakout board che l’anello Neopixel.

Per il progetto abbiamo realizzato un contenitore stampato in 3D con il PLA, o meglio, due contenitori da unire mediante una canalina rettangolare in PVC per impianti elettrici. Nel contenitore superiore inserirete il display formato dall’anello di LED neopixel e dall’Arduino Beetle ed in quello inferiore contenete la breakout board; quest’ultimo “corpo” andrà posizionato alla tipica altezza del paraurti del veicolo, così da rilevare la distanza che più ci interessa, vale a dire quella dalla parte più sporgente. Fatto ciò siete pronti per godervi il vostro assistente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Menu