Spisu treści:

Śledzenie ruchu oka za pomocą czujnika podczerwieni: 5 kroków
Śledzenie ruchu oka za pomocą czujnika podczerwieni: 5 kroków

Wideo: Śledzenie ruchu oka za pomocą czujnika podczerwieni: 5 kroków

Wideo: Śledzenie ruchu oka za pomocą czujnika podczerwieni: 5 kroków
Wideo: 📡 Czujnik obecności 5.8GHz #Sonoff #SNZB-06P #SmartnyDom 2024, Listopad
Anonim
Śledzenie ruchu oka za pomocą czujnika podczerwieni
Śledzenie ruchu oka za pomocą czujnika podczerwieni

Użyłem czujnika podczerwieni do wykrywania ruchów oczu i sterowania diodą LED.

Gałki oczne wykonałem taśmą LED NeoPixel.

Krok 1: Konstytucja

Konstytucja
Konstytucja

Do śledzenia wzroku użyłem dwóch czujników QTR - 1A. Wykrywanie za pomocą Arduino i sterowanie diodą LED.

składniki

  • SparkFun Arduino Pro Mini 328 - 5V/16MHz
  • Dodatek do plecaka Adafruit LiIon/LiPoly dla Pro Trinket/ItsyBitsy
  • Akumulator LiPo
  • Pasek NeoPixel
  • Czujnik odbicia QTR-1A

Krok 2: Kula oczna NeoPixel LED

Kula oczna NeoPixel LED
Kula oczna NeoPixel LED
Kula oczna NeoPixel LED
Kula oczna NeoPixel LED

Zastosowano taśmę LED NeoPixel. LED to 68 jednostek.

Dioda mocowana jest do miski taśmą dwustronną i przewodem.

Krok 3: Jednostka czujnika

Jednostka czujnika
Jednostka czujnika
Jednostka czujnika
Jednostka czujnika
Jednostka czujnika
Jednostka czujnika

Do śledzenia wzroku użyłem dwóch czujników QTR - 1A. QTR - 1A umieszcza się na plastikowym arkuszu w odległości około szerokości oka.

Część czujnika i część mikrokontrolera zostały przymocowane odpowiednio do okularów za pomocą klipsa.

Krok 4: Kod Arduino

Gdy tęczówka zbliży się do jednego czujnika, odbite światło maleje, a wartość czujnika wzrasta. I odwrotnie, gdy tęczówka się oddala, odbite światło wzrasta, a wartość czujnika fotoreflektora maleje.

Prawy i lewy ruch źrenicy gałki ocznej LED wykrywa wzrost i spadek wartości jednego czujnika i steruje nim. Gdy mrugają, obie wartości czujników zmniejszają się, więc jeśli obie wartości czujników spadną jednocześnie, powieki gałki ocznej LED opadają.

Skorzystałem z poniższej biblioteki.

  • Czujniki QTR:
  • Adafruit_NeoPixel:

#włącz #włącz

#define NUM_SENSORS 2 // liczba używanych czujników#define NUM_SAMPLES_PER_SENSOR 10 // uśrednianie#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 czarnyNum = 24; int liczba źrenic = 12; kolor uint32_t; jasność wewnętrzna = 40; bajt kolor oczu; int LR = 7; pokrywka logiczna = fałsz; int cnt = 0;

//Animacja L&R czarnego okaint 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}, {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, 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}};

// animacja L&R ucznia z diodą LED[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, 68}, {22, 45, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};

//Mrugnięcie animacji na powiekę = 0; int liczba powiek[8] = {0, 4, 8, 16, 24, 34, 44, 56}; wew powieki[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){ //Pewter for(uint16_t i=0; i<led.numPixels(); i++) { led.setPixelColor(i, led. Color(66), 66, 66)); }

//Podbite oko for(uint16_t i=0; i led.setPixelColor(blackLED[LR], color); }

//uczeń dla(uint16_t i=0; i

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

//powieki for(int i=0; i < powiekaNum[powieki]; i++) { led.setPixelColor(eyelidLED, 0); } } else if (powieki == 8){ led.clear(); } led.pokaż();}

pusta konfiguracja () {

Serial.początek(115200); led.rozpocznij(); led.setJasność(jasność); // Jasność początkowa 40 led.show(); // Zainicjuj wszystkie piksele na 'off' color = led. Color(0, 177, 55); //opóźnienie koloru źrenicy(100); qtra.read(sensorValues); iniSensorValL = sensorValues[0]; iniSensorValR = sensorValues[1]; mrugnięcie (powieka, LR); }

void loop() { //QTR - 1A wartość czujnika qtra.read(sensorValues); sensorValL = sensorValues[0]; sensorValR = sensorValues[1];

podwójny rasioL = (podwójny)sensorValL / iniSensorValL;

podwójny rasioR = (podwójny)sensorValR / iniSensorValR;

Serial.print(rasioL);

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

if(rasioL > 0,985 && rasioR < 0,985){ //prawo do (int i = LR; i < 12; i++){ miga (0, i); opóźnienie(40); LR = i; } }else if(rasioL 0.985){ //po lewej for(int i=LR; i>2; i--){ blink(0, i); opóźnienie(40); LR = i; } }else if(lid == false && rasioL < 0,96 && rasioR < 0,96){ //Miganie zamknięte for(int i = 1; i 0,96 && rasioR > 0,96){ //Miganie otwarte for(int i = 8; i > 0; i--){ miga (i, LR); opóźnienie(40); pokrywka = fałsz; } }else if(lid == false && rasioL > 0,96 && rasioR > 0,96) { //normalne //cnt++; //powieka = 0; if(LR <= 7){ for(int i=LR; i<=7; i++){ miga(0, i); opóźnienie(40); LR = i; } }else { for(int i=LR; i>=7; i--){ miga(0, i); opóźnienie(40); LR = i; } } }

//Odświeżenie wartości początkowej if (cnt > 10){ iniSensorValL = sensorValL; iniSensorValR = sensorValR; liczba = 0; } }

Krok 5: Operacja

Wykrywaj ruchy w lewo i w prawo oraz mruganie źrenicy za pomocą czujnika i steruj diodą LED gałki ocznej.

Zalecana: