亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

基于 Arduino Pro Mini 的红外眼动追踪与 LED 眼球控制演示

所需组件与物料

组件数量
SparkFun Arduino Pro Mini 328 - 5V/16MHz1
Adafruit LiIon/LiPoly Backpack 充电板1
NeoPixel 灯带1
QTR-1A 反射传感器2
3.7V LiPo 电池1

所需应用与在线服务

项目简介

利用红外反射传感器检测眼球运动,实时控制 LED 眼球模型的瞳孔移动与眨眼动作。

NeoPixel LED 眼球模型

使用 68 颗 LED 的 NeoPixel 灯带,通过双面胶固定在碗状模型上,按特定顺序布线。

基于 Arduino Pro Mini 的红外眼动追踪与 LED 眼球控制演示
基于 Arduino Pro Mini 的红外眼动追踪与 LED 眼球控制演示

眼动追踪原理

原理图

基于 Arduino Pro Mini 的红外眼动追踪与 LED 眼球控制演示

传感器安装

两个 QTR-1A 传感器间距约为眼宽,固定在塑料片上,再通过夹子安装在眼镜框上。微控制器部分同样夹在眼镜另一侧。

基于 Arduino Pro Mini 的红外眼动追踪与 LED 眼球控制演示
基于 Arduino Pro Mini 的红外眼动追踪与 LED 眼球控制演示

Arduino 代码核心逻辑

传感器原理:虹膜靠近传感器时反射光减弱,传感器数值增大;虹膜远离则数值减小。LED 眼球的瞳孔左右移动对应单侧传感器数值变化;眨眼时双侧数值同时下降,触发 LED 眼球眼皮闭合动画。

#include 
#include 

#define NUM_SENSORS 2
#define NUM_SAMPLES_PER_SENSOR 10
#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;

// 黑眼珠左右动画帧
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},
    // ... 其余帧省略
};

// 瞳孔左右动画帧
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},
    // ... 其余帧省略
};

// 眨眼动画帧
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) {
    // 眼白颜色
    for(uint16_t i=0; i<led.numPixels(); i++) {
      led.setPixelColor(i, led.Color(66, 66, 66));
    }
    // 黑眼珠
    for(uint16_t i=0; i<blackNum; i++) {
      led.setPixelColor(blackLED[LR][i], color);
    }
    // 瞳孔
    for(uint16_t i=0; i<pupilNum; i++) {
      led.setPixelColor(pupilLED[LR][i], led.Color(0, 0, 66));
    }
    // 眼皮
    for(int i=0; i < eyelidNum[eyelid]; i++) {
      led.setPixelColor(eyelidLED[i], 0);
    }
  } else {
    led.clear();
  }
  led.show();
}

void setup() {
  Serial.begin(115200);
  led.begin();
  led.setBrightness(brightness);
  led.show();
  color = led.Color(0, 177, 55);
  delay(100);
  qtra.read(sensorValues);
  iniSensorValL = sensorValues[0];
  iniSensorValR = sensorValues[1];
  blink(eyelid, LR);
}

void loop() {
  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) { // 向右
    for(int i = LR; i < 12; i++) {
      blink(0, i); delay(40); LR = i;
    }
  } else if(rasioL < 0.985 && rasioR > 0.985) { // 向左
    for(int i=LR; i>2; i--) {
      blink(0, i); delay(40); LR = i;
    }
  } else if(lid == false && rasioL < 0.96 && rasioR < 0.96) { // 眨眼闭合
    for(int i = 1; i < 9; i++) {
      blink(i, LR); delay(40); lid = true;
    }
  } else if(lid == true && rasioL > 0.96 && rasioR > 0.96) { // 眨眼睁开
    for(int i = 8; i > 0; i--) {
      blink(i, LR); delay(40); lid = false;
    }
  } else if(lid == false && rasioL > 0.96 && rasioR > 0.96) { // 正常状态回中
    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("通常时");
  }
  // 定期刷新基准值
  if (cnt > 10) {
    iniSensorValL = sensorValL;
    iniSensorValR = sensorValR;
    cnt = 0;
  }
  cnt++;
}

运行效果

佩戴眼镜框装置,眼球左右转动与眨眼动作将实时映射到 LED 眼球模型上。

制造工艺

  1. 产品设计回归天然材料:美学、可持续与制造挑战的深度对话
  2. 树莓派配合 TMP006 红外温度传感器:Python 库与安装指南
  3. 树莓派与 Python 构建远程温度传感器:分步实战指南
  4. 树莓派接 KY‑033 循迹/门状态传感器:简易 Python 实现
  5. 树莓派 Home Assistant 安全监控:PIR 运动检测、报警面板与视频抓拍
  6. 树莓派 DIY 红外运动传感器:从原理到代码的完整指南
  7. 树莓派 PIR 运动传感器控制 LED 实战指南
  8. 用 Leap Motion 控制的激光坦克——Arduino、树莓派、RGB LED
  9. Arduino 红外心率传感器 DIY:低成本高精度,串口绘图器实时波形
  10. 互动 LED 矩阵门显:PIR 触发节日问候 + 待机特效
  11. 面向色敏工艺的精准红外温度传感
  12. 脉冲光传感器:放大 LED 光脉冲为可听声音