Progetto di un dispositivo indossabile anticollisione per ipovedenti

progetti

La navigazione senza vista è un problema sempre presente che colpisce gran parte della popolazione includendo persone permanentemente o temporaneamente cieche, persone che devono camminare al buio, e utenti in ambienti virtuali immersivi utilizzando la camminata reale per la navigazione. Questo articolo presenta una soluzione progettuale per mitigare questo problema, che si basa su un non complesso e non costoso dispositivo indossabile anticollisione basato su onde ultrasoniche per rilevare ostacoli e sul feedback vibro-tattile e acustico per avvisare l'utente della vicinanza di ostacoli. Questo dispositivo, sebbene svolga bene il suo compito, non deve essere considerato un vero presidio medico ma un prototipo che può essere utilizzato per scopi hobbistici.

Introduzione

La locomozione umana si basa sulla conoscenza che si possiede dell’ambiente, nonché sulle informazioni acquisite durante il movimento. Si basa principalmente sulla visione, ma è rafforzata dall'udito e, infine, dal tatto. Pertanto, il compito diventa molto più difficile per le persone cieche o ipovedenti. Gli individui in questa situazione tendono a camminare lentamente usando le mani per rilevare ostacoli vicini, eventualmente richiedendo l'aiuto di altri. Una sofisticata e più difficile impresa è l'uso dell'ecolocalizzazione. Questa tecnica utilizza rumore di fondo o suoni autoprodotti per rilevare gli ostacoli, ma solo un numero selezionato di persone sviluppa questa abilità. Le persone non vedenti devono prima imparare a conoscere l'ambiente muovendosi attraverso di esso, cosa che di solito viene fatta con l'aiuto di una guida umana o di un cane. In luoghi familiari si spostano spesso con l'aiuto di un bastone per scansionare l'area vicina, creando una sorta di campo visivo ravvicinato. Ma le persone non vedenti che si basano su metodi molto semplici come un bastone o un cane guida richiedono l'uso delle mani, impedendone l’uso per altre funzioni. Inoltre, mentre il bastone è utile per rilevare ostacoli e percorsi al livello del suolo, non può prevedere la collisione con ostacoli come rami di alberi e altri ostacoli di livello superiore al suolo. Comunque, bastone e cane guida possono sicuramente essere complementari al dispositivo anticollisione basato su sonar presentato in questo articolo. Il dispositivo viene posizionato sulla testa dell'utente utilizzando un casco dotato di supporto mobile che consente di regolare la direzione del campo visivo del dispositivo anticollisione. Quindi, il dispositivo rileva gli ostacoli entro il campo visivo guidando l’utente durante il cammino tramite un feedback vibro-tattile e sonoro avvisandolo della presenza di ostacoli.

Il progetto

Il dispositivo che andremo a realizzare aiuta le persone non vedenti e ipovedenti a navigare con maggiore tranquillità, velocità e sicurezza, mediante la tecnica sonar, ovvero utilizzando le onde ultrasoniche per rilevare gli ostacoli vicini e avvisare l'utente tramite vibrazioni e segnali acustici. Il principio di funzionamento si ispira ai pipistrelli che usano anche le onde sonore ad alta frequenza per orientarsi durante il volo. Trasmettono questi segnali nello spazio e dalle onde di ritorno riflesse dagli ostacoli che ricevono evitano la collisione. L’obiettivo di questo progetto è quello di realizzare un dispositivo economico ma efficiente (in alternativa o complementare ai metodi tradizionali anticollisione) per aiutare i non vedenti e gli ipovedenti a muoversi e camminare con maggiore velocità e sicurezza.

Il dispositivo anticollisione è completamente indipendente dall’intervento umano consentendo all’utente di avere le mani libere ed è basato sulla tecnica sonar. Tutto l’hardware è contenuto in un solo package, piccolo e leggero, che viene fissato su un apposito casco indossato sulla testa dell’utente in modo non fastidioso. Il casco integra un supporto mobile orientabile su cui viene fissato l’hardware e il sensore di distanza ad ultrasuoni. L’utente deve inoltre indossare un piccolo vibratore in modo che possa rilevare le vibrazioni prodotte a seguito del rilevamento di ostacoli. Il funzionamento a mani libere di questo dispositivo anticollisione consente agli utenti di camminare senza limitare i movimenti e la velocità. Come possiamo constatare osservando lo schema elettrico del progetto in Figura 1, il dispositivo è costituito dal sensore ad ultrasuoni HC-SR04 (U1), caricabatterie TP4056 (U2), microcontrollore Arduino Pro Mini (U3), motore di vibrazioni Haptic motor (MT1), cicalino (BUZ1), switch di accensione/spegnimento del dispositivo (SW1), partitore di tensione (R1-R2) e batteria al litio da 3,7 V (BAT1).

Schema elettrico del progetto

Figura 1: Schema elettrico del progetto

La parte fondamentale dell'elettronica del progetto è il sensore di distanza ad ultrasuoni HC-SR04 mostrato in Figura 2.

Sensore ad ultrasuoni HC-SR04

Figura 2: Sensore ad ultrasuoni HC-SR04

Come microcontrollore abbiamo scelto di utilizzare Arduino Pro Mini per le sue ridotte dimensioni rispetto alle altre schede Arduino. La Figura 3 mostra il layout della scheda di sviluppo Arduino Pro Mini. Nella Figura 4 viene riportata la disposizione e la funzione dei pin di Arduino Pro Mini.

Layout della scheda di sviluppo Arduino Pro Mini

Figura 3: Layout della scheda di sviluppo Arduino Pro Mini

 

Pin della scheda di sviluppo Arduino Pro Mini

Figura 4: Pin della scheda di sviluppo Arduino Pro Mini

E’ stato utilizzato un motore vibro-tattile in modo che la persona ipovedente possa ricevere un feedback di vibrazione, oltre ad un cicalino per la segnalazione sonora di presenza ostacoli. La Figura 5 riporta l’immagine di un generatore di vibrazioni, detto anche Haptic motor.

Generatore di vibrazioni Haptic motor

Figura 5: Generatore di vibrazioni Haptic motor

Il dispositivo è alimentato da una batteria ricaricabile agli ioni di litio da 3,7 V. Questa batteria viene ricaricata mediante la scheda di ricarica TP4056 collegata con cavo USB ad un computer o ad un power bank a 5 V. La Figura 6 mostra la scheda caricabatterie TP4056.

Scheda caricabatterie TP4056

Figura 6: Scheda caricabatterie TP4056

TP4056 è una piccola scheda caricabatterie lineare a corrente e tensione costante in grado di fornire una corrente di carica fino a 1 A per batterie agli ioni di litio o ai polimeri di litio a cella singola. In ingresso, può essere applicata una tensione da 4,5 V a 5 V. La tensione finale di carica è 4,2 V. Dopo questa sintetica descrizione dei componenti, andiamo a spiegare come funziona il dispositivo anticollisione. Il funzionamento del dispositivo è molto semplice. Ogni 50 ms il microcontrollore Arduino Pro Mini invia un segnale di trigger al sensore a ultrasuoni HC-SR04 e misura la durata dell'impulso di eco inviato al microcontrollore dal sensore HC-SR04; il segnale ECHO inviato dal sensore HC-SR04 viene ridotto a circa 3 V dal partitore R1-R2 poiché le porte del microcontrollore accettano tensioni fino a 3,3 V. Il programma calcola la distanza in base alla velocità del suono e al tempo impiegato dall'impulso per raggiungere l'ostacolo e ritornare. Se la distanza misurata è inferiore o uguale ad una preimpostata distanza di soglia (ostacolo rilevato), il programma attiva i segnali di allerta, ovvero il cicalino e il motore vibro-tattile, per un periodo di tempo prestabilito.

Descrizione del codice

Di seguito, sono descritte alcune parti del codice.

Le seguenti righe definiscono i pin di Arduino utilizzati per i vari componenti del circuito. TRIGGER_PIN è collegato al pin di attivazione del sensore a ultrasuoni HC-SR04, ECHO_PIN è collegato al pin eco del sensore, poi ci sono i pin buzzer e MOTOR_PIN di accensione rispettivamente del cicalino piezoelettrico e del motore vibro-tattile:

// Pin assignments
const int TRIGGER_PIN = 6;
const int ECHO_PIN = 5;
const int buzzer = 4;
const int MOTOR_PIN = 7;

Questa riga imposta una distanza di soglia in centimetri in riferimento alla quale se il sensore a ultrasuoni rileva un ostacolo posto alla distanza minore o uguale al valore di ALERT_DISTANCE corrispondente a 30 cm, il cicalino e il motore di vibrazione si attiveranno per avvisare l'utente:

// Threshold distances
const int ALERT_DISTANCE = 100; // Alert if object is within 30 cm

Questa sezione di codice definisce le costanti di tempo della durata di attivazione delle segnalazioni di allerta utilizzate nel programma. BUZZER_ON_TIME e MOTOR_ON_TIME impostano rispettivamente la durata di attivazione in millisecondi del cicalino e del motore vibro-tattile. LOOP_DELAY è l’intervallo di tempo tra le letture acquisite dal sensore ad ultrasuoni:

// Timing constants
const int BUZZER_ON_TIME = 500; // Buzzer on time in milliseconds
const int MOTOR_ON_TIME = 200; // Haptic motor on time in milliseconds
const int LOOP_DELAY = 50; // Main loop delay in milliseconds

La funzione setup() imposta la modalità di INPUT o OUTPUT dei pin definiti TRIGGER_PIN, ECHO_PIN, buzzer e MOTOR_PIN. Inoltre, imposta la comunicazione seriale del Monitor seriale di Arduino ad una velocità di 9600 bit/s, consentendo l'invio di messaggi di debug ad un computer collegato ad Arduino Pro Mini mediante adattatore FTDI:

void setup() {
// Set up pins
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(buzzer, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
// Start serial communication for debugging
Serial.begin(9600);
}

La funzione loop() legge ogni 50 ms i dati di distanza inviati dal sensore ad ultrasuoni e controlla se la distanza misurata è inferiore alla soglia ALERT_DISTANCE. Il circuito invia innanzitutto un segnale di trigger al sensore a ultrasuoni, poi misura la durata dell'impulso dell'eco risultante. Quindi, calcola la distanza in base alla velocità del suono e al tempo impiegato dall'impulso per raggiungere l'ostacolo e ritornare. Se la distanza misurata è inferiore o uguale alla distanza di soglia ALERT_DISTANCE, il programma attiva i segnali di allerta, il cicalino e il motore vibro-tattile, per un periodo di tempo prestabilito. Il segnale emesso dal cicalino viene generato utilizzando la funzione tone(), che genera un segnale ad onda quadra ad una determinata frequenza:

void loop() {

// Send ultrasonic pulse
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);

// Measure pulse duration
long duration = pulseIn(ECHO_PIN, HIGH);

// Calculate distance in cm
int distance = duration / 58;

// Debug output
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");

// Check for alerts
if (distance <= ALERT_DISTANCE) {
// Turn on buzzer and motor driver
tone(buzzer, 1000, 1000); // 1KHz
digitalWrite(MOTOR_PIN, HIGH);
delay(BUZZER_ON_TIME);
digitalWrite(MOTOR_PIN, LOW);
noTone(buzzer); // 1KHz
}
noTone(buzzer); // 1KHz
// Wait before taking another reading
delay(LOOP_DELAY);
}

Programmazione della scheda di sviluppo Arduino Pro Mini

La scheda Arduino Pro Mini non dispone di un connettore USB, per programmarla occorre utilizzare l’adattatore di comunicazione seriale FTDI. Poiché Arduino Pro Mini è disponibile sia nei modelli da 3,3 V che da 5 V, è fondamentale fornirgli la tensione di alimentazione corretta selezionandola mediante un ponticello, uno switch o semplicemente collegando il pin di alimentazione 3,3 V o 5 V indicati dalle serigrafie sul circuito stampato dell’FTDI. Quindi, prima di alimentare i dispositivi occorre accertarsi di aver impostato correttamente la tensione dell’FTDI, in quanto applicare 5 volt ad un Pro Mini da 3,3 volt può danneggiarlo irreversibilmente. Nel nostro caso, dato che nel progetto utilizzeremo la versione a 5 V di Arduino Pro Mini, imposteremo l’FTDI per fornire un’alimentazione a 5 V alla scheda.

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2745 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend