Tabla de contenido:

Seguimiento del movimiento ocular con sensor de infrarrojos: 5 pasos
Seguimiento del movimiento ocular con sensor de infrarrojos: 5 pasos

Video: Seguimiento del movimiento ocular con sensor de infrarrojos: 5 pasos

Video: Seguimiento del movimiento ocular con sensor de infrarrojos: 5 pasos
Video: Sensores - Ejemplos Arduino - Gas, IR, Luz, IMU, Distáncia, color, magnetismo, etc... 2024, Mes de julio
Anonim
Seguimiento del movimiento ocular mediante sensor de infrarrojos
Seguimiento del movimiento ocular mediante sensor de infrarrojos

Usé un sensor de infrarrojos para detectar los movimientos de los ojos y controlar el LED.

Hice globos oculares con LED Tape NeoPixel.

Paso 1: Constitución

Constitución
Constitución

Usé dos sensores QTR - 1A para el seguimiento ocular. Detectando con Arduino y controlando el LED.

componentes

  • SparkFun Arduino Pro Mini 328 - 5 V / 16 MHz
  • Complemento de mochila Adafruit LiIon / LiPoly para Pro Trinket / ItsyBitsy
  • Batería LiPo
  • Tira de NeoPixel
  • Sensor de reflectancia QTR-1A

Paso 2: Bola de ojos LED NeoPixel

Bola de ojos LED NeoPixel
Bola de ojos LED NeoPixel
Bola de ojos LED NeoPixel
Bola de ojos LED NeoPixel

Se utiliza cinta LED NeoPixel. El LED es de 68 unidades.

El LED se fija al recipiente con cinta adhesiva de doble cara y se cablea.

Paso 3: Unidad de sensor

Unidad de sensor
Unidad de sensor
Unidad de sensor
Unidad de sensor
Unidad de sensor
Unidad de sensor

Usé dos sensores QTR - 1A para el seguimiento ocular. Los QTR - 1A se colocan sobre una hoja de plástico a una distancia aproximada del ancho del ojo.

La parte del sensor y la parte del microcontrolador se fijaron a las gafas con un clip respectivamente.

Paso 4: Código Arduino

Cuando el iris se acerca a un sensor, la luz reflejada disminuye y el valor del sensor aumenta. Por el contrario, cuando el iris se aleja, la luz reflejada aumenta y el valor del sensor del foto reflector disminuye.

El movimiento derecho e izquierdo de la pupila del globo ocular LED detecta el aumento y la disminución de un valor de sensor y lo controla. Al parpadear, ambos valores del sensor disminuyen, por lo que si los dos valores del sensor disminuyen simultáneamente, los párpados del globo ocular LED bajarán.

Usé la siguiente biblioteca.

  • QTRsensors:
  • Adafruit_NeoPixel:

#incluir #incluir

# definir NUM_SENSORS 2 // número de sensores utilizados # definir NUM_SAMPLES_PER_SENSOR 10 // promediar # definir 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 brillo = 40; byte eyeColor; int LR = 7; tapa booleana = falso; int cnt = 0;

// Animación de ojo negro L&R en 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 animationint 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}};

// Animación de parpadeo en el párpado = 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 ((carácter sin firmar ) {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)); }

// Ojo negro para (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , color);}

// alumno para (uint16_t i = 0; i

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

// párpado para (int i = 0; i <eyelidNum [párpado]; i ++) {led.setPixelColor (eyelidLED , 0); }} más si (párpado == 8) {led.clear (); } led.show ();}

configuración vacía () {

Serial.begin (115200); led.begin (); led.setBrightness (brillo); // Brillo inicial 40 led.show (); // Inicializar todos los píxeles a 'off' color = led. Color (0, 177, 55); // retraso del color de la pupila (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; parpadeo (párpado, LR); }

bucle vacío () {// QTR - valor del sensor 1A qtra.read (sensorValues); sensorValL = sensorValues [0]; sensorValR = sensorValues [1];

doble rasioL = (doble) sensorValL / iniSensorValL;

doble rasioR = (doble) sensorValR / iniSensorValR;

Serial.print (rasioL);

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

if (rasioL> 0.985 && rasioR <0.985) {// correcto para (int i = LR; i <12; i ++) {blink (0, i); retraso (40); LR = i; }} else if (rasioL 0.985) {// a la izquierda para (int i = LR; i> 2; i -) {blink (0, i); retraso (40); LR = i; }} else if (lid == false && rasioL <0.96 && rasioR <0.96) {// Parpadeo cerrado para (int i = 1; i 0.96 && rasioR> 0.96) {// Parpadeo abierto para (int i = 8; i > 0; i -) {parpadeo (i, LR); retraso (40); lid = falso; }} else if (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++; // párpado = 0; if (LR <= 7) {for (int i = LR; i <= 7; i ++) {blink (0, i); retraso (40); LR = i; }} else {for (int i = LR; i> = 7; i -) {blink (0, i); retraso (40); LR = i; }}}

// Actualización del valor inicial if (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Paso 5: Operación

Detecta el movimiento hacia la izquierda y la derecha y el parpadeo de la pupila con el sensor y controla el LED del globo ocular.

Recomendado: