Table des matières:

Suivi du mouvement des yeux à l'aide d'un capteur infrarouge : 5 étapes
Suivi du mouvement des yeux à l'aide d'un capteur infrarouge : 5 étapes

Vidéo: Suivi du mouvement des yeux à l'aide d'un capteur infrarouge : 5 étapes

Vidéo: Suivi du mouvement des yeux à l'aide d'un capteur infrarouge : 5 étapes
Vidéo: Au coeur des organes : L’œil et la vision 2024, Juillet
Anonim
Suivi du mouvement des yeux à l'aide d'un capteur infrarouge
Suivi du mouvement des yeux à l'aide d'un capteur infrarouge

J'ai utilisé un capteur infrarouge pour détecter les mouvements oculaires et contrôler la LED.

J'ai fait des globes oculaires avec du ruban LED NeoPixel.

Étape 1: Constitution

Constitution
Constitution

J'ai utilisé deux capteurs QTR - 1A pour le suivi oculaire. Détection avec Arduino et contrôle de la LED.

Composants

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Adafruit LiIon/LiPoly Backpack Add-On pour Pro Trinket/ItsyBitsy
  • Batterie LiPo
  • Bande NeoPixel
  • Capteur de réflectance QTR-1A

Étape 2: Boule oculaire NeoPixel LED

Globe oculaire LED NeoPixel
Globe oculaire LED NeoPixel
Globe oculaire LED NeoPixel
Globe oculaire LED NeoPixel

Du ruban LED NeoPixel est utilisé. La LED est de 68 unités.

La LED est fixée au bol avec du ruban adhésif double face et câblée.

Étape 3: Unité de capteur

Unité de capteur
Unité de capteur
Unité de capteur
Unité de capteur
Unité de capteur
Unité de capteur

J'ai utilisé deux capteurs QTR - 1A pour le suivi oculaire. QTR - 1A sont placés sur une feuille de plastique à une distance d'environ la largeur de l'œil.

La partie capteur et la partie microcontrôleur étaient respectivement fixées aux lunettes à l'aide d'un clip.

Étape 4: Code Arduino

Lorsque l'iris s'approche d'un capteur, la lumière réfléchie diminue et la valeur du capteur augmente. A l'inverse, lorsque l'iris s'éloigne, la lumière réfléchie augmente et la valeur du capteur du photoréflecteur diminue.

Le mouvement droit et gauche de la pupille du globe oculaire LED détecte l'augmentation et la diminution d'une valeur de capteur et la contrôle. Lors du clignotement, les deux valeurs du capteur diminuent, donc si les deux valeurs du capteur diminuent simultanément, les paupières du globe oculaire LED vont baisser.

J'ai utilisé la bibliothèque suivante.

  • Capteurs QTR:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // nombre de capteurs utilisés#define NUM_SAMPLES_PER_SENSOR 10 // calcul de la moyenne#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 élèveNum = 12; uint32_t couleur; luminosité int = 40; octet eyeColor; entier LR =7; couvercle booléen = faux; int cnt = 0;

// eyeil noir L&R animationint 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ève 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}};

//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); int sensorValues non signé [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)); }

// eyeil noir pour(uint16_t i=0; i led.setPixelColor(blackLED[LR], color); }

//élève pour(uint16_t i=0; je

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

//eyelid for(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(luminosité); // Luminosité initiale 40 led.show(); // Initialise tous les pixels sur 'off' color = led. Color(0, 177, 55); // retard de couleur de la pupille (100); qtra.read(sensorValues); iniSensorValL = sensorValues[0]; iniSensorValR = sensorValues[1]; cligner (paupière, LR); }

void loop() { //QTR - 1A valeur du capteur 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){ //correct for(int i = LR; i < 12; i++){ blink(0, i); retard (40); LR = je; } } else if(rasioL 0.985){ //left for(int i=LR; i>2; i--){ blink(0, i); retard (40); LR = je; } } else if(lid == false && rasioL < 0.96 && rasioR < 0.96){ // Clignotement fermé for(int i = 1; i 0.96 && rasioR > 0.96){ // Clignotement ouvert for(int i = 8; i > 0; i--){ clignoter(i, LR); retard (40); couvercle = faux; } } else if(lid == false && rasioL > 0.96 && rasioR > 0.96) { //normal //cnt++; //paupière = 0; if(LR <= 7){ for(int i=LR; i<=7; i++){ blink(0, i); retard (40); LR = je; } } else { for(int i=LR; i>=7; i--){ blink(0, i); retard (40); LR = je; } } }

// Rafraîchissement de la valeur initiale if (cnt > 10){ iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; } }

Étape 5: Opération

Détectez les mouvements gauche et droit et le clignotement de la pupille avec le capteur et contrôlez la LED du globe oculaire.

Conseillé: