在本项目中,我使用红外传感器来感知眼球运动并控制LED。NeoPixelLED眼球我使用了NeoPixelLED作为“眼球”部分。LED用双面胶带固定在“碗”背上,并按以下顺序接线。眼动追踪原理图传感器我使用了两个传感器QTR-1A进行眼动追踪。QTR-1A放置在塑料片上,之间距离大约是双眼距离。传感器部分和微控制器部分分别用夹子固定在眼镜上。Arduino代码当虹膜接近一个传感器时,反射光减少,传感器值增加。相反,当虹膜移开时,反射光增加,光反射器的传感器值减小。LED眼球瞳孔的左右运动,感知一个传感器值的增减,并对其进行控制。眨眼时,两个传感器值都会减小,所以如果两个传感器值同时减小,LED“眼球”的外壳部分就会往下掉。#include#include#defineNUM_SENSORS2//numberofsensorsused#defineNUM_SAMPLES_PER_SENSOR10//averaging#defineEMITTER_PINQTR_NO_EMITTER_PINintiniSensorValL,sensorValL;intiniSensorValR,sensorValR;#definePINA3Adafruit_NeoPixelled=Adafruit_NeoPixel(68,PIN,NEO_GRB+NEO_KHZ800);intblackNum=24;intpupilNum=12;uint32_tcolor;intbrightness=40;byteeyeColor;intLR=7;booleanlid=false;intcnt=0;//BlackeyeL&RanimationintblackLED[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}};//pupilL&RanimationintpupilLED[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}};//Blinkanimationinteyelid=0;inteyelidNum[8]={0,4,8,16,24,34,44,56};inteyelidLED[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};QTRSensorsAnalogqtra((unsignedchar[]){0,1},NUM_SENSORS,NUM_SAMPLES_PER_SENSOR,EMITTER_PIN);unsignedintsensorValues[NUM_SENSORS];voidblink(inteyelid,intLR){if(eyelid!=8){//Pewterfor(uint16_ti=0;iled.setPixelColor(i,led.Color(66,66,66));}//Blackeyefor(uint16_ti=0;iled.setPixelColor(blackLED[LR][i],color);}//pupilfor(uint16_ti=0;iled.setPixelColor(pupilLED[LR][i],led.Color(0,0,66));}//eyelidfor(inti=0;iled.setPixelColor(eyelidLED[i],0);}}elseif(eyelid==8){led.clear();}led.show();}voidsetup(){Serial.begin(115200);led.begin();led.setBrightness(brightness);//InitialBrightness40led.show();//Initializeallpixelsto'off'color=led.Color(0,177,55);//pupilcolordelay(100);qtra.read(sensorValues);iniSensorValL=sensorValues[0];iniSensorValR=sensorValues[1];blink(eyelid,LR);}voidloop(){//QTR-1Asensorvalueqtra.read(sensorValues);sensorValL=sensorValues[0];sensorValR=sensorValues[1];doublerasioL=(double)sensorValL/iniSensorValL;doublerasioR=(double)sensorValR/iniSensorValR;Serial.print(rasioL);Serial.print("");Serial.println(rasioR);if(rasioL>0.985&&rasioRfor(inti=LR;iblink(0,i);delay(40);LR=i;}}elseif(rasioL0.985){//leftfor(inti=LR;i>2;i--){blink(0,i);delay(40);LR=i;}}elseif(lid==false&&rasioLfor(inti=1;iblink(i,LR);delay(40);lid=true;}}elseif(lid==true&&rasioL>0.96&&rasioR>0.96){//Blinkingopenfor(inti=8;i>0;i--){blink(i,LR);delay(40);lid=false;}}elseif(lid==false&&rasioL>0.96&&rasioR>0.96){//normal//cnt++;//eyelid=0;if(LRfor(inti=LR;iblink(0,i);delay(40);LR=i;}}else{for(inti=LR;i>=7;i--){blink(0,i);delay(40);LR=i;}}Serial.println("通常時");}//Initialvaluerefreshif(cnt>10){iniSensorValL=sensorValL;iniSensorValR=sensorValR;cnt=0;}}如果您对此项目有任何想法、意见或问题,请在下方留言。原文链接丨以上内容来源网络,如涉及侵权可联系删除。