Оглавление:

Отслеживание движения глаз с помощью инфракрасного датчика: 5 шагов
Отслеживание движения глаз с помощью инфракрасного датчика: 5 шагов

Видео: Отслеживание движения глаз с помощью инфракрасного датчика: 5 шагов

Видео: Отслеживание движения глаз с помощью инфракрасного датчика: 5 шагов
Видео: Датчик движения и освещения Подключаем датчик движения к фонарю 2024, Июль
Anonim
Отслеживание движения глаз с помощью инфракрасного датчика
Отслеживание движения глаз с помощью инфракрасного датчика

Я использовал инфракрасный датчик, чтобы определять движения глаз и управлять светодиодом.

Я сделал завязку на LED Tape NeoPixel.

Шаг 1: Конституция

Конституция
Конституция

Я использовал два датчика QTR - 1A для отслеживания взгляда. Обнаружение с помощью Arduino и управление светодиодом.

компоненты

  • SparkFun Arduino Pro Mini 328 - 5 В / 16 МГц
  • Надстройка Adafruit LiIon / LiPoly Backpack для Pro Trinket / ItsyBitsy
  • LiPo аккумулятор
  • Полоса NeoPixel
  • Датчик отражения QTR-1A

Шаг 2: шар для глаз со светодиодной подсветкой NeoPixel

Светодиодный шар для глаз NeoPixel
Светодиодный шар для глаз NeoPixel
Светодиодный шар для глаз NeoPixel
Светодиодный шар для глаз NeoPixel

Используется светодиодная лента NeoPixel. Светодиод 68 шт.

Светодиод крепится к чаше с помощью двустороннего скотча и зашивается проводом.

Шаг 3: сенсорный блок

Сенсорный блок
Сенсорный блок
Сенсорный блок
Сенсорный блок
Сенсорный блок
Сенсорный блок

Я использовал два датчика QTR - 1A для отслеживания взгляда. QTR-1A размещаются на пластиковом листе на расстоянии примерно ширины глаза.

Сенсорная часть и микроконтроллерная часть крепились к очкам с помощью зажима соответственно.

Шаг 4: Код Arduino

Когда диафрагма приближается к одному датчику, отраженный свет уменьшается, а значение датчика увеличивается. И наоборот, когда диафрагма удаляется, отраженный свет увеличивается, а значение датчика фотоотражателя уменьшается.

Движение зрачка светодиодного глазного яблока вправо и влево определяет увеличение и уменьшение одного значения датчика и контролирует его. При мигании значения обоих датчиков уменьшаются, поэтому, если значения двух датчиков уменьшаются одновременно, веки светодиодного глазного яблока опускаются.

Я использовал следующую библиотеку.

  • QTRsensors:
  • Adafruit_NeoPixel:

#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 яркость = 40; byte eyeColor; int LR = 7; логическая крышка = ложь; 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}, {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&Rint 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}};

// Анимация моргания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 ((символ без знака ) {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.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Черный глаз для (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , color);}

// ученик для (uint16_t i = 0; i

led.setPixelColor (ученикLED [LR] , led. Color (0, 0, 66)); }

// веко для (int i = 0; i <eyelidNum [eyelid]; i ++) {led.setPixelColor (eyelidLED , 0); }} иначе, если (веко == 8) {led.clear (); } led.show ();}

void setup () {

Serial.begin (115200); led.begin (); led.setBrightness (яркость); // Начальная яркость 40 led.show (); // Инициализируем все пиксели на «выключено» color = led. Color (0, 177, 55); // задержка цвета зрачка (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; мигание (веко, ЛП); }

void loop () {// QTR - значение датчика 1A qtra.read (sensorValues); sensorValL = sensorValues [0]; sensorValR = sensorValues [1];

double rasioL = (двойной) sensorValL / iniSensorValL;

double rasioR = (двойной) sensorValR / iniSensorValR;

Serial.print (rasioL);

Serial.print (""); Serial.println (rasioR);

if (rasioL> 0.985 && rasioR <0.985) {// правильно для (int i = LR; i <12; i ++) {blink (0, i); задержка (40); LR = i; }} else if (rasioL 0.985) {// осталось для (int i = LR; i> 2; i -) {blink (0, i); задержка (40); LR = i; }} else if (lid == false && rasioL <0.96 && rasioR <0.96) {// Мигает закрытие для (int i = 1; i 0.96 && rasioR> 0.96) {// Мигает открыто для (int i = 8; i > 0; я -) {мигание (я, LR); задержка (40); крышка = ложь; }} else if (lid == false && rasioL> 0.96 && rasioR> 0.96) {// нормально // cnt ++; // веко = 0; если (LR <= 7) {для (int я = LR; я <= 7; я ++) {blink (0, я); задержка (40); LR = i; }} else {для (int я = LR; я> = 7; я -) {blink (0, я); задержка (40); LR = i; }}}

// Обновление начального значения if (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Шаг 5: Эксплуатация

Обнаруживайте движение влево и вправо и мигание зрачка с помощью датчика и управляйте светодиодным индикатором глазного яблока.

Рекомендуемые: