第1步:构造
我使用了两个传感器qtr-1a进行眼睛跟踪。
组件
sparkfun arduino pro mini 328-5v/16mhz
adafruit liion/lipoly背包pro trinket/itsybitsy附加组件
lipo电池
neopixel条
qtr-1a反射传感器
步骤2:neopixel led眼球
使用neopixel led胶带。 led是68个单位。
led用双面胶带固定在碗上并进行了布线。
步骤3:传感器单元
我使用了两个传感器qtr-1a进行眼睛跟踪。将qtr-1a放在塑料片上,其间距约为眼睛的宽度。
分别用夹子将传感器部分和微控制器部分固定到眼镜上。
第4步:arduino代码
当虹膜接近一个传感器时,反射光会减少,传感器值会增加。相反,当虹膜移开时,反射光增加,而光反射器的传感器值减小。
led眼球瞳孔的左右移动感测到一个传感器值的增大和减小。并控制它。闪烁时,两个传感器的值都会减小,因此,如果两个传感器的值同时减小,led眼球的眼睑就会下降。
我使用了以下库。
qtrsensors:https://github.com/pololu/qtr-sensors-arduino
adafruit_neopixel:https://github.com/adafruit/adafruit_neopixel
#include
#include
#define num_sensors 2 // number of sensors used
#define num_samples_per_sensor 10 // averaging
#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;
//black eye l&r animation
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}};
//pupil l&r animation
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}};
//blink animation
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){
//pewter
for(uint16_t i=0; iled.setpixelcolor(i, led.color(66, 66, 66));
}
//black eye
for(uint16_t i=0; iled.setpixelcolor(blackled[lr][i], color);
}
//pupil
for(uint16_t i=0; iled.setpixelcolor(pupilled[lr][i], led.color(0, 0, 66));
}
//eyelid
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); // initial brightness 40
led.show(); // initialize all pixels to ‘off’
color = led.color(0, 177, 55); //pupil color
delay(100);
qtra.read(sensorvalues);
inisensorvall = sensorvalues[0];
inisensorvalr = sensorvalues[1];
blink(eyelid, lr);
}
void loop() {
//qtr - 1a sensor value
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){ //right
for(int i = lr; i 《 12; i++){
blink(0, i);
delay(40);
lr = i;
}
}else if(rasiol 《 0.985 && rasior 》 0.985){ //left
for(int i=lr; i》2; i--){
blink(0, i);
delay(40);
lr = i;
}
}else if(lid == false && rasiol 《 0.96 && rasior 《 0.96){ //blinking close
for(int i = 1; i 《 9; i++){
blink(i, lr);
delay(40);
lid = true;
}
}else if(lid == true && rasiol 》 0.96 && rasior 》 0.96){ //blinking open
for(int i = 8; i 》 0; i--){
blink(i, lr);
delay(40);
lid = false;
}
}else if(lid == false && rasiol 》 0.96 && rasior 》 0.96) { //normal
//cnt++;
//eyelid = 0;
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;
}
}
}
//initial value refresh
if (cnt 》 10){
inisensorvall = sensorvall;
inisensorvalr = sensorvalr;
cnt = 0;
}
}
第5步:操作
用传感器检测瞳孔的左右移动和眨眼,并控制眼球led。
拒绝“AI算命”小程序,反对网络迷信思想
变压器无源无线测温技术方案概述
三星显示器新的设计专利揭示了第三种可能的外形尺寸
诺基亚电池通用型号有哪些?
Chebyshev滤波器设计的详解
如何使用红外传感器感应眼睛的运动并控制LED
vivo官方发布X27外观设计
VR厂商们的众生相,浮华过后的“凄惨”
使用统计数据来进行示波器数据分析
建设智能工厂需要完全具备以下几个层面要素
小米汽车首款作品——小米su7
CA6470/6471/6472专业型接地电阻测试仪的特点及适用范围
新能源汽车的发展前景及趋势
在夹缝中生存的中国机床业,还有希望吗?
手机没有OTG功能,如何实现数据传输?
黑龙利用江无人机+视频监控方式紧盯秸秆焚烧情况
怎样在不使用Spark应用程序的情况下使Spark Core运行
2019年重庆市物联网十大应用案例评选正式启动
CNN预测华为明年5G设备供应会出现问题 法国不会限制供应商使用华为5G设备
中兴通讯中标M.2封装成为第二大份额的厂家