Pelacakan Gerakan Mata Infrared dengan Arduino Pro Mini – Demo Kontrol LED
Komponen dan Perlengkapan
SparkFun Arduino Pro Mini 328 - 5V/16MHz
Adafruit LiIon/LiPoly Backpack Add-On untuk Pro Trinket/ItsyBitsy
Strip NeoPixel
Sensor Reflectansi QTR-1A
Baterai LiPo 3.7 V
Aplikasi dan Layanan Online
Tentang Proyek Ini
Saya menggunakan sensor infrared untuk mendeteksi gerakan mata dan mengontrol LED.
Bola Mata LED NeoPixel
Digunakan pita LED NeoPixel. Jumlah LED adalah 68 unit.
LED dilekatkan pada mangkuk dengan lem dua sisi dan dihubungkan dalam urutan berikut.
Pelacakan Gerakan Mata
Skematik
Sensor
Saya menggunakan dua sensor QTR-1A untuk pelacakan mata. QTR-1A ditempatkan pada lembar plastik pada jarak sekitar lebar mata.
Bagian sensor dan bagian mikrokontroler masing-masing dilekatkan pada kacamata dengan klip.
Kode Arduino
Ketika irid mendekati salah satu sensor, cahaya yang dipantulkan menurun dan nilai sensor meningkat. Sebaliknya, ketika irid menjauh, cahaya yang dipantulkan meningkat dan nilai sensor foto-reflektor menurun.
Gerakan kanan dan kiri pupil bola mata LED merasakan kenaikan dan penurunan nilai satu sensor dan mengontrolnya.
Saat berkedip, kedua nilai sensor menurun, jadi jika kedua nilai sensor menurun bersamaan, kelopak mata bola mata LED akan turun.
#include <QTRSensors.h> #include <Adafruit_NeoPixel.h> #define NUM_SENSORS 2 #define NUM_SAMPLES_PER_SENSOR 10 #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 pupilNum = 12; uint32_t color; int brightness = 40; byte eyeColor; int LR =7; boolean lid = false; int cnt = 0; int 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}}; int 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}}; int 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((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){ for(uint16_t i=0; i<led.numPixels(); i++) { led.setPixelColor(i, led.Color(66, 66, 66)); } for(uint16_t i=0; i<blackNum; i++) { led.setPixelColor(blackLED[LR][i], color); } for(uint16_t i=0; i<pupilNum; i++) { led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66)); } for(int i=0; i < eyelidNum[eyelid]; i++) { led.setPixelColor(eyelidLED[i], 0); } } else if (eyelid == 8){ led.clear(); } led.show(); } void setup() { Serial.begin(115200); led.begin(); led.setBrightness(brightness); led.show(); color = led.Color(0, 177, 55); delay(100); qtra.read(sensorValues); iniSensorValL = sensorValues[0]; iniSensorValR = sensorValues[1]; blink(eyelid, LR); } void loop() { 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){ for(int i = LR; i < 12; i++){ blink(0, i); delay(40); LR = i; } }else if(rasioL < 0.985 && rasioR > 0.985){ for(int i=LR; i>2; i--){ blink(0, i); delay(40); LR = i; } }else if(lid == false && rasioL < 0.96 && rasioR < 0.96){ for(int i = 1; i < 9; i++){ blink(i, LR); delay(40); lid = true; } }else if(lid == true && rasioL > 0.96 && rasioR > 0.96){ for(int i = 8; i > 0; i--){ blink(i, LR); delay(40); lid = false; } }else if(lid == false && rasioL > 0.96 && rasioR > 0.96) { if(LR <= 7){ for(int i=LR; i<=7; i++){ blink(0, i); delay(40); LR = i; } }else { for(int i=LR; i>=7; i--){ blink(0, i); delay(40); LR = i; } } Serial.println("normal"); } if (cnt > 10){ iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; } }
Operasi