使用红外线传感器进行眼球运动追踪
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
我使用红外传感器来感知眼球运动并控制 LED。
NeoPixel LED 眼球
使用 NeoPixel LED 胶带。 LED是68个单位。
LED 用双面胶带固定在碗上,并按以下顺序接线。
眼动追踪
原理图
传感器
我使用了两个传感器 QTR - 1A 进行眼动追踪。 QTR - 1A 放置在塑料片上,距离约为眼睛的宽度。
传感器部分和微控制器部分分别用夹子固定在眼镜上。
图>
Arduino代码
当虹膜接近一个传感器时,反射光减少,传感器值增加。相反,当虹膜移开时,反射光增加,光反射器的传感器值减小。
LED眼球瞳孔的左右运动感知一个传感器值的增减并加以控制。
眨眼时,两个传感器值都下降,所以如果两个传感器值同时下降,LED眼球的眼皮就会下降。
#include #include #define NUM_SENSORS 2 // 使用的传感器数量#define NUM_SAMPLES_PER_SENSOR 10 // 平均#define EMITTER_PIN QTR_NO_EMITTER_PIN int iniSensorValL, sensorValRValint;;#define PIN A3Adafruit_NeoPixel led =Adafruit_NeoPixel(68, PIN, NEO_GRB + NEO_KHZ800);int blackNum =24;int studentNum =12;uint32_t color;int 亮度 =40;byte eyeColor;int LR =7;booleanlid =false; cnt =0;//黑眼L&R动画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}};//瞳孔L&R动画int瞳孔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,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];voidblink(int eyelid, int LR) { if (eyelid !=8){ //Pewter for(uint16_t i=0; i 0.985 &&rasioR <0.985){ //right for(int i =LR; i <12; i++){blink(0, i);延迟(40); LR =i; } }else if(rasioL <0.985 &&rasioR> 0.985){ //left for(int i=LR; i>2; i--){blink(0, i);延迟(40); LR =i; } }else if(lid ==false &&rasioL <0.96 &&rasioR <0.96){ //闪烁关闭 for(int i =1; i <9; i++){ browse(i, LR);延迟(40);盖子 =真; } }else if(lid ==true &&rasioL> 0.96 &&rasioR> 0.96){ //闪烁打开 for(int i =8; i> 0; i--){ browse(i, LR);延迟(40);盖子=假; } }else if(lid ==false &&rasioL> 0.96 &&rasioR> 0.96) { //正常 //cnt++; //眼睑=0; if(LR <=7){ for(int i=LR; i<=7; i++){ 闪烁(0, i);延迟(40); LR =i; } }else { for(int i=LR; i>=7; i--){ 闪烁(0, i);延迟(40); LR =i; Serial.println("通常时"); } //初始值刷新 if (cnt> 10){ iniSensorValL =sensorValL; iniSensorValR =sensorValR; cnt =0; }}
操作
制造工艺