Kazalo:

Sledenje gibanju oči z infrardečim senzorjem: 5 korakov
Sledenje gibanju oči z infrardečim senzorjem: 5 korakov

Video: Sledenje gibanju oči z infrardečim senzorjem: 5 korakov

Video: Sledenje gibanju oči z infrardečim senzorjem: 5 korakov
Video: Leap Motion SDK 2024, November
Anonim
Sledenje gibanju oči z infrardečim senzorjem
Sledenje gibanju oči z infrardečim senzorjem

Za zaznavanje gibov oči in nadzor LED sem uporabil infrardeči senzor.

Naredila sem zrkla z LED trakom NeoPixel.

1. korak: Ustava

Ustava
Ustava

Za sledenje očesu sem uporabil dva senzorja QTR - 1A. Zaznavanje z Arduinom in nadzor LED.

komponente

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Dodatek za nahrbtnik Adafruit LiIon/LiPoly za Pro Trinket/ItsyBitsy
  • LiPo baterija
  • NeoPixel trak
  • Senzor odseva QTR-1A

Korak: NeoPixel LED očesna kroglica

NeoPixel LED očesna kroglica
NeoPixel LED očesna kroglica
NeoPixel LED očesna kroglica
NeoPixel LED očesna kroglica

Uporablja se LED trak NeoPixel. LED je 68 enot.

LED je pritrjen na posodo z dvostranskim trakom in ožičen.

3. korak: Senzorska enota

Senzorska enota
Senzorska enota
Senzorska enota
Senzorska enota
Senzorska enota
Senzorska enota

Za sledenje očesu sem uporabil dva senzorja QTR - 1A. QTR - 1A so postavljeni na plastično folijo na razdalji približno širine očesa.

Senzorski del in del mikrokrmilnika sta bila pritrjena na očala s sponko.

4. korak: Arduino koda

Ko se šarenica približa enemu senzorju, se odbita svetloba zmanjša in vrednost senzorja se poveča. Nasprotno, ko se šarenica odmakne, se odbita svetloba poveča in vrednost senzorja fotoreflektorja se zmanjša.

Desni in levi premik zenice LED -očesnega zrkla zaznava povečanje in zmanjšanje vrednosti enega senzorja ter ga nadzira. Ko utripata, se vrednosti obeh senzorjev znižata, zato se veki LED -očesnega jabolka znižata, če se obe vrednosti hkrati zmanjšata.

Uporabil sem naslednjo knjižnico.

  • QTRsenzorji:
  • Adafruit_NeoPixel:

#include #include

#define NUM_SENSORS 2 // število uporabljenih senzorjev#define NUM_SAMPLES_PER_SENSOR 10 // povprečenje#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 črnoNum = 24; int pupilNum = 12; barva uint32_t; int svetlost = 40; bajt eyeColor; int LR = 7; logični pokrov = napačno; int cnt = 0;

// L&R animacija črnih oči, črna LED [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}};

// animacija učenca L&Rint učenecLED [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}};

// animacija utripanja v veki = 0; int eyelidNum [8] = {0, 4, 8, 16, 24, 34, 44, 56}; int vekaLED [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 ((brez podpisanega znaka ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); nepodpisani int sensorValues [NUM_SENSORS];

void utripanje (int vek, int LR) {if (vek! = 8) {// kositr za (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }

// Črne oči za (uint16_t i = 0; i led.setPixelColor (črnaLED [LR] , barva);}

// učenec za (uint16_t i = 0; i

led.setPixelColor (učenecLED [LR] , led. Color (0, 0, 66)); }

// veka za (int i = 0; i <očesna številka [vek]; i ++) {led.setPixelColor (vekLED , 0); }} else if (veka == 8) {led.clear (); } led.show ();}

void setup () {

Serial.begin (115200); led.begin (); led.setBrightness (svetlost); // Začetna svetlost 40 led.show (); // Inicializiramo vse slikovne pike na 'off' color = led. Color (0, 177, 55); // zamuda barve zenice (100); qtra.read (sensorValues); iniSensorValL = vrednosti senzorjev [0]; iniSensorValR = vrednosti senzorjev [1]; utripanje (vek, LR); }

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

dvojni rasioL = (dvojni) sensorValL / iniSensorValL;

dvojni rasioR = (dvojni) sensorValR / iniSensorValR;

Serijski.tisk (rasioL);

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

if (rasioL> 0,985 && rasioR <0,985) {// desno za (int i = LR; i <12; i ++) {utripa (0, i); zamuda (40); LR = i; }} else if (rasioL 0.985) {// levo za (int i = LR; i> 2; i-) {utripa (0, i); zamuda (40); LR = i; }} else if (lid == false && rasioL <0,96 && rasioR <0,96) {// Utripa blizu za (int i = 1; i 0,96 && rasioR> 0,96) {// Utripa odprto za (int i = 8; i > 0; i-) {utripa (i, LR); zamuda (40); pokrov = napačno; }} else if (lid == false && rasioL> 0,96 && rasioR> 0,96) {// normalno // cnt ++; // vek = 0; če (LR <= 7) {za (int i = LR; i <= 7; i ++) {utripa (0, i); zamuda (40); LR = i; }} else {for (int i = LR; i> = 7; i-) {utripa (0, i); zamuda (40); LR = i; }}}

// osvežitev začetne vrednosti if (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}

5. korak: Delovanje

Zaznajte levo in desno gibanje in utripajte zenico s senzorjem ter nadzirajte LED zrkla.

Priporočena: