Cuprins:
- Pasul 1: Constituție
- Pasul 2: NeoPixel LED Eye Ball
- Pasul 3: Unitatea senzorului
- Pasul 4: Cod Arduino
- Pasul 5: Operațiune
Video: Urmărirea mișcării ochilor utilizând senzorul infraroșu: 5 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
Am folosit un senzor cu infraroșu pentru a simți mișcările ochilor și pentru a controla LED-ul.
Am făcut globi oculari cu bandă LED NeoPixel.
Pasul 1: Constituție
Am folosit doi senzori QTR - 1A pentru urmărirea ochilor. Detectarea cu Arduino și controlul LED-ului.
componente
- SparkFun Arduino Pro Mini 328 - 5V / 16MHz
- Supliment Adafruit LiIon / LiPoly Backpack pentru Pro Trinket / ItsyBitsy
- Baterie LiPo
- Benzi NeoPixel
- Senzor de reflexie QTR-1A
Pasul 2: NeoPixel LED Eye Ball
Se utilizează banda LED NeoPixel. LED-ul este de 68 de unități.
LED-ul este fixat pe castron cu bandă dublă și cablat.
Pasul 3: Unitatea senzorului
Am folosit doi senzori QTR - 1A pentru urmărirea ochilor. QTR - 1A sunt plasate pe o foaie de plastic la o distanță de aproximativ lățimea ochiului.
Partea senzorului și partea microcontrolerului au fost fixate la ochelari cu un clip respectiv.
Pasul 4: Cod Arduino
Când irisul se apropie de un senzor, lumina reflectată scade și valoarea senzorului crește. În schimb, atunci când irisul se îndepărtează, lumina reflectată crește și valoarea senzorului reflectorului foto scade.
Mișcarea dreaptă și stângă a pupilei globului ocular LED detectează creșterea și scăderea valorii unui senzor și o controlează. Când clipesc, ambele valori ale senzorului scad, deci dacă cele două valori ale senzorului scad simultan, pleoapele globului ocular cu LED vor coborî.
Am folosit următoarea bibliotecă.
- QTRsensors:
- Adafruit_NeoPixel:
#include #include
#define NUM_SENSORS 2 // numărul de senzori utilizați # define NUM_SAMPLES_PER_SENSOR 10 // media # 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 culoare; luminozitate int = 40; byte eyeColor; int LR = 7; capac boolean = fals; int cnt = 0;
// Animarea L&R pentru ochi negri este negru [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, 68}};
// Blink animationint pleoapa = 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); unsigned int senzorValori [NUM_SENSORS];
clipire nulă (int pleoapă, int LR) {if (pleoapă! = 8) {// Pewter pentru (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }
// Ochi negru pentru (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , culoare);}
// elev pentru (uint16_t i = 0; i
led.setPixelColor (pupilLED [LR] , led. Color (0, 0, 66)); }
// pleoapa pentru (int i = 0; i <eyelidNum [pleoapa]; i ++) {led.setPixelColor (pleoapaLED , 0); }} else if (pleoapa == 8) {led.clear (); } led.show ();}
configurare nulă () {
Serial.begin (115200); led.begin (); led.setBlightness (luminozitate); // Luminozitate inițială 40 led.show (); // Inițializați toți pixelii la „off” color = led. Color (0, 177, 55); // întârzierea culorii elevului (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; clipire (pleoapă, LR); }
bucla void () {// QTR - 1A valoarea senzorului qtra.read (sensorValues); sensorValL = senzorValori [0]; sensorValR = senzorValori [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) {// dreapta pentru (int i = LR; i <12; i ++) {blink (0, i); întârziere (40); LR = i; }} else if (rasioL 0.985) {// left for (int i = LR; i> 2; i -) {blink (0, i); întârziere (40); LR = i; }} else if (lid == false && rasioL <0,96 && rasioR <0,96) {// Închidere intermitentă pentru (int i = 1; i 0,96 && rasioR> 0,96) {// Intermitent deschis pentru (int i = 8; i > 0; i -) {clipire (i, LR); întârziere (40); capac = fals; }} else if (lid == false && rasioL> 0,96 && rasioR> 0,96) {// normal // cnt ++; // pleoapa = 0; if (LR <= 7) {for (int i = LR; i <= 7; i ++) {clipește (0, i); întârziere (40); LR = i; }} else {for (int i = LR; i> = 7; i -) {clipire (0, i); întârziere (40); LR = i; }}}
// Reîmprospătarea valorii inițiale dacă (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}
Pasul 5: Operațiune
Detectați mișcarea stângă și dreaptă și clipiți cu pupila cu senzorul și controlați LED-ul globului ocular.
Recomandat:
Urmărirea mișcării utilizând MPU-6000 și fotonul cu particule: 4 pași
Urmărirea mișcării folosind MPU-6000 și fotonul de particule: MPU-6000 este un senzor de urmărire a mișcării pe 6 axe care are încorporat accelerometru pe 3 axe și giroscop pe 3 axe. Acest senzor este capabil să urmărească eficient poziția și locația exactă a unui obiect în planul tridimensional. Poate fi folosit în
Urmărirea mișcării ochiului uman: 6 pași
Urmărirea mișcării ochiului uman: Acest proiect își propune să capteze mișcarea ochiului uman și își afișează mișcarea pe un set de lumini LED care sunt plasate în formă de ochi. Acest tip de proiect ar putea avea multe utilizări în domeniul roboticii și în special al umanității
Urmărirea mișcării folosind MPU-6000 și Arduino Nano: 4 pași
Urmărirea mișcării utilizând MPU-6000 și Arduino Nano: MPU-6000 este un senzor de urmărire a mișcării pe 6 axe, care are încorporat accelerometru pe 3 axe și giroscop cu 3 axe. Acest senzor este capabil să urmărească eficient poziția și locația exactă a unui obiect în planul tridimensional. Poate fi folosit în
Motor în mișcare cu urmărirea ochilor: 8 pași
Motor în mișcare cu urmărirea ochilor: în prezent, senzorii de urmărire a ochilor sunt mai frecvenți în diferite domenii, dar din punct de vedere comercial sunt mai cunoscuți pentru jocurile interactive. Acest tutorial nu pretinde să elaboreze senzorii, deoarece este foarte complex și datorită utilizării sale din ce în ce mai comune
Cameră termică IR M5Stack utilizând senzorul de imagistică cu infrarosu AMG8833: 3 pași
Cameră termică IR M5Stack folosind senzorul de imagistică cu infrarosu AMG8833: La fel ca mulți, am avut o fascinație cu camerele termice, dar au fost întotdeauna în afara gamei mele de prețuri - până acum !! Modulul ESP32 și un mod relativ ieftin