Inhoudsopgave:

Eye Motion Tracking met behulp van infraroodsensor - Ajarnpa
Eye Motion Tracking met behulp van infraroodsensor - Ajarnpa

Video: Eye Motion Tracking met behulp van infraroodsensor - Ajarnpa

Video: Eye Motion Tracking met behulp van infraroodsensor - Ajarnpa
Video: Watch me control War Thunder's in-game camera with my real-life head movements using an iPhone & PC 2024, Juli-
Anonim
Eye Motion Tracking met behulp van infraroodsensor
Eye Motion Tracking met behulp van infraroodsensor

Ik gebruikte een infraroodsensor om oogbewegingen waar te nemen en de LED te bedienen.

Ik heb oogbollen gemaakt met LED Tape NeoPixel.

Stap 1: Grondwet

Grondwet
Grondwet

Ik heb twee sensoren QTR - 1A gebruikt voor eye-tracking. Sensing met Arduino en aansturing van de LED.

componenten

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Adafruit LiIon/LiPoly rugzak add-on voor Pro Trinket/ItsyBitsy
  • LiPo-batterij
  • NeoPixel-strip
  • QTR-1A reflectiesensor

Stap 2: NeoPixel LED-oogbal

NeoPixel LED-oogbal
NeoPixel LED-oogbal
NeoPixel LED-oogbal
NeoPixel LED-oogbal

NeoPixel LED-tape wordt gebruikt. LED is 68 eenheden.

LED is met dubbelzijdige tape aan de schaal bevestigd en bedraad.

Stap 3: Sensoreenheid

Sensoreenheid
Sensoreenheid
Sensoreenheid
Sensoreenheid
Sensoreenheid
Sensoreenheid

Ik heb twee sensoren QTR - 1A gebruikt voor eye-tracking. QTR - 1A worden op een plastic vel geplaatst op een afstand van ongeveer de breedte van het oog.

Het sensorgedeelte en het microcontrollergedeelte werden respectievelijk met een clip aan de bril bevestigd.

Stap 4: Arduino-code

Wanneer de iris één sensor nadert, neemt het gereflecteerde licht af en neemt de sensorwaarde toe. Omgekeerd, wanneer de iris weg beweegt, neemt het gereflecteerde licht toe en neemt de sensorwaarde van de fotoreflector af.

De rechter- en linkerbeweging van de pupil van de LED-oogbol detecteert de toename en afname van één sensorwaarde en regelt deze. Bij het knipperen nemen beide sensorwaarden af, dus als de twee sensorwaarden gelijktijdig afnemen, gaan de oogleden van de LED-oogbol naar beneden.

Ik heb de volgende bibliotheek gebruikt.

  • QTRsensoren:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // aantal gebruikte sensoren#define NUM_SAMPLES_PER_SENSOR 10 // middeling#define 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 zwartNum = 24; int pupilNum = 12; uint32_t kleur; int helderheid = 40; byte oogkleur; int LR =7; booleaanse deksel = onwaar; intcnt = 0;

//Black eye L&R animatieint 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 animatieint 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}};

// Knipper animatieint ooglid = 0; int ooglidNum[8] = {0, 4, 8, 16, 24, 34, 44, 56}; int ooglidLED [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}; QTRSensorsAnaloge qtra((unsigned char ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS];

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

// Zwart oog voor (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , kleur);}

// leerling voor (uint16_t i=0; i

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

// ooglid voor (int i = 0; i < eyelidNum [ooglid]; i ++) { led.setPixelColor (ooglidLED , 0); } } else if (ooglid == 8){ led.clear(); } led.show();}

ongeldige setup() {

Serieel.begin(115200); led.begin(); led.setHelderheid (helderheid); // Initiële helderheid 40 led.show(); // Initialiseer alle pixels op 'uit' kleur = led. Color (0, 177, 55); // leerling kleurvertraging (100); qtra.read(sensorValues); iniSensorValL = sensorValues[0]; iniSensorValR = sensorValues[1]; knipperen (ooglid, LR); }

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

dubbele rasioL = (dubbele)sensorValL / iniSensorValL;

dubbele rasioR = (dubbele)sensorValR / iniSensorValR;

Serial.print(rasioL);

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

if(rasioL > 0.985 && rasioR <0.985){ //right for(int i = LR; i <12; i++){ blink(0, i); vertraging (40); LR = ik; } }else if(rasioL 0.985){ // left for(int i=LR; i>2; i--){ blink(0, i); vertraging (40); LR = ik; } }else if(lid == false && rasioL < 0.96 && rasioR < 0.96){ // Knippert dicht voor (int i = 1; i 0.96 && rasioR > 0,96){ // Knippert open voor (int i = 8; i > 0; i--){ blink(i, LR); vertraging (40); deksel = vals; } }else if(lid == false && rasioL > 0.96 && rasioR > 0.96) { //normal //cnt++; // ooglid = 0; if(LR <= 7){ for(int i=LR; i<=7; i++){ blink(0, i); vertraging (40); LR = ik; } }else { for(int i=LR; i>=7; i--){ blink(0, i); vertraging (40); LR = ik; } } }

//Initiële waarde vernieuwen als (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; } }

Stap 5: Bediening

Detecteer linker- en rechterbeweging en het knipperen van de pupil met de sensor en bedien de oogbol-LED.

Aanbevolen: