Cuprins:
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
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.