In questo articolo vi mostriamo la realizzazione di un dispositivo che può essere usato nelle sessioni terapeutiche EMDR..
Questo si compone di una striscia luminosa dove la luce si sposta da destra verso sinistra e viceversa ad una velocità predefinita che il paziente deve seguire con gli occhi durante la seduta. L’avvio e la velocità sono gestite da uno smartphone Android dove un App controlla il dispositivo tramite il bluetooth.
Maggiori informazioni su questa particolare terapia potete trovarla sul sito di EMDR Italia.
Per il progetto abbiamo utilizzato:
LO SCHEMA ELETTRICO
Il dispositivo può essere alimentato direttamente dalla connessione USB di arduino oppure da una batteria da 9V, in questo caso abbiamo previsto un interruttore per l’interruzione dell’alimentazione. Il positivo della batteria è collegato al pin VIN di arduino che, come indica la documentazione, può ricevere una tensione da 6 a 20V che poi stabilizzerà internamente a 5V e 3.3V. I 5V volt in uscita (PIN 5V) sono utilizzati per alimentare la striscia led (i led accesi contemporaneamente nella striscia saranno solo due o tre, quindi l’amperaggio fornito da arduino sarà più che sufficiente). I 3.3V sono invece utlizzati per alimentare il modulo bluetooth.
Il pin D10 è utilizzato per comunicare con la striscia led. La comunicazione avviene con l’ausilio della libreria Adafruit_NeoPixel (da installare in Arduino IDE)
I pin D9 e D8 sono utilizzati per comunicare in seriale con il modulo bluetooth.
IL CODICE
Il codice è disponibile su github
Fra le definizioni notiamo NP_FIRST e NP_LAST che indicano il primo e l’ultimo led della striscia da utilizzare, WAKE_LENGTH indica il numero di led che compone il cursore luminoso e l’array wake[WAKE_LENGTH] contiene le loro luminosità che, in questo caso, sono decrescenti dal primo all’ultimo.
#define NP_FIRST 2 // first led to use in strip
#define NP_LAST 47 // last led to use in strip
#define WAKE_LENGTH 3 // number of led in wake
Fra le definizioni compaiono poi i comandi previsti dal protocollo di comunicazione elaborati nella funzione readBT().
// commands sent through bluetooth
#define BT_START 105
#define BT_STOP 115
#define BT_CHECK_STATUS 120
#define BT_CHECK_SPEED 121
#define BT_ERROR 122
L’istruzione bt.write("AT+NAMEEMDR") nella fase di setup imposta il nome del dispositivo visibile nella connessione bluetooth.
All’interno della funzione loop() si controlla se lo stato è attivo (led in movimento) nel qual caso si calcola la direzione e la nuova posizione del primo led da accendere. Si spenge l’ultimo led del ciclo precedente e si accendono i led dell’array wake.
if(status) {
if(direction==OUTWARD) {
if(np_index == NP_LAST){
np_index = NP_LAST-1;
direction = INWARD;
}
else
np_index++;
}
else {
if(np_index == NP_FIRST){
np_index = NP_FIRST + 1;
direction = OUTWARD;
}
else
np_index--;
}
// clear last wake's led
strip.setPixelColor(last_pixel, 0, 0, 0);
for(int i=0;i<WAKE_LENGTH;i++) {
strip.setPixelColor(np_index-(direction*i), 0, wake[i], 0);
}
// next led to be clear
last_pixel = np_index-(direction*(WAKE_LENGTH-1));
strip.show();
Infine si controlla se tramite il modulo bluetooth è arrivato qualche comando, in caso contrario si attende per ms_delay millisecondi prima di ricominciare un nuovo ciclo.
if(readBT() == 0) // if incoming command no need to delay!
delay(ms_delay);
La funzione convertSpeed2Ms() converte il valore della velocità ricevuto via bluetooth (1=lento 100=veloce) nei millisecondi di attesa nel ciclo principale. La funzione convertMs2Speed() fa l’operazione opposta.
// convert speed value (1-100) to ms for delay
int convertSpeed2Ms(int speed) {
speed = 101-speed;
float f = SLOWEST - FASTEST;
return (int)(f*speed/100)+FASTEST;
}
// convert delay ms to speed (1-100)
int convertMs2Speed(int ms) {
float f = SLOWEST - FASTEST;
int speed = (int)(((ms-FASTEST)*100)/f)-FASTEST;
return 101-speed;
}
L'APPLICAZIONE
Il codice dell'applicazione e disponibile su github
Prima di avviare l'applicazione è necessario attivare il Bluetooth ed eseguire l'associazione con il dispositivo. Questo comparirà fra quelli disponibili con il nome 'EMDR'
Adesso si può avviare l'applicazine e premere lo switch per la connessione. Se questa riesce apparira al centro un controllo circolare. Al primo avvio sarà di colore rosso che vuol dire che il dispositivo è in fase di stop. premendo nel centro si comunica l'avvio ed il controllo diventa verde. Adesso è possibile variare la velocità ruotando il cerchio esterno di color più chiaro ad ogni rilascio la nuova velocità verrà comunicata al dispositivo.
Qualora la comunicazione non sia possibile il controllo esegue un lampeggio rosso e sarà necessario ripetere di nuovo l'operazione.
Se la connessione con il dispositivo si interrompe o viene volutamente chiusa. è sufficiente riattivare lo switch di connessione per riavere il controllo nella situazione precedente