Tentang proyek ini
Saya menggunakan sensor inframerah untuk merasakan gerakan mata dan mengontrol LED.
Bola Mata LED NeoPixel
Pita LED NeoPixel digunakan. LED adalah 68 unit.
LED dipasang pada mangkuk dengan selotip dua sisi dan disambungkan dengan urutan sebagai berikut.
Pelacakan Gerakan Mata
Skematis
Sensor
Saya menggunakan dua sensor QTR - 1A untuk pelacakan mata. QTR - 1A ditempatkan pada lembaran plastik dengan jarak kira-kira selebar mata.
Bagian sensor dan mikrokontroler dipasang pada kacamata masing-masing dengan klip.
Kode Arduino
Ketika iris mendekati satu sensor, cahaya yang dipantulkan berkurang dan nilai sensor meningkat. Sebaliknya, ketika iris menjauh, cahaya yang dipantulkan meningkat dan nilai sensor dari reflektor foto berkurang.
Gerakan kanan dan kiri pupil bola mata LED merasakan kenaikan dan penurunan satu nilai sensor dan mengontrolnya.
Saat berkedip, kedua nilai sensor berkurang, sehingga jika kedua nilai sensor berkurang secara bersamaan, kelopak mata bola mata LED akan turun.
#include #include #define NUM_SENSORS 2 // jumlah sensor yang digunakan#define NUM_SAMPLES_PER_SENSOR 10 // averaging#define EMITTER_PIN QTR_NO_EMITTER_PIN int iniSensorValRint sensorVensorVal;;#define PIN A3Adafruit_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;//Animasi L&R mata hitamint 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}};//animasi L&R murid di LED[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}, {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 kelopak mata =0;int kelopak mataNum[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((unsigned char[]) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN);unsigned int sensorValues[NUM_SENSORS];void blink(int kelopak mata, int LR) { if (kelopak mata !=8){ //Pewter for(uint16_t i=0; i 0.985 &&rasioR <0.985){ //kanan untuk(int i =LR; i <12; i++){ blink(0, i); penundaan (40); LR =saya; } }else if(rasioL <0.985 &&rasioR> 0.985){ //kiri untuk(int i=LR; i>2; i--){ blink(0, i); penundaan (40); LR =saya; } }else if(lid ==false &&rasioL <0.96 &&rasioR <0.96){ //Berkedip dekat (int i =1; i <9; i++){ blink(i, LR); penundaan (40); tutup =benar; } }else if(lid ==true &&rasioL> 0.96 &&rasioR> 0.96){ //Berkedip terbuka untuk(int i =8; i> 0; i--){ blink(i, LR); penundaan (40); tutup =palsu; } }else if(lid ==false &&rasioL> 0.96 &&rasioR> 0.96) { //normal //cnt++; //kelopak mata =0; if(LR <=7){ for(int i=LR; i<=7; i++){ blink(0, i); penundaan (40); LR =saya; } }else { for(int i=LR; i>=7; i--){ blink(0, i); penundaan (40); LR =saya; } } Serial.println("通常時"); } //Refresh nilai awal jika (cnt> 10){ iniSensorValL =sensorValL; iniSensorValR =sensorValR; cnt =0; }}
Operasi