Obsah:

Sledování pohybu očí pomocí infračerveného senzoru: 5 kroků
Sledování pohybu očí pomocí infračerveného senzoru: 5 kroků

Video: Sledování pohybu očí pomocí infračerveného senzoru: 5 kroků

Video: Sledování pohybu očí pomocí infračerveného senzoru: 5 kroků
Video: TOP 10 Tajné funkce mobilu o kterých 90% lidí neví 2024, Červenec
Anonim
Sledování pohybu očí pomocí infračerveného senzoru
Sledování pohybu očí pomocí infračerveného senzoru

Infračerveným senzorem jsem snímal pohyby očí a ovládal LED.

Oční bulvy jsem vyrobil pomocí LED pásky NeoPixel.

Krok 1: Ústava

Ústava
Ústava

Pro sledování očí jsem použil dva senzory QTR - 1A. Snímání pomocí Arduina a ovládání LED.

součásti

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Doplněk batohu Adafruit LiIon/LiPoly pro Pro Trinket/ItsyBitsy
  • LiPo baterie
  • NeoPixel proužek
  • Senzor odrazivosti QTR-1A

Krok 2: NeoPixel LED Eye Ball

NeoPixel LED oční koule
NeoPixel LED oční koule
NeoPixel LED oční koule
NeoPixel LED oční koule

Používá se LED páska NeoPixel. LED je 68 jednotek.

LED je k misce připevněna oboustrannou páskou a zapojena.

Krok 3: Senzorová jednotka

Senzorová jednotka
Senzorová jednotka
Senzorová jednotka
Senzorová jednotka
Senzorová jednotka
Senzorová jednotka

Pro sledování očí jsem použil dva senzory QTR - 1A. QTR - 1A jsou umístěny na plastovou fólii ve vzdálenosti přibližně šířky oka.

Senzorová část a část mikrokontroléru byla připevněna k brýlím pomocí klipu.

Krok 4: Arduino kód

Když se clona přiblíží k jednomu senzoru, odražené světlo klesá a hodnota senzoru se zvyšuje. Naopak, když se clona vzdálí, odražené světlo se zvýší a hodnota senzoru fotoreflektoru se sníží.

Pravý a levý pohyb zornice LED oční bulvy snímá zvýšení a snížení jedné hodnoty senzoru a ovládá ji. Když bliká, obě hodnoty senzoru se sníží, takže pokud se současně sníží hodnoty obou senzorů, oční víčka oční bulvy LED klesnou.

Použil jsem následující knihovnu.

  • Senzory QTR:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // počet použitých senzorů#definovat NUM_SAMPLES_PER_SENSOR 10 // průměrování#definovat 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; barva uint32_t; int jas = 40; byte eyeColor; int LR = 7; booleovské víko = false; int cnt = 0;

// Animace Black Eye L&R 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}};

// zornice 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 eyelid = 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 ((nepodepsaný znak ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); nepodepsaný int senzorValues [NUM_SENSORS];

void blink (int oční víčko, int LR) {if (víčko! = 8) {// Pewter pro (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Black eye for (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , color);}

// zornice pro (uint16_t i = 0; i

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

// víčko pro (int i = 0; i <číslo víčka [víčko]; i ++) {led.setPixelColor (eyelidLED , 0); }} else if (víčko == 8) {led.clear (); } led.show ();}

neplatné nastavení () {

Serial.begin (115200); led.begin (); led.setBrightness (jas); // Počáteční jas 40 led.show (); // Inicializujte všechny pixely na 'vypnuto' color = led. Color (0, 177, 55); // zpoždění barvy zornice (100); qtra.read (sensorValues); iniSensorValL = hodnoty senzorů [0]; iniSensorValR = hodnoty senzorů [1]; mrknutí (víčko, LR); }

void loop () {// QTR - 1A hodnota senzoru 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) {// vpravo pro (int i = LR; i <12; i ++) {blink (0, i); zpoždění (40); LR = i; }} else if (rasioL 0,985) {// odešel pro (int i = LR; i> 2; i-) {bliká (0, i); zpoždění (40); LR = i; }} else if (lid == false && rasioL <0,96 && rasioR <0,96) {// Blikající zavření pro (int i = 1; i 0,96 && rasioR> 0,96) {// Bliká otevřené pro (int i = 8; i > 0; i-) {mrknutí (i, LR); zpoždění (40); lid = false; }} else if (lid == false && rasioL> 0,96 && rasioR> 0,96) {// normal // cnt ++; // oční víčko = 0; if (LR <= 7) {for (int i = LR; i <= 7; i ++) {blink (0, i); zpoždění (40); LR = i; }} else {for (int i = LR; i> = 7; i-) {blink (0, i); zpoždění (40); LR = i; }}}

// Obnovení počáteční hodnoty if (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Krok 5: Provoz

Pomocí senzoru detekuje pohyb vlevo a vpravo a mrknutí zornice a ovládá diodu LED oční bulvy.

Doporučuje: