Taula de continguts:

Seguiment del moviment dels ulls mitjançant sensor d'infrarojos: 5 passos
Seguiment del moviment dels ulls mitjançant sensor d'infrarojos: 5 passos

Vídeo: Seguiment del moviment dels ulls mitjançant sensor d'infrarojos: 5 passos

Vídeo: Seguiment del moviment dels ulls mitjançant sensor d'infrarojos: 5 passos
Vídeo: Hubble - 15 years of discovery 2024, Desembre
Anonim
Seguiment del moviment ocular mitjançant sensor d'infrarojos
Seguiment del moviment ocular mitjançant sensor d'infrarojos

He utilitzat un sensor d’infrarojos per detectar els moviments dels ulls i controlar el LED.

Vaig fer globus oculars amb cinta LED NeoPixel.

Pas 1: Constitució

Constitució
Constitució

He utilitzat dos sensors QTR - 1A per al seguiment ocular. Detectar amb Arduino i controlar el LED.

components

  • SparkFun Arduino Pro Mini 328 - 5V / 16MHz
  • Complement de motxilla Adafruit LiIon / LiPoly per a Pro Trinket / ItsyBitsy
  • Bateria LiPo
  • Tira NeoPixel
  • Sensor de reflectància QTR-1A

Pas 2: NeoPixel LED Eye Ball

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

S’utilitza cinta LED NeoPixel. El LED és de 68 unitats.

El LED es fixa al bol amb cinta adhesiva de doble cara i cablejat.

Pas 3: Unitat del sensor

Unitat de sensor
Unitat de sensor
Unitat de sensor
Unitat de sensor
Unitat de sensor
Unitat de sensor

He utilitzat dos sensors QTR - 1A per al seguiment ocular. QTR - 1A es col·loquen sobre una làmina de plàstic a una distància aproximada de l’amplada de l’ull.

La part del sensor i la part del microcontrolador es van fixar a les ulleres amb un clip respectivament.

Pas 4: Codi Arduino

Quan l’iris s’acosta a un sensor, la llum reflectida disminueix i el valor del sensor augmenta. Per contra, quan l’iris s’allunya, augmenta la llum reflectida i disminueix el valor del sensor del reflector.

El moviment dret i esquerre de la pupil·la del globus ocular LED detecta l’augment i la disminució d’un valor del sensor i el controla. En parpellejar, els dos valors del sensor disminueixen, de manera que si els dos valors del sensor disminueixen simultàniament, les parpelles del globus ocular del LED baixaran.

He utilitzat la biblioteca següent.

  • QTRsensors:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // nombre de sensors utilitzats # define NUM_SAMPLES_PER_SENSOR 10 // promedio # 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; brillantor int = 40; byte eyeColor; int LR = 7; tapa booleana = fals; int cnt = 0;

// Animació L&R d'ull negreint 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, 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, 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, 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, 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, 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}};

// Parpelleig d’animació parpellejant = 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 sense signar ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); unsigned int sensorValues [NUM_SENSORS];

parpelleig buit (parpella int, int LR) {if (parpella! = 8) {// Estany per a (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Ull negre per a (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , color);}

// alumne de (uint16_t i = 0; i

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

// parpella per a (int i = 0; i <eyelidNum [parpella]; i ++) {led.setPixelColor (eyelidLED , 0); }} else if (parpella == 8) {led.clear (); } led.show ();}

configuració nul·la () {

Serial.begin (115200); led.begin (); led.setBrillness (brillantor); // Lluminositat inicial 40 led.show (); // Inicialitzeu tots els píxels a "off" color = led. Color (0, 177, 55); // retard de color de la pupil·la (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; parpellejar (parpella, LR); }

bucle buit () {// QTR - 1A valor del sensor 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) {// correcte per a (int i = LR; i <12; i ++) {parpellejar (0, i); retard (40); LR = i; }} else if (rasioL 0.985) {// left for (int i = LR; i> 2; i -) {parpellejar (0, i); retard (40); LR = i; }} else if (tapa == false && rasioL <0,96 && rasioR <0,96) {// Tancament de parpelleig per a (int i = 1; i 0,96 && rasioR> 0,96) {// Parpelleig obert per a (int i = 8; i > 0; i -) {parpelleja (i, LR); retard (40); tapa = falsa; }} else if (tapa == falsa && rasioL> 0,96 && rasioR> 0,96) {// normal // cnt ++; // parpella = 0; if (LR <= 7) {for (int i = LR; i <= 7; i ++) {parpelleja (0, i); retard (40); LR = i; }} else {for (int i = LR; i> = 7; i -) {parpelleja (0, i); retard (40); LR = i; }}}

// Actualització del valor inicial si (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

Pas 5: operació

Detecta el moviment esquerre i dret i parpelleja de la pupil·la amb el sensor i controla el LED del globus ocular.

Recomanat: