Isi kandungan:

Penjejakan Gerak Mata Menggunakan Sensor Inframerah: 5 Langkah
Penjejakan Gerak Mata Menggunakan Sensor Inframerah: 5 Langkah

Video: Penjejakan Gerak Mata Menggunakan Sensor Inframerah: 5 Langkah

Video: Penjejakan Gerak Mata Menggunakan Sensor Inframerah: 5 Langkah
Video: Menggunakan Sensor Inframerah 2024, November
Anonim
Penjejakan Gerak Mata Menggunakan Sensor Inframerah
Penjejakan Gerak Mata Menggunakan Sensor Inframerah

Saya menggunakan sensor inframerah untuk merasakan pergerakan mata dan mengawal LED.

Saya membuat bola mata dengan LED Tape NeoPixel.

Langkah 1: Perlembagaan

Perlembagaan
Perlembagaan

Saya menggunakan dua sensor QTR - 1A untuk penjejakan mata. Sensing dengan Arduino dan mengawal LED.

komponen

  • SparkFun Arduino Pro Mini 328 - 5V / 16MHz
  • Adafruit LiIon / LiPoly Backpack Add-On untuk Pro Trinket / ItsyBitsy
  • Bateri LiPo
  • Jalur NeoPixel
  • Sensor Pantulan QTR-1A

Langkah 2: Bola Mata LED NeoPixel

Bola Mata LED NeoPixel
Bola Mata LED NeoPixel
Bola Mata LED NeoPixel
Bola Mata LED NeoPixel

Pita LED NeoPixel digunakan. LED ialah 68 unit.

LED dipasang ke mangkuk dengan pita dua sisi dan berwayar.

Langkah 3: Unit Sensor

Unit Sensor
Unit Sensor
Unit Sensor
Unit Sensor
Unit Sensor
Unit Sensor

Saya menggunakan dua sensor QTR - 1A untuk penjejakan mata. QTR - 1A diletakkan di atas kepingan plastik pada jarak kira-kira lebar mata.

Bahagian sensor dan bahagian mikrokontroler dipasang pada cermin mata masing-masing dengan klip.

Langkah 4: Kod Arduino

Apabila iris mendekati satu sensor, cahaya yang dipantulkan berkurang dan nilai sensor meningkat. Sebaliknya, ketika iris menjauh, cahaya yang dipantulkan meningkat dan nilai sensor reflektor foto menurun.

Pergerakan kanan dan kiri murid bola mata LED merasakan kenaikan dan penurunan satu nilai sensor dan mengawalnya. Ketika berkelip, kedua-dua nilai sensor menurun, jadi jika kedua-dua nilai sensor menurun secara bersamaan, kelopak mata bola mata LED akan turun.

Saya menggunakan perpustakaan berikut.

  • Sensor QTR:
  • Adafruit_NeoPixel:

#sertakan #sertakan

#tentukan NUM_SENSORS 2 // bilangan sensor yang digunakan # tentukan NUM_SAMPLES_PER_SENSOR 10 // rata-rata # tentukan 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 muridNum = 12; warna uint32_t; kecerahan int = 40; mata byteColor; int LR = 7; tudung boolean = palsu; int cnt = 0;

// Animasi L&R mata hitam berwarna hitamLED [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, 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}};

// murid animasi L&R muridLED [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}};

// Kelopak mata animasi berkelip = 0; int eyelidNum [8] = {0, 4, 8, 16, 24, 34, 44, 56}; int kelopak mataLED [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 ((tanda tidak ditandatangani ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); Nilai sensor int yang tidak ditandatangani [NUM_SENSORS];

sekelip mata (int kelopak mata, int LR) {if (kelopak mata! = 8) {// Pewter untuk (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Mata hitam untuk (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , color);}

// murid untuk (uint16_t i = 0; i

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

// kelopak mata untuk (int i = 0; i <eyelidNum [kelopak mata]; i ++) {led.setPixelColor (kelopak mataLED , 0); }} lain jika (kelopak mata == 8) {led.clear (); } led.show ();}

batal persediaan () {

Serial.begin (115200); led.begin (); led.setBrightness (kecerahan); // Kecerahan Awal 40 led.show (); // Memulakan semua piksel ke 'off' color = led. Color (0, 177, 55); // kelewatan warna murid (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; berkelip (kelopak mata, LR); }

gelung kosong () {// QTR - nilai sensor 1A qtra.read (sensorValues); sensorValL = sensorValues [0]; sensorValR = sensorValues [1];

double rasioL = (double) sensorValL / iniSensorValL;

double rasioR = (double) sensorValR / iniSensorValR;

Serial.print (rasioL);

Cetakan bersiri (""); Serial.println (rasioR);

jika (rasioL> 0.985 && rasioR <0.985) {// betul untuk (int i = LR; i <12; i ++) {berkedip (0, i); kelewatan (40); LR = i; }} lain jika (rasioL 0.985) {// kiri untuk (int i = LR; i> 2; i -) {berkedip (0, i); kelewatan (40); LR = i; }} lain jika (lid == false && rasioL <0.96 && rasioR <0.96) {// Berkedip dekat untuk (int i = 1; i 0.96 && rasioR> 0.96) {// Berkedip terbuka untuk (int i = 8; i > 0; i -) {berkelip (i, LR); kelewatan (40); tudung = palsu; }} lain jika (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++; // kelopak mata = 0; jika (LR <= 7) {untuk (int i = LR; i <= 7; i ++) {berkelip (0, i); kelewatan (40); LR = i; }} lain {untuk (int i = LR; i> = 7; i -) {berkelip (0, i); kelewatan (40); LR = i; }}}

// Nilai awal disegarkan jika (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Langkah 5: Operasi

Kesan pergerakan kiri dan kanan dan sekelip mata murid dengan sensor, dan kawal LED bola mata.

Disyorkan: