Sommario:

Rilevamento del movimento oculare tramite sensore a infrarossi: 5 passaggi
Rilevamento del movimento oculare tramite sensore a infrarossi: 5 passaggi

Video: Rilevamento del movimento oculare tramite sensore a infrarossi: 5 passaggi

Video: Rilevamento del movimento oculare tramite sensore a infrarossi: 5 passaggi
Video: Cablaggio e funzionamento di un sensore di movimento a raggi infrarossi 2024, Luglio
Anonim
Rilevamento del movimento oculare tramite sensore a infrarossi
Rilevamento del movimento oculare tramite sensore a infrarossi

Ho usato un sensore a infrarossi per rilevare i movimenti degli occhi e controllare il LED.

Ho realizzato bulbi oculari con LED Tape NeoPixel.

Fase 1: Costituzione

Costituzione
Costituzione

Ho usato due sensori QTR - 1A per il tracciamento oculare. Rilevamento con Arduino e controllo del LED.

componenti

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Zaino Adafruit LiIon/LiPoly aggiuntivo per Pro Trinket/ItsyBitsy
  • Batteria LiPo
  • Striscia NeoPixel
  • Sensore di riflettanza QTR-1A

Passaggio 2: bulbo oculare LED NeoPixel

Sfera oculare LED NeoPixel
Sfera oculare LED NeoPixel
Sfera oculare LED NeoPixel
Sfera oculare LED NeoPixel

Viene utilizzato il nastro LED NeoPixel. Il LED è di 68 unità.

Il LED è fissato alla ciotola con nastro biadesivo e cablato.

Passaggio 3: unità sensore

Unità sensore
Unità sensore
Unità sensore
Unità sensore
Unità sensore
Unità sensore

Ho usato due sensori QTR - 1A per il tracciamento oculare. QTR - 1A sono posti su un foglio di plastica ad una distanza di circa la larghezza dell'occhio.

La parte del sensore e la parte del microcontrollore sono state fissate agli occhiali rispettivamente con una clip.

Passaggio 4: codice Arduino

Quando l'iride si avvicina a un sensore, la luce riflessa diminuisce e il valore del sensore aumenta. Al contrario, quando l'iride si allontana, la luce riflessa aumenta e il valore del sensore del fotoriflettore diminuisce.

Il movimento destro e sinistro della pupilla del bulbo oculare LED rileva l'aumento e la diminuzione di un valore del sensore e lo controlla. Quando lampeggia, entrambi i valori del sensore diminuiscono, quindi se i due valori del sensore diminuiscono contemporaneamente, le palpebre del bulbo oculare LED si abbassano.

Ho usato la seguente libreria.

  • QTRsensors:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // numero di sensori utilizzati#define NUM_SAMPLES_PER_SENSOR 10 // media#define EMITTER_PIN QTR_NO_EMITTER_PIN

int iniSensorValL, sensoreValL;int iniSensorValR, sensoreValR; #define PIN A3 led Adafruit_NeoPixel = Adafruit_NeoPixel(68, PIN, NEO_GRB + NEO_KHZ800); int blackNum = 24; int numero pupilla = 12; uint32_t colore; int luminosità = 40; byte eyeColor; int LR =7; coperchio booleano = falso; int cnt = 0;

//Animazione occhio nero L&R in blackLED[15][24] = {{12, 32, 35, 55, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {12, 13, 31, 36, 54, 55, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {11, 13, 14, 30, 37, 53, 54, 56, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {10, 11, 14, 15, 29, 38, 52, 53, 56, 57, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, { 9, 10, 11, 12, 15, 16, 28, 33, 34, 39, 51, 52, 55, 56, 57, 58, 68, 68, 68, 68, 68, 68, 68, 68}, { 0, 8, 9, 10, 11, 12, 13, 16, 17, 27, 32, 35, 40, 50, 51, 54, 55, 56, 57, 58, 59, 67, 68, 68}, { 0, 1, 7, 8, 9, 10, 13, 14, 17, 18, 26, 31, 36, 41, 49, 50, 53, 54, 57, 58, 59, 60, 66, 67}, { 1, 2, 6, 7, 8, 9, 14, 15, 18, 19, 25, 30, 37, 42, 48, 49, 52, 53, 58, 59, 60, 61, 65, 66}, { 2, 3, 5, 6, 7, 8, 15, 16, 19, 20, 24, 29, 38, 43, 47, 48, 51, 52, 59, 60, 61, 62, 64, 65}, { 3, 4, 5, 6, 7, 16, 17, 20, 21, 23, 28, 39, 44, 46, 47, 50, 51, 60, 61, 62, 63, 64, 68, 68}, { 4, 5, 6, 17, 18, 21, 22, 27, 40, 45, 46, 49, 50, 61, 62, 63, 68, 68, 68, 68, 68, 68, 68, 68}, { 4, 5, 18, 19, 26, 41, 48, 49, 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, { 4, 19, 20, 25, 42, 47, 48, 63, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {20, 21, 24, 43, 46, 47, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {21, 23, 44, 46, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};

//pupil L&R animationint pupilLED[15][12] = {{33, 34, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}, {32, 33, 34, 35, 68, 68, 68, 68, 68, 68, 68, 68}, {12, 31, 32, 33, 34, 35, 36, 55, 68, 68, 68, 68}, {12, 13, 30, 31, 32, 33, 34, 35, 36, 37, 54, 55}, {13, 14, 29, 30, 31, 32, 35, 36, 37, 38, 53, 54}, {14, 15, 28, 29, 30, 31, 36, 37, 38, 39, 52, 53}, {15, 16, 27, 28, 29, 30, 37, 38, 39, 40, 51, 52}, {16, 17, 26, 27, 28, 29, 38, 39, 40, 41, 50, 51}, {17, 18, 25, 26, 27, 28, 39, 40, 41, 42, 49, 50}, {18, 19, 24, 25, 26, 27, 40, 41, 42, 43, 48, 49}, {19, 20, 23, 24, 25, 26, 41, 42, 43, 44, 47, 48}, {20, 21, 22, 23, 24, 25, 42, 43, 44, 45, 46, 47}, {21, 22, 23, 24, 43, 44, 45, 46, 68, 68, 68, 68 }, {22, 23, 44, 45, 68, 68, 68, 68, 68, 68, 68, 68}, {22, 45, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};

//Blink animationint palpebra = 0; int eyelidNum[8] = {0, 4, 8, 16, 24, 34, 44, 56}; int palpebra LED[56] = {64, 65, 66, 67, 58, 59, 60, 61, 56, 57, 62, 63, 49, 50, 51, 52, 47, 48, 53, 54, 38, 39, 40, 41, 46, 55, 36, 37, 42, 43, 26, 27, 28, 29, 35, 44, 24, 25, 30, 31, 15, 16, 17, 18, 34, 45, 23, 32, 13, 14, 19, 20, 6, 7, 8, 9}; QTRSensorsAnalog qtra((unsigned char) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS];

void blink(int palpebra, int LR) { if (palpebra != 8){ //Peltro for(uint16_t i=0; i<led.numPixels(); i++) { led.setPixelColor(i, led. Color(66, 66, 66)); }

//Occhio nero per(uint16_t i=0; i led.setPixelColor(blackLED[LR], colore); }

//allievo per(uint16_t i=0; i

led.setPixelColor(pupilLED[LR], led. Color(0, 0, 66)); }

//eyelid for(int i=0; i < eyelidNum[eyelid]; i++) { led.setPixelColor(eyelidLED, 0); } } else if (palpebra == 8){ led.clear(); } led.mostra();}

void setup() {

Serial.begin(115200); led.begin(); led.setBrightness(luminosità); // Luminosità iniziale 40 led.show(); // Inizializza tutti i pixel su 'off' color = led. Color(0, 177, 55); //ritardo colore pupilla(100); qtra.read(sensorValues); iniSensorValL = sensorValues[0]; iniSensorValR = sensorValues[1]; battito di ciglia(palpebra, LR); }

void loop() { //QTR - Valore del sensore 1A qtra.read(sensorValues); SensorValL = SensorValues[0]; SensorValR = SensorValues[1];

double rasioL = (doppio)sensorValL / iniSensorValL;

double rasioR = (doppio)sensorValR / iniSensorValR;

Serial.print(rasioL);

Serial.print(" "); Serial.println(rasioR);

if(rasioL > 0.985 && rasioR < 0.985){ //right for(int i = LR; i < 12; i++){ blink(0, i); ritardo(40); LR = io; } }else if(rasioL 0.985){ //left for(int i=LR; i>2; i--){ blink(0, i); ritardo(40); LR = io; } }else if(lid == false && rasioL < 0.96 && rasioR < 0.96){ //Chiusura lampeggiante per(int i = 1; i 0.96 && rasioR > 0.96){ //Aperta for(int i = 8; i > 0; i--){ lampeggio(i, LR); ritardo(40); coperchio = falso; } }else if(lid == false && rasioL > 0,96 && rasioR > 0,96) { //normal //cnt++; //palpebra = 0; if(LR <= 7){ for(int i=LR; i<=7; i++){ lampeggio(0, i); ritardo(40); LR = io; } }else { for(int i=LR; i>=7; i--){ lampeggio(0, i); ritardo(40); LR = io; } } }

//Aggiornamento valore iniziale if (cnt > 10){ iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; } }

Passaggio 5: operazione

Rileva il movimento sinistro e destro e il lampeggio della pupilla con il sensore e controlla il LED del bulbo oculare.

Consigliato: