جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
لقد استخدمت مستشعر الأشعة تحت الحمراء لاستشعار حركات العين والتحكم في مؤشر LED.
لقد صنعت مقل العيون باستخدام LED Tape NeoPixel.
الخطوة 1: الدستور
لقد استخدمت مستشعرين QTR - 1A لتتبع العين. الاستشعار باستخدام Arduino والتحكم في مؤشر LED.
عناصر
- SparkFun Arduino Pro Mini 328-5 فولت / 16 ميجا هرتز
- Adafruit LiIon / LiPoly حقيبة الظهر الإضافية لـ Pro Trinket / ItsyBitsy
- بطارية ليبو
- شريط NeoPixel
- مستشعر الانعكاس QTR-1A
الخطوة 2: كرة العين LED NeoPixel
تم استخدام شريط NeoPixel LED. الصمام 68 وحدة.
تم تثبيت LED على الوعاء بشريط على الوجهين وسلك.
الخطوة الثالثة: وحدة الاستشعار
لقد استخدمت مستشعرين QTR - 1A لتتبع العين. يتم وضع QTR - 1A على لوح بلاستيكي على مسافة عرض العين تقريبًا.
تم تثبيت جزء المستشعر وجزء وحدة التحكم الدقيقة على النظارات بمشبك على التوالي.
الخطوة 4: كود اردوينو
عندما تقترب القزحية من مستشعر واحد ، يقل الضوء المنعكس وتزداد قيمة المستشعر. على العكس من ذلك ، عندما تتحرك القزحية بعيدًا ، يزداد الضوء المنعكس وتنخفض قيمة مستشعر عاكس الصورة.
تستشعر الحركة اليمنى واليسرى لتلميذ مقلة العين LED زيادة ونقصان قيمة مستشعر واحدة وتتحكم فيها. عند الوميض ، تنخفض قيم المستشعر ، لذلك إذا انخفضت قيمتي المستشعر في وقت واحد ، فإن جفون مقلة العين LED ستنخفض.
لقد استخدمت المكتبة التالية.
- QTRsensors:
- Adafruit_NeoPixel:
# تضمين # تضمين
#define NUM_SENSORS 2 // عدد المستشعرات المستخدمة # حدد NUM_SAMPLES_PER_SENSOR 10 // متوسط # حدد 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 ؛ عدد التلاميذ الداخليين = 12 ؛ لون uint32_t ؛ سطوع int = 40 ؛ بايت العين كثافة العمليات LR = 7 ؛ غطاء منطقي = خطأ ؛ int cnt = 0 ؛
// حركة العين السوداء L&R animint 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} ، {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}} ؛
// pupil L&R animationint pupilLED [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}} ؛
// وميض الرسوم المتحركة جفن = 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 ((حرف غير موقّع ) {0 ، 1} ، NUM_SENSORS ، NUM_SAMPLES_PER_SENSOR ، EMITTER_PIN) ؛ حساس int غير موقعة [NUM_SENSORS] ؛
وميض باطل (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)) ؛ }
// عين سوداء لـ (uint16_t i = 0 ؛ i led.setPixelColor (blackLED [LR] ، color) ؛}
// تلميذ لـ (uint16_t i = 0 ؛ i
led.setPixelColor (pupilLED [LR] ، led. Color (0 ، 0 ، 66)) ؛ }
// جفن لـ (int i = 0؛ i <eyelidNum [eyelid]؛ i ++) {led.setPixelColor (eyelidLED ، 0)؛ }} else if (eyelid == 8) {led.clear ()؛ } led.show () ؛}
الإعداد باطل() {
Serial.begin (115200) ؛ led.begin () ، led.setBrightness (سطوع) ؛ // السطوع الأولي 40 led.show () ؛ // تهيئة جميع وحدات البكسل على "إيقاف تشغيل" اللون = led. Color (0 ، 177 ، 55) ؛ // تأخير لون التلميذ (100) ؛ qtra.read (sensorValues) ؛ iniSensorValL = sensorValues [0] ، iniSensorValR = sensorValues [1] ، طرفة عين (جفن ، LR) ؛ }
الحلقة الفارغة () {// QTR - 1A قيمة المستشعر qtra.read (sensorValues) ؛ sensorValL = sensorValues [0] ، sensorValR = sensorValues [1] ،
مزدوج rasioL = (مزدوج) sensorValL / iniSensorValL ؛
مزدوج rasioR = (مزدوج) sensorValR / iniSensorValR ؛
Serial.print (rasioL) ؛
Serial.print ("") ؛ Serial.println (rasioR) ؛
if (rasioL> 0.985 && rasioR <0.985) {// right for (int i = LR؛ i <12؛ i ++) {blink (0، i)؛ تأخير (40) ؛ LR = أنا ؛ }} else if (rasioL 0.985) {// left for (int i = LR؛ i> 2؛ i -) {blink (0، i)؛ تأخير (40) ؛ LR = أنا ؛ }} else if (lid == false && rasioL <0.96 && rasioR <0.96) {// وميض قريب من أجل (int i = 1؛ i 0.96 && rasioR> 0.96) {// وميض مفتوح لـ (int i = 8؛ i > 0 ؛ i -) {blink (i، LR) ؛ تأخير (40) ؛ غطاء = خطأ ؛ }} else if (lid == false && rasioL> 0.96 && rasioR> 0.96) {// normal // cnt ++؛ // جفن = 0 ؛ إذا (LR <= 7) {for (int i = LR؛ i <= 7؛ i ++) {blink (0، i) ؛ تأخير (40) ؛ LR = أنا ؛ }} else {for (int i = LR؛ i> = 7؛ i -) {blink (0، i)؛ تأخير (40) ؛ LR = أنا ؛ }}}
// تحديث القيمة الأولية إذا (cnt> 10) {iniSensorValL = sensorValL ؛ iniSensorValR = sensorValR ؛ cnt = 0 ؛ }}
الخطوة 5: العملية
كشف الحركة اليمنى واليسرى وميض التلميذ باستخدام المستشعر ، والتحكم في مصباح مقلة العين.