Innholdsfortegnelse:

Øyebevegelsessporing med infrarød sensor: 5 trinn
Øyebevegelsessporing med infrarød sensor: 5 trinn

Video: Øyebevegelsessporing med infrarød sensor: 5 trinn

Video: Øyebevegelsessporing med infrarød sensor: 5 trinn
Video: Использование Melexis MLX90614 Инфракрасный термометр с Arduino 2024, Desember
Anonim
Eye Motion Tracking ved hjelp av infrarød sensor
Eye Motion Tracking ved hjelp av infrarød sensor

Jeg brukte en infrarød sensor for å føle øyebevegelser og kontrollere LED -en.

Jeg laget øyeboller med LED Tape NeoPixel.

Trinn 1: Grunnlov

grunnlov
grunnlov

Jeg brukte to sensorer QTR - 1A for øyesporing. Sensing med Arduino og kontroll av LED.

komponenter

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Adafruit LiIon/LiPoly ryggsekk-tillegg for Pro Trinket/ItsyBitsy
  • LiPo batteri
  • NeoPixel -stripe
  • QTR-1A refleksjonssensor

Trinn 2: NeoPixel LED Eye Ball

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

NeoPixel LED tape brukes. LED er 68 enheter.

LED er festet til bollen med dobbeltsidig tape og kablet.

Trinn 3: Sensorenhet

Sensorenhet
Sensorenhet
Sensorenhet
Sensorenhet
Sensorenhet
Sensorenhet

Jeg brukte to sensorer QTR - 1A for øyesporing. QTR - 1A plasseres på et plastark i en avstand på omtrent øyets bredde.

Sensordelen og mikrokontrollerdelen ble festet til henholdsvis brillen med et klips.

Trinn 4: Arduino -kode

Når iris nærmer seg en sensor, reduseres det reflekterte lyset og sensorverdien øker. Motsatt, når iris beveger seg bort, øker det reflekterte lyset og sensorverdien til fotoreflektoren synker.

Høyre og venstre bevegelse av eleven til LED -øyeeplet registrerer økning og reduksjon av en sensorverdi og kontrollerer den. Når de blinker, reduseres begge sensorverdiene, så hvis de to sensorverdiene synker samtidig, vil øyelokkene til LED -øyebollet gå ned.

Jeg brukte følgende bibliotek.

  • QTRsensorer:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // antall sensorer brukt#definere NUM_SAMPLES_PER_SENSOR 10 // gjennomsnitt#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 elevNum = 12; uint32_t farge; int lysstyrke = 40; byte eyeColor; int LR = 7; boolsk lokk = 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 -animasjon elev LED [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 animasjon i øyelokket = 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 ((usignert tegn ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); usignerte int sensorValues [NUM_SENSORS];

ugyldig blink (int øyelokk, int LR) {if (øyelokk! = 8) {// Tinn for (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Svart øye for (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , farge);}

// elev for (uint16_t i = 0; i

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

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

ugyldig oppsett () {

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

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

double rasioL = (double) sensorValL / iniSensorValL;

double rasioR = (double) sensorValR / iniSensorValR;

Serial.print (rasioL);

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

hvis (rasioL> 0,985 && rasioR <0,985) {// høyre for (int i = LR; i <12; i ++) {blink (0, i); forsinkelse (40); LR = i; }} annet hvis (rasioL 0.985) {// igjen for (int i = LR; i> 2; i-) {blink (0, i); forsinkelse (40); LR = i; }} annet hvis (lid == false && rasioL <0,96 && rasioR <0,96) {// Blinker nær for (int i = 1; i 0,96 && rasioR> 0,96) {// Blinker åpent for (int i = 8; i > 0; i-) {blink (i, LR); forsinkelse (40); lokk = usant; }} annet hvis (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++; // øyelokk = 0; hvis (LR <= 7) {for (int i = LR; i <= 7; i ++) {blink (0, i); forsinkelse (40); LR = i; }} annet {for (int i = LR; i> = 7; i-) {blink (0, i); forsinkelse (40); LR = i; }}}

// Oppdater første verdi hvis (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Trinn 5: Drift

Registrer venstre og høyre bevegelse og blink av eleven med sensoren, og kontroller lysdioden for øyet.

Anbefalt: