Indholdsfortegnelse:

Eye Motion Tracking Brug af infrarød sensor: 5 trin
Eye Motion Tracking Brug af infrarød sensor: 5 trin

Video: Eye Motion Tracking Brug af infrarød sensor: 5 trin

Video: Eye Motion Tracking Brug af infrarød sensor: 5 trin
Video: Tobii Eye Tracking | Useful for Dogfighting ? | Digital Combat Simulator | DCS | 2024, Juni
Anonim
Eye Motion Tracking ved hjælp af infrarød sensor
Eye Motion Tracking ved hjælp af infrarød sensor

Jeg brugte en infrarød sensor til at mærke øjenbevægelser og styre LED'en.

Jeg lavede øjenkugler med LED Tape NeoPixel.

Trin 1: Forfatning

Forfatning
Forfatning

Jeg brugte to sensorer QTR - 1A til øjensporing. Sensing med Arduino og styring af LED.

komponenter

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Adafruit LiIon/LiPoly-rygsæk-tilføjelse til Pro Trinket/ItsyBitsy
  • LiPo batteri
  • NeoPixel -strimmel
  • QTR-1A refleksionssensor

Trin 2: NeoPixel LED Eye Ball

NeoPixel LED øjenkugle
NeoPixel LED øjenkugle
NeoPixel LED øjenkugle
NeoPixel LED øjenkugle

NeoPixel LED tape bruges. LED er 68 enhed.

LED er fastgjort til skålen med dobbeltsidet tape og kabelforbundet.

Trin 3: Sensorenhed

Sensorenhed
Sensorenhed
Sensorenhed
Sensorenhed
Sensorenhed
Sensorenhed

Jeg brugte to sensorer QTR - 1A til øjensporing. QTR - 1A placeres på en plastfolie i en afstand på omkring øjenets bredde.

Sensordelen og mikrokontrollerdelen blev fastgjort til henholdsvis brillen med et klip.

Trin 4: Arduino -kode

Når iris nærmer sig en sensor, falder det reflekterede lys, og sensorværdien stiger. Omvendt, når iris bevæger sig væk, øges det reflekterede lys, og sensorværdien af fotoreflektoren falder.

Højre og venstre bevægelse af pupillen i LED -øjeæblet fornemmer stigningen og faldet af en sensorværdi og styrer den. Når de blinker, falder begge sensorværdier, så hvis de to sensorværdier falder samtidigt, falder øjenlågene på LED -øjeæblet ned.

Jeg brugte følgende bibliotek.

  • QTRsensorer:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // antal anvendte sensorer#definere NUM_SAMPLES_PER_SENSOR 10 // i gennemsnit#definere 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 farve; int lysstyrke = 40; byte eyeColor; int LR = 7; boolsk låg = falsk; 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 øjenlåg = 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 ((usigneret tegn ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); usigneret int sensorValues [NUM_SENSORS];

tomrum blink (int øjenlåg, int LR) {hvis (øjenlåg! = 8) {// Tint til (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Sort øje for (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , farve);}

// elev for (uint16_t i = 0; i

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

// øjenlåg for (int i = 0; i <eyelidNum [eyelid]; i ++) {led.setPixelColor (eyelidLED , 0); }} ellers hvis (øjenlåg == 8) {led.clear (); } led.show ();}

ugyldig opsætning () {

Serial.begin (115200); led.begin (); led.setBrightness (lysstyrke); // Initial Brightness 40 led.show (); // Initialiser alle pixels til 'off' color = led. Color (0, 177, 55); // pupillens farveforsinkelse (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; blink (øjenlåg, LR); }

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

dobbelt rasioL = (dobbelt) sensorValL / iniSensorValL;

dobbelt rasioR = (dobbelt) sensorValR / iniSensorValR;

Serial.print (rasioL);

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

hvis (rasioL> 0,985 && rasioR <0,985) {// højre for (int i = LR; i <12; i ++) {blink (0, i); forsinkelse (40); LR = i; }} ellers hvis (rasioL 0.985) {// venstre for (int i = LR; i> 2; i-) {blink (0, i); forsinkelse (40); LR = i; }} ellers hvis (lid == false && rasioL <0,96 && rasioR <0,96) {// Blinker tæt for (int i = 1; i 0,96 && rasioR> 0,96) {// Blinker åbent for (int i = 8; i > 0; i-) {blink (i, LR); forsinkelse (40); låg = falsk; }} ellers hvis (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++; // øjenlåg = 0; hvis (LR <= 7) {for (int i = LR; i <= 7; i ++) {blink (0, i); forsinkelse (40); LR = i; }} andet {for (int i = LR; i> = 7; i-) {blink (0, i); forsinkelse (40); LR = i; }}}

// Opdatering af første værdi hvis (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Trin 5: Betjening

Registrer venstre og højre bevægelse og blink af eleven med sensoren, og kontroller øjeæblets LED.

Anbefalede: