Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
Jeg brukte en infrarød sensor for å føle øyebevegelser og kontrollere LED -en.
Jeg laget øyeboller med LED Tape NeoPixel.
Trinn 1: Grunnlov
Jeg brukte to sensorer QTR - 1A for øyesporing. Sensing med Arduino og kontroll av LED.
komponenter
- SparkFun Arduino Pro Mini 328 - 5V/16MHz
- Adafruit LiIon/LiPoly ryggsekk-tillegg for Pro Trinket/ItsyBitsy
- LiPo batteri
- NeoPixel -stripe
- QTR-1A refleksjonssensor
Trinn 2: NeoPixel LED Eye Ball
NeoPixel LED tape brukes. LED er 68 enheter.
LED er festet til bollen med dobbeltsidig tape og kablet.
Trinn 3: Sensorenhet
Jeg brukte to sensorer QTR - 1A for øyesporing. QTR - 1A plasseres på et plastark i en avstand på omtrent øyets bredde.
Sensordelen og mikrokontrollerdelen ble festet til henholdsvis brillen med et klips.
Trinn 4: Arduino -kode
Når iris nærmer seg en sensor, reduseres det reflekterte lyset og sensorverdien øker. Motsatt, når iris beveger seg bort, øker det reflekterte lyset og sensorverdien til fotoreflektoren synker.
Høyre og venstre bevegelse av eleven til LED -øyeeplet registrerer økning og reduksjon av en sensorverdi og kontrollerer den. Når de blinker, reduseres begge sensorverdiene, så hvis de to sensorverdiene synker samtidig, vil øyelokkene til LED -øyebollet gå ned.
Jeg brukte følgende bibliotek.
- QTRsensorer:
- Adafruit_NeoPixel:
#include #include
#define NUM_SENSORS 2 // antall sensorer brukt#definere NUM_SAMPLES_PER_SENSOR 10 // gjennomsnitt#definere 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 elevNum = 12; uint32_t farge; int lysstyrke = 40; byte eyeColor; int LR = 7; boolsk lokk = falskt; int cnt = 0;
// Black eye 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}, {4, 19, 20, 25, 42, 47, 48, 63, 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}, {21, 23, 44, 46, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};
// elev L & R -animasjon elev 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}, {22, 45, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68}};
// Blink animasjon i øyelokket = 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 ((usignert tegn ) {0, 1}, NUM_SENSORS, NUM_SAMPLES_PER_SENSOR, EMITTER_PIN); usignerte int sensorValues [NUM_SENSORS];
ugyldig blink (int øyelokk, int LR) {if (øyelokk! = 8) {// Tinn for (uint16_t i = 0; i <led.numPixels (); i ++) {led.setPixelColor (i, led. Color (66, 66, 66)); }
// Svart øye for (uint16_t i = 0; i led.setPixelColor (blackLED [LR] , farge);}
// elev for (uint16_t i = 0; i
led.setPixelColor (pupilLED [LR] , led. Color (0, 0, 66)); }
// øyelokk for (int i = 0; i <eyelidNum [eyelid]; i ++) {led.setPixelColor (eyelidLED , 0); }} annet hvis (øyelokk == 8) {led.clear (); } led.show ();}
ugyldig oppsett () {
Serial.begin (115200); led.begin (); led.setBrightness (lysstyrke); // Initial Brightness 40 led.show (); // Initialiser alle piksler til 'off' color = led. Color (0, 177, 55); // pupillfarge forsinkelse (100); qtra.read (sensorValues); iniSensorValL = sensorValues [0]; iniSensorValR = sensorValues [1]; blink (øyelokk, LR); }
void loop () {// QTR - 1A sensorverdi 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);
hvis (rasioL> 0,985 && rasioR <0,985) {// høyre for (int i = LR; i <12; i ++) {blink (0, i); forsinkelse (40); LR = i; }} annet hvis (rasioL 0.985) {// igjen for (int i = LR; i> 2; i-) {blink (0, i); forsinkelse (40); LR = i; }} annet hvis (lid == false && rasioL <0,96 && rasioR <0,96) {// Blinker nær for (int i = 1; i 0,96 && rasioR> 0,96) {// Blinker åpent for (int i = 8; i > 0; i-) {blink (i, LR); forsinkelse (40); lokk = usant; }} annet hvis (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++; // øyelokk = 0; hvis (LR <= 7) {for (int i = LR; i <= 7; i ++) {blink (0, i); forsinkelse (40); LR = i; }} annet {for (int i = LR; i> = 7; i-) {blink (0, i); forsinkelse (40); LR = i; }}}
// Oppdater første verdi hvis (cnt> 10) {iniSensorValL = sensorValL; iniSensorValR = sensorValR; cnt = 0; }}
Trinn 5: Drift
Registrer venstre og høyre bevegelse og blink av eleven med sensoren, og kontroller lysdioden for øyet.