Inhaltsverzeichnis:

Eye Motion Tracking mit Infrarotsensor - Gunook
Eye Motion Tracking mit Infrarotsensor - Gunook

Video: Eye Motion Tracking mit Infrarotsensor - Gunook

Video: Eye Motion Tracking mit Infrarotsensor - Gunook
Video: How Tobii Dynavox eye tracking works 2024, Juli
Anonim
Eye Motion Tracking mit Infrarotsensor
Eye Motion Tracking mit Infrarotsensor

Ich habe einen Infrarotsensor verwendet, um Augenbewegungen zu erkennen und die LED zu steuern.

Ich habe Augäpfel mit LED Tape NeoPixel gemacht.

Schritt 1: Verfassung

Verfassung
Verfassung

Ich habe zwei Sensoren QTR - 1A für das Eyetracking verwendet. Sensorik mit Arduino und Ansteuerung der LED.

Komponenten

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Adafruit LiIon/LiPoly Rucksack-Add-On für Pro Trinket/ItsyBitsy
  • LiPo-Akku
  • NeoPixel-Streifen
  • QTR-1A Reflexionssensor

Schritt 2: NeoPixel LED Augapfel

NeoPixel LED Augapfel
NeoPixel LED Augapfel
NeoPixel LED Augapfel
NeoPixel LED Augapfel

Es wird NeoPixel-LED-Band verwendet. LED ist 68 Einheit.

LED wird mit doppelseitigem Klebeband an der Schale befestigt und verkabelt.

Schritt 3: Sensoreinheit

Sensoreinheit
Sensoreinheit
Sensoreinheit
Sensoreinheit
Sensoreinheit
Sensoreinheit

Ich habe zwei Sensoren QTR - 1A für das Eyetracking verwendet. QTR - 1A werden in einem Abstand von etwa der Breite des Auges auf eine Plastikfolie gelegt.

Der Sensorteil und der Mikrocontrollerteil wurden jeweils mit einem Clip an der Brille befestigt.

Schritt 4: Arduino-Code

Nähert sich die Blende einem Sensor, nimmt das reflektierte Licht ab und der Sensorwert steigt. Umgekehrt nimmt bei einer Entfernung der Iris das reflektierte Licht zu und der Sensorwert des Fotoreflektors sinkt.

Die rechte und linke Bewegung der Pupille des LED-Augapfels erkennt die Zunahme und Abnahme eines Sensorwertes und steuert diesen. Beim Blinken sinken beide Sensorwerte, wenn also beide Sensorwerte gleichzeitig sinken, sinken die Augenlider des LED-Augapfels.

Ich habe die folgende Bibliothek verwendet.

  • QTRsensoren:
  • Adafruit_NeoPixel:

#einschließen #einschließen

#define NUM_SENSORS 2 // Anzahl der verwendeten Sensoren#define NUM_SAMPLES_PER_SENSOR 10 // Mittelwertbildung#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 blackNum = 24; int PupillenNum = 12; uint32_t Farbe; int-Helligkeit = 40; Byte Augenfarbe; int LR = 7; boolescher Deckel = false; int cnt = 0;

// Schwarzes Auge 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, 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}};

// Pupille L&R Animationint PupillenLED[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-Augenlid = 0; int AugenlidNum[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((unsigned char) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS];

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

// Schwarzes Auge für (uint16_t i=0; ich led.setPixelColor (blackLED[LR], Farbe);}

// Schüler für (uint16_t i=0; i

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

// Augenlid für (int i = 0; i < eyelidNum [Augenlid]; i ++) {led.setPixelColor (eyelidLED, 0); }} sonst wenn (Augenlid == 8) {led.clear (); } led.show();}

Leere Einrichtung () {

Serial.begin(115200); led.begin(); led.setHelligkeit (Helligkeit); // Anfängliche Helligkeit 40 led.show (); // Alle Pixel auf 'aus' initialisieren color = led. Color (0, 177, 55); // Farbverzögerung der Pupille (100); qtra.read (sensorWerte); iniSensorValL = sensorValues[0]; iniSensorValR = sensorValues[1]; Blinzeln (Augenlid, LR); }

Void Schleife () {//QTR - 1A Sensorwert 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);

if (rasioL > 0,985 && rasioR < 0,985) {// rechts für (int i = LR; i < 12; i ++) {blinken (0, i); Verzögerung (40); LR = ich; aufrechtzuerhalten. Verzögerung (40); LR = ich; aufrechtzuerhalten > 0; i--) {blinken (i, LR); Verzögerung (40); Deckel = falsch; }} sonst if(lid == false && rasioL > 0,96 && rasioR > 0,96) {//normal //cnt++; // Augenlid = 0; if (LR <= 7) { for (int i = LR; i <= 7; i ++) { blink (0, i); Verzögerung (40); LR = ich; }} sonst { for(int i=LR; i>=7; i--){blinken (0, i); Verzögerung (40); LR = ich; } } }

// Anfangswert aktualisieren if (cnt > 10) { iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; } }

Schritt 5: Betrieb

Erkenne mit dem Sensor Bewegungen nach links und rechts sowie das Blinzeln der Pupille und steuere die Augapfel-LED.

Empfohlen: