Innehållsförteckning:

Ögonrörelsesspårning med infraröd sensor: 5 steg
Ögonrörelsesspårning med infraröd sensor: 5 steg

Video: Ögonrörelsesspårning med infraröd sensor: 5 steg

Video: Ögonrörelsesspårning med infraröd sensor: 5 steg
Video: Exercise Therapy as a Dysautonomia Management Tool 2024, November
Anonim
Eye Motion Tracking med infraröd sensor
Eye Motion Tracking med infraröd sensor

Jag använde en infraröd sensor för att känna av ögonrörelser och styra lysdioden.

Jag gjorde ögonbollar med LED Tape NeoPixel.

Steg 1: Konstitution

Konstitution
Konstitution

Jag använde två sensorer QTR - 1A för ögonspårning. Avkänning med Arduino och styrning av lysdioden.

komponenter

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Adafruit LiIon/LiPoly ryggsäckstillägg för Pro Trinket/ItsyBitsy
  • LiPo batteri
  • NeoPixel -remsa
  • QTR-1A reflektanssensor

Steg 2: NeoPixel LED Eye Ball

NeoPixel LED Eye Ball
NeoPixel LED Eye Ball
NeoPixel LED Eye Ball
NeoPixel LED Eye Ball

NeoPixel LED -tejp används. LED är 68 enheter.

LED är fixerad på skålen med dubbelsidig tejp och trådbunden.

Steg 3: Sensorenhet

Sensorenhet
Sensorenhet
Sensorenhet
Sensorenhet
Sensorenhet
Sensorenhet

Jag använde två sensorer QTR - 1A för ögonspårning. QTR - 1A placeras på ett plastark på ett avstånd av ungefär bredden på ögat.

Sensordelen och mikrokontrollerdelen fixerades på glasögonen med ett klipp respektive.

Steg 4: Arduino -kod

När iris närmar sig en sensor minskar det reflekterade ljuset och sensorvärdet ökar. Omvänt, när irisen rör sig bort, ökar det reflekterade ljuset och sensorvärdet för fotoreflektorn minskar.

Höger och vänster rörelse för pupillen i LED -ögongloben känner av ökningen och minskningen av ett sensorvärde och styr det. När de blinkar minskar båda sensorvärdena, så om de två sensorvärdena minskar samtidigt, kommer ögonlocken på LED -ögongloben att sjunka.

Jag använde följande bibliotek.

  • QTRsensorer:
  • Adafruit_NeoPixel:

#inkludera #inkludera

#define NUM_SENSORS 2 // antal sensorer som används#definiera NUM_SAMPLES_PER_SENSOR 10 // medelvärde#definiera EMITTER_PIN QTR_NO_EMITTER_PIN

int iniSensorValL, sensorValL; int iniSensorValR, sensorValR; #define PIN A3 Adafruit_NeoPixel led = Adafruit_NeoPixel (68, PIN, NEO_GRB + NEO_KHZ800); int blackNum = 24; int pupilNum = 12; uint32_t färg; int ljusstyrka = 40; byte eyeColor; int LR = 7; booleskt lock = falskt; int cnt = 0;

// Black eye L&R animationint 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}, {4, 19, 20, 25, 42, 47, 48, 63, 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}, {21, 23, 44, 46, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};

// elev 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 ögonlock = 0; int eyelidNum [8] = {0, 4, 8, 16, 24, 34, 44, 56}; int eyelidLED [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 ((osignerad tecken ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); osignerad int sensorValues [NUM_SENSORS];

void blink (int ögonlock, int LR) {if (ögonlock! = 8) {// Tenn för (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Svart öga för (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , färg);}

// elev för (uint16_t i = 0; i

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

// ögonlock för (int i = 0; i <eyelidNum [ögonlock]; i ++) {led.setPixelColor (ögonlockLED , 0); }} annat ifall (ögonlock == 8) {led.clear (); } led.show ();}

void setup () {

Serial.begin (115200); led.begin (); led.setBrightness (ljusstyrka); // Initial Brightness 40 led.show (); // Initiera alla pixlar till 'off' color = led. Color (0, 177, 55); // pupillfärgfördröjning (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; blinka (ögonlock, LR); }

void loop () {// QTR - 1A sensorvärde qtra.read (sensorValues); sensorValL = sensorValues [0]; sensorValR = sensorValues [1];

dubbel rasioL = (dubbel) sensorValL / iniSensorValL;

dubbel rasioR = (dubbel) sensorValR / iniSensorValR;

Serial.print (rasioL);

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

if (rasioL> 0,985 && rasioR <0,985) {// höger för (int i = LR; i <12; i ++) {blink (0, i); fördröjning (40); LR = i; }} annat om (rasioL 0.985) {// vänster för (int i = LR; i> 2; i-) {blink (0, i); fördröjning (40); LR = i; }} annat om (lid == false && rasioL <0,96 && rasioR <0,96) {// Blinkar nära för (int i = 1; i 0,96 && rasioR> 0,96) {// Blinkar öppet för (int i = 8; i > 0; i-) {blink (i, LR); fördröjning (40); lock = false; }} annars if (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++; // ögonlock = 0; om (LR <= 7) {för (int i = LR; i <= 7; i ++) {blink (0, i); fördröjning (40); LR = i; }} annat {för (int i = LR; i> = 7; i-) {blink (0, i); fördröjning (40); LR = i; }}}

// Uppdatera initialvärdet om (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Steg 5: Drift

Upptäck vänster och höger rörelse och blinka eleven med sensorn och styr ögonglobens LED.

Rekommenderad: