Índice:

Rastreamento de movimento ocular usando sensor infravermelho: 5 etapas
Rastreamento de movimento ocular usando sensor infravermelho: 5 etapas

Vídeo: Rastreamento de movimento ocular usando sensor infravermelho: 5 etapas

Vídeo: Rastreamento de movimento ocular usando sensor infravermelho: 5 etapas
Vídeo: FUNÇÃO RASTREAMENTO DE PESSOAS CÂMERA IP YOOSEE !!! COMO ATIVAR SENSOR DE PRESENÇA CÂMERA YOOSEE 2024, Julho
Anonim
Rastreamento de movimento ocular usando sensor infravermelho
Rastreamento de movimento ocular usando sensor infravermelho

Usei um sensor infravermelho para detectar os movimentos dos olhos e controlar o LED.

Fiz globos oculares com Fita LED NeoPixel.

Etapa 1: Constituição

Constituição
Constituição

Usei dois sensores QTR-1A para rastreamento ocular. Detectando com Arduino e controlando o LED.

componentes

  • SparkFun Arduino Pro Mini 328 - 5V / 16MHz
  • Adafruit LiIon / LiPoly Backpack Add-On para bugigangas Pro / ItsyBitsy
  • Bateria LiPo
  • Tira NeoPixel
  • Sensor de refletância QTR-1A

Etapa 2: NeoPixel LED Eye Ball

NeoPixel LED Eye Ball
NeoPixel LED Eye Ball
NeoPixel LED Eye Ball
NeoPixel LED Eye Ball

Fita LED NeoPixel é usada. O LED tem 68 unidades.

O LED é fixado na tigela com fita dupla-face e cabeamento.

Etapa 3: Unidade de Sensor

Unidade de Sensor
Unidade de Sensor
Unidade de Sensor
Unidade de Sensor
Unidade de Sensor
Unidade de Sensor

Usei dois sensores QTR-1A para rastreamento ocular. QTR-1A são colocados em uma folha de plástico a uma distância de aproximadamente a largura do olho.

A parte do sensor e a parte do microcontrolador foram fixadas aos óculos com um clipe respectivamente.

Etapa 4: Código Arduino

Quando a íris se aproxima de um sensor, a luz refletida diminui e o valor do sensor aumenta. Por outro lado, quando a íris se afasta, a luz refletida aumenta e o valor do sensor do foto refletor diminui.

O movimento para a direita e para a esquerda da pupila do globo ocular de LED detecta o aumento e a diminuição de um valor do sensor e o controla. Ao piscar, os valores de ambos os sensores diminuem, portanto, se os valores dos dois sensores diminuem simultaneamente, as pálpebras do globo ocular de LED irão para baixo.

Eu usei a seguinte biblioteca.

  • QTRsensors:
  • Adafruit_NeoPixel:

#include #include

# define NUM_SENSORS 2 // número de sensores usados # define NUM_SAMPLES_PER_SENSOR 10 // média # 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; brilho interno = 40; byte eyeColor; int LR = 7; tampa booleana = falso; int cnt = 0;

// Olho roxo animação L&R LED 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, 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, 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, 68}};

// pupil L&R animationint pupilLED [15] [12] = {{33, 34, 68, 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 animationint 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) {// Peltre para (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Olho roxo para (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , cor);}

// aluno para (uint16_t i = 0; i

led.setPixelColor (pupilLED [LR] , led. Color (0, 0, 66)); }

// pálpebra para (int i = 0; i <eyelidNum [eyelid]; i ++) {led.setPixelColor (eyelidLED , 0); }} else if (eyelid == 8) {led.clear (); } led.show ();}

void setup () {

Serial.begin (115200); led.begin (); led.setBrightness (brilho); // Brilho inicial 40 led.show (); // Inicializa todos os pixels para 'off' color = led. Color (0, 177, 55); // atraso da cor da pupila (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; piscar (pálpebra, LR); }

void loop () {// QTR - valor do sensor 1A qtra.read (sensorValues); sensorValL = sensorValues [0]; sensorValR = sensorValues [1];

rasioL duplo = (duplo) sensorValL / iniSensorValL;

rasioR duplo = (duplo) sensorValR / iniSensorValR;

Serial.print (rasioL);

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

if (rasioL> 0,985 && rasioR <0,985) {// certo para (int i = LR; i <12; i ++) {pisca (0, i); atraso (40); LR = i; }} else if (rasioL 0,985) {// esquerda para (int i = LR; i> 2; i -) {pisca (0, i); atraso (40); LR = i; }} else if (lid == false && rasioL <0,96 && rasioR <0,96) {// Piscando perto para (int i = 1; i 0,96 && rasioR> 0,96) {// Piscando aberto para (int i = 8; i > 0; i -) {pisca (i, LR); atraso (40); tampa = falso; }} else if (lid == false && rasioL> 0,96 && rasioR> 0,96) {// normal // cnt ++; // pálpebra = 0; if (LR <= 7) {para (int i = LR; i <= 7; i ++) {pisca (0, i); atraso (40); LR = i; }} else {for (int i = LR; i> = 7; i -) {piscar (0, i); atraso (40); LR = i; }}}

// Atualização do valor inicial if (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Etapa 5: Operação

Detecte o movimento esquerdo e direito e o piscar da pupila com o sensor e controle o LED do globo ocular.

Recomendado: