0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用红外传感器来感知眼球运动并控制LED

科技观察员 来源:hackster.io 作者:hackster.io 2022-04-07 17:30 次阅读

在本项目中,我使用红外传感器来感知眼球运动并控制LED

NeoPixelLED眼球

我使用了NeoPixelLED作为“眼球”部分。

pYYBAGJOrwmASFivAASYK7N3dJA756.png

LED用双面胶带固定在“碗”背上,并按以下顺序接线。

pYYBAGJOrw6AD9ajAAMwKIHn-Ko358.png

眼动追踪

原理图

poYBAGJOrxSAN6k-AAKtU6jzy-Q979.png

传感器

我使用了两个传感器QTR-1A进行眼动追踪。QTR-1A放置在塑料片上,之间距离大约是双眼距离。

pYYBAGJOrxmAOomoAAXqZJGzYuA738.png

传感器部分和微控制器部分分别用夹子固定在眼镜上。

poYBAGJOrx6AWYY3AAQ8d8mysTo119.png

Arduino代码

当虹膜接近一个传感器时,反射光减少,传感器值增加。相反,当虹膜移开时,反射光增加,光反射器的传感器值减小。

LED眼球瞳孔的左右运动,感知一个传感器值的增减,并对其进行控制。

眨眼时,两个传感器值都会减小,所以如果两个传感器值同时减小,LED“眼球”的外壳部分就会往下掉。

#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; i led.setPixelColor(i, led.Color(66, 66, 66));
}
//Black eye
for(uint16_t i=0; i led.setPixelColor(blackLED[LR][i], color);
}
//pupil
for(uint16_t i=0; i led.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;
}
}
Serial.println("通常時");
}
//Initial value refresh
if (cnt > 10){
iniSensorValL = sensorValL;
iniSensorValR = sensorValR;
cnt = 0;
}
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23252

    浏览量

    660580
  • 红外传感器
    +关注

    关注

    9

    文章

    519

    浏览量

    47560
收藏 人收藏

    评论

    相关推荐

    红外传感器介绍

    整个系统瘫痪。本传感器的优点在于能够设置多点采集,对射管阵列的间距和阵列数量可根据需求选取。红外技术已经众所周知,这项技术在现代科技、国防科技和工农业科技等领域得到了广泛的应用。红外传感系统是用
    发表于 03-02 12:27

    红外传感器分类、原理和安装注意事项

    的窗口。  ·传感器监视区域内应避免出现小动物,如不可避免,应选用防小动物透镜。  微波、红外双鉴传感器  微波、红外双鉴传感器是被动式
    发表于 11-08 15:43

    红外传感器的制作原理是什么?红外传感器主要有哪些应用?

    红外传感器的制作原理是什么?红外传感器有哪些核心技术?红外传感器主要有哪些应用?
    发表于 06-18 07:51

    使用被动红外传感器进行运动探测的设计考虑

    本文档内容介绍了使用被动红外传感器进行运动探测的设计考虑。
    发表于 09-14 18:39 2次下载
    使用被动<b class='flag-5'>红外传感器</b>进行<b class='flag-5'>运动</b>探测<b class='flag-5'>器</b>的设计考虑

    红外传感器工作原理_红外传感器的应用

    本文首先介绍了红外传感器工作原理,其次介绍了红外传感器的种类,最后介绍了红外传感器的应用。
    发表于 09-17 08:58 2.8w次阅读

    如何使用红外传感器感应眼睛的运动控制LED

    传感器检测瞳孔的左右移动和眨眼,控制眼球LED
    的头像 发表于 10-24 09:37 5635次阅读
    如何使用<b class='flag-5'>红外传感器</b>感应眼睛的<b class='flag-5'>运动</b><b class='flag-5'>并</b><b class='flag-5'>控制</b><b class='flag-5'>LED</b>

    使用Arduino控制来自运动传感器LED

    电子发烧友网站提供《使用Arduino控制来自运动传感器LED.zip》资料免费下载
    发表于 07-21 11:00 1次下载
    使用Arduino<b class='flag-5'>来</b><b class='flag-5'>控制</b>来自<b class='flag-5'>运动</b><b class='flag-5'>传感器</b>的<b class='flag-5'>LED</b>

    全面搞懂红外传感器红外传感器的原理、分类、构造、应用)

    导读:红外传感器是很常用的一类传感器,例如检测温度,很多时候就用红外传感器测量。本内容共113页PPT,包括了红外传感器的原理、分类、构造
    的头像 发表于 06-06 15:27 2.9w次阅读
    全面搞懂<b class='flag-5'>红外传感器</b>(<b class='flag-5'>红外传感器</b>的原理、分类、构造、应用)

    一文读懂红外传感器

    一文读懂红外传感器 红外传感器是利用红外热成像技术感知测量物体表面温度分布的传感器。它能够将
    的头像 发表于 04-07 15:21 2139次阅读
    一文读懂<b class='flag-5'>红外传感器</b>

    传感器主要类型有哪些 红外传感器结构及测量原理

    红外传感器传感器中常见的一类,由于红外传感器是检测红外辐射的一类传感器,而自然界中任何物体只要其稳定高于绝对零度都将对外辐射
    发表于 08-05 09:29 3134次阅读
    热<b class='flag-5'>传感器</b>主要类型有哪些 <b class='flag-5'>红外传感器</b>结构及测量原理

    红外传感器的类型及应用

    红外传感器是一类常用于检测、测量和感应目标的电子器件,通过接收目标发射的红外辐射来实现各种功能。根据其工作原理和应用领域的不同,红外传感器可以分为几种主要类型。本文将对红外传感器的常见
    的头像 发表于 11-21 18:12 4271次阅读

    红外传感器的应用场景有哪些

    红外传感器,可以实时监测区域内的人员活动,当有人或物体进入被监控区域时,传感器会检测到其体温和运动通过警报或其他方式提醒安防人员。 自动化控制
    的头像 发表于 01-12 14:42 4334次阅读

    红外传感器种类及功能

    的工作原理基于物体的红外辐射。所有物体都会向周围空间发射一定程度的热能,其中包括红外光谱范围内的辐射。传感器利用红外辐射的能量感测物体的存
    的头像 发表于 01-15 16:15 2271次阅读

    人体红外传感器输出信号有哪些

    人体红外传感器是一种广泛应用于安防、监控、智能家居等领域的传感器,其主要功能是检测人体的存在和运动。本文将介绍人体红外传感器的输出信号及其应用。 人体
    的头像 发表于 08-20 09:30 829次阅读

    红外传感器和超声波传感器有什么区别

    是基于物体辐射的红外能量检测物体的存在和特性。所有物体都会根据其温度发射红外辐射,红外传感器通过检测这种辐射来感知物体。 被动
    的头像 发表于 09-19 16:44 1215次阅读