جدول المحتويات:
فيديو: التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
في هذا البرنامج التعليمي ، سنلعب باستخدام مستشعر الإيماءات (APDS-9960) وحلقة neopixel لمعرفة كيفية دمجهما معًا باستخدام Arduino UNO.
سوف يستجيب المنتج النهائي للإيماءات اليسرى واليمنى عن طريق تحريك حركة LED يمينًا أو يسارًا ، وإيماءات من أعلى إلى أسفل عن طريق تغيير لون المصابيح.
في الخطوات التالية ، ستقوم بإلقاء نظرة عامة بإيجاز على قائمة الأجزاء وكيفية توصيل المكونات. وبعد ذلك سنراجع الكود خطوة بخطوة لمعرفة كيفية عمله.
الخطوة 1: المكونات
1. Arduino UNO
2. كابل usb
3. مستشعر إيماءات APDS9960 (https://www.sparkfun.com/products/12787)
4. 24 حلقة led neopixel led (https://www.adafruit.com/product/1586)
5. ذكر - أنثى ، ذكر - ذكر كابلات اللوح
6. اللوح
7. 5 فولت امدادات الطاقة للحلقة الصمام (أنا أستخدم 4 بطارية مرة أخرى)
8. لإرفاق حلقة neopixel باللوحة ، ستحتاج إلى لحام ثلاثة دبابيس ذكر بها: GND و PWR ودبوس التحكم. لهذا ستحتاج إلى مكواة لحام وتدفق
المكونات الرئيسية هنا هي مستشعر إيماءات APDS-9960 وحلقة 24 نيوبيكسل. يمكنك تبديل مصادر طاقة اردوينو وكابلات USB وألواح توصيل مختلفة كما يحلو لك.
الخطوة 2: التجميع والتحميل
المجسم
قبل أن تبدأ ، تأكد من أن لديك جميع المكونات على طاولتك. سيكون لدينا بعض الخطوات الجيدة لاتباعها:). لقد أرفقت أيضًا مخطط Fritzing كصورة وأيضًا بتنسيق fritzing.
1. لحام 3 دبابيس ذكور في حلقة نيوبكسل (GND ، PWR ، دبوس التحكم)
2. قم بإرفاق حلقة neopixel باللوحة
3. قم بتوصيل مستشعر APDS9960 بلوح التجارب
4. قم بتوصيل الأسباب: حزمة البطارية ، اردوينو UNO ، APDS9960 و neopixel بأرض اللوح
5. توصيل الطاقة: اردوينو UNO 3V إلى دبوس الطاقة APDS9960 ، neopixel لبطارية حزمة الطاقة
6. قم بتوصيل دبوس التحكم neopixel بدبوس اردوينو D6
7. قم بتوصيل SDA و SCL من APDS9960 إلى A4 و A5 على التوالي
8. قم بتوصيل دبوس المقاطعة APDS9960 بـ Arduino D2
تحميل الكود
بادئ ذي بدء ، ستحتاج إلى تنزيل مكتبات arduino الضرورية وتثبيتها:
1. مكتبة حلقات Neopixel:
2. مكتبة مستشعر الإيماءات:
إذا كنت لا تعرف كيفية تثبيت مكتبات اردوينو ، فراجع هذا البرنامج التعليمي.
بعد تنزيل المكتبات أعلاه وتثبيتها ، يمكنك استنساخ أو تنزيل مستودع اردوينو الخاص بي الموجود هنا: https://github.com/danionescu0/arduino ، وسنستخدم هذا الرسم التخطيطي: https://github.com/danionescu0 / arduino / tree / master / projects / neopixel_ring_gestures
في القسم التالي ، سأقوم بتضمين الكود مباشرة في هذا البرنامج التعليمي ، لذلك إذا كنت ترغب في ذلك ، يمكنك نسخه ولصقه من هناك.
أخيرًا ، قم بتوصيل اردوينو بالكمبيوتر باستخدام كبل USB ، وضع بطاريات 1.5 فولت في حزمة البطارية ، وقم بتحميل المخطط في اردوينو.
الخطوة 3: كيف يعمل؟
في هذا الجزء الأخير سوف نتعلم كيف يتم دمج هذه المكونات معًا ، وكيفية استخدام مكتباتهم وكيف قمت ببناء الكود الخاص بي:
أولاً ، دعنا نلقي نظرة سريعة على المستشعر وطرق API الخاصة بمكتبة neopixel التي سنستخدمها
1. Neopixel API من adafruit
من هذه المكتبة ، سنستخدم الطرق التي تتحكم في لون مصباح LED الفردي ونطبقها
- تشمل المكتبة:
#يشمل
- التصريح بالمكتبة
#define NEOPIXED_CONTROL_PIN 6
#define NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS، NEOPIXED_CONTROL_PIN، NEO_RBG + NEO_KHZ800) ؛
- تهيئة
# بشكل نموذجي داخل كتلة الإعداد
إعداد باطل () {strip.begin () ، # ربما بعض الأشياء الأخرى هنا #…. }
- تضيء وحدات البكسل الفردية ثم تطبق جميع التعديلات على الشريط (اجعلها بطريقة ما)
# إعداد بكسل 0 ليكون أحمر
strip.setPixelColor (0 ، strip. Color (255 ، 0 ، 0)) ؛ # قم بإعداد بكسل 1 ليكون شريطًا أخضر. setPixelColor (1 ، شريط. اللون (0 ، 255 ، 0)) ؛ # قم بإعداد بكسل 2 ليكون شريط أزرق. setPixelColor (2 ، شريط. اللون (0 ، 0255)) ؛ عرض الشريط()؛
2. إيماءة الاستشعار APDS 9960
من هذه المكتبة سنستخدم وظيفة "إيماءة القراءة". ستكون هذه الوظيفة قادرة على التمييز بين أوامر اليسار واليمين ، والأوامر من أعلى لأسفل ، والأوامر القريبة البعيدة. هناك خدعة هنا ، لن نطلب من المستشعر باستمرار عن آخر إيماءة يتم ملاحظتها. اللوحة لديها القدرة على "ping" من خلال مقاطعة تم العثور على لفتة.
- تشمل المكتبة ، على غرار neopixel
- التصريح بالمكتبة برمز المقاطعة وعلم المقاطعة
#define APDS9960_INT 2
SparkFun_APDS9960 apds = SparkFun_APDS9960 () ، int isr_flag = 0 ؛
- تهيئة المكتبة ، عادة داخل وظيفة الإعداد
الإعداد باطل()
{# قم بتعريف دبوس المقاطعة على أنه INPUT وأرفق وظيفة به pinMode (APDS9960_INT ، INPUT) ؛ attachInterrupt (0، interruptRoutine، FALLING) ؛ if (apds.init () && apds.enableGestureSensor (صحيح)) {Serial.println ("اكتمال تهيئة APDS-9960") ؛ } else {Serial.println ("حدث خطأ أثناء APDS-9960 init!")؛ } ربما # تهيئة أشياء أخرى}
- حدد وظيفة المقاطعة ، هنا سنضع علامة فقط
باطل interruptRoutine () {
isr_flag = 1 ، }
- داخل وظيفة الحلقة ، تحقق من العلم بشكل دوري لمعرفة ما إذا تم اكتشاف إيماءة
حلقة فارغة()
{# تحقق من العلم إذا (isr_flag == 1) {# إذا تم تعيين العلم ، قم بإزالة المقاطعة ، وقم بإجراء المعالجة اللازمة داخل الدالة handleGesture () # ثم أعد تعيين العلم وأعد توصيل المقاطعة detachInterrupt (0) ؛ handleGesture () ؛ isr_flag = 0 ؛ attachInterrupt (0، interruptRoutine، FALLING) ؛ } # بعض الرموز الأخرى هنا ربما}
- تحديد وظيفة handleGesture () حيث يمكننا طلب الإيماءة الأخيرة
مقبض باطل
# إذا لم تكن هناك إيماءة متاحة للعودة ، فهذه مجرد عملية فحص آمنة (! apds.isGestureAvailable ()) {return؛ } # يقرأ الإيماءة الأخيرة ، ويقارن بالإيماءات المعروفة ويطبع مفتاح رسالة (apds.readGesture ()) {case DIR_UP: Serial.println ("UP")؛ استراحة؛ الحالة DIR_DOWN: Serial.println ("DOWN") ؛ استراحة؛ الحالة DIR_LEFT: Serial.println ("LEFT") ؛ استراحة؛ الحالة DIR_RIGHT: Serial.println ("RIGHT") ؛ استراحة؛ الحالة DIR_FAR: Serial.println ("FAR") ؛ استراحة؛ }}
الآن دعنا نرى الكود بالكامل قيد التنفيذ:
لذلك شرحت واجهة برمجة التطبيقات الأساسية لمستشعر الإيماءات وحلقة neopixel ، فلنجمع الآن الأشياء معًا:
تعمل الخوارزمية على النحو التالي:
- تهيئة المكتبات (انظر الكود أعلاه)
- إنشاء مجموعة من شدة الصمام تسمى "ledStates". ستحتوي هذه المجموعة على 24 شدة led مرتبة بطريقة تنازلية من 150 إلى 2
- داخل الحلقة الرئيسية ، تحقق مما إذا كان دبوس المقاطعة قد تم تعديله إذا كان الأمر كذلك ، فقد حان الوقت لتغيير الرسوم المتحركة أو لون الصمام
- تتحقق وظيفة "handleGesture ()" من الإيماءات الأخيرة وتستدعي الوظيفة "toggleColor" لإيماءات UP-DOWN أو تعيين متغير عام "ledDirection" للإيماءات LEFT - RIGHT
- تقوم وظيفة "toggleColor ()" ببساطة بتغيير متغير عام يسمى "colorSelection" بإحدى القيم 0 ، 1 ، 2
- أيضًا داخل دالة الحلقة الرئيسية دالة أخرى تسمى "animateLeds () ؛" يسمى. تتحقق هذه الوظيفة من مرور 100 مللي ثانية ، وإذا كان الأمر كذلك ، فإنها تقوم بتدوير مؤشرات LED باستخدام وظيفة "rotateLeds ()" ثم تعيد رسمها
- "rotateLeds ()" ستقوم "بتدوير" مؤشرات LED للأمام أو للخلف باستخدام مصفوفة أخرى تسمى "intermediateLedStates".
سيبدو "تأثير" الدوران كما يلي:
# بعد التهيئة
{150 ، 100 ، 70 ، 50 ، 40 ، 30 ، 10 ، 2 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0} ؛ # بعد rotateLeds () يسمى {0 ، 150 ، 100 ، 70 ، 50 ، 40 ، 30 ، 10 ، 2 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0} ؛ # بعد rotate يتم استدعاء المصابيح () مرة أخرى {0 ، 0 ، 150 ، 100 ، 70 ، 50 ، 40 ، 30 ، 10 ، 2 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0} ؛ # وما إلى ذلك وهلم جرا
لهذا ، يقوم أولاً بإنشاء المصفوفة الجديدة ونسخ شدة الصمام القديم على المواضع الجديدة (زيادة الموضع أو تقليله). بعد ذلك ، يستبدل المصفوفة "ledStates" بـ "intermediateLedStates" بحيث تستمر العملية بعد 100 مللي ثانية أخرى.
# تضمين "SparkFun_APDS9960.h"
# تضمين "Adafruit_NeoPixel.h"
# تضمين "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS، NEOPIXED_CONTROL_PIN، NUM_LEDS) SparkFun_APDS9960 apds = SparkFun_APDS9960 () ، lastLedChangeTime طويل بدون توقيع = 0 ؛ اتجاه قصير ledDirect = 0 ؛ اختيار لون قصير = 0 ؛ بايت ledStates = {150 ، 100 ، 70 ، 50 ، 40 ، 30 ، 10 ، 2 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0 ، 0} ؛ int isr_flag = 0 ؛ إعداد باطل () {Serial.begin (9600) ؛ Serial.println ("بدأ البرنامج") ؛ strip.begin () ، pinMode (APDS9960_INT ، INPUT) ؛ attachInterrupt (0، interruptRoutine، FALLING) ؛ if (apds.init () && apds.enableGestureSensor (صحيح)) {Serial.println ("اكتمال تهيئة APDS-9960") ؛ } else {Serial.println ("حدث خطأ ما أثناء APDS-9960 init!")؛ } lastLedChangeTime = ميلي () ، Serial.println ("نجاح التهيئة") ؛ } void loop () {if (isr_flag == 1) {detachInterrupt (0)؛ handleGesture () ؛ isr_flag = 0 ؛ attachInterrupt (0، interruptRoutine، FALLING) ؛ } animateLeds () ؛ } void interruptRoutine () {isr_flag = 1 ؛ } / ** * سيتعامل هذا مع الإيماءات من مستشعر APDS9960 * ستستدعي الإيماءات لأعلى ولأسفل وظيفة toggleColor * ستغير الإيماءات اليسرى واليمنى الرسوم المتحركة التي يقودها * / void handleGesture () {if (! apds.isGestureAvailable ()) {return ؛ } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP") ، toggleColor () ، استراحة؛ الحالة DIR_DOWN: Serial.println ("DOWN") ؛ toggleColor () ، استراحة؛ الحالة DIR_LEFT: ledDirection = 1 ؛ Serial.println ("LEFT") ؛ استراحة؛ الحالة DIR_RIGHT: ledDirection = -1 ؛ Serial.println ("RIGHT") ؛ استراحة؛ الحالة DIR_FAR: ledDirection = 0 ؛ Serial.println ("FAR") ؛ استراحة؛ }} / ** * تغيير لون المصابيح الحالية * في كل مرة يتم فيها استدعاء هذه الوظيفة ستغير حالة المصابيح * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1؛ } else if (colorSelection == 1) {colorSelection = 2 ؛ } آخر {colorSelection = 0 ؛ }} / ** * سيتم تشغيل الرسوم المتحركة بعد LED_SPEED_STEP_INTERVAL مللي * أولاً يتم استدعاء وظيفة rotateLeds ، ثم يتم تعيين ألوان المصابيح باستخدام strip api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return ؛ } rotateLeds () ؛ لـ (int i = 0؛ i <NUM_LEDS؛ i ++) {strip.setPixelColor (i، getColor (ledStates )) ؛ عرض الشريط()؛ } lastLedChangeTime = ميلي () ، } / ** * باستخدام مصفوفة ثانوية "intermediateLedStates" ، يتم تحريك شدة مؤشرات LED * أولاً يتم نسخ القيم من "ledStates" في "intermediateLedStates" مثل ذلك * دعنا نجلس في مصفوفة "ledStates" هي {100 ، 80 ، 60 ، 0 ، 0، 0} و ledDirection هو 1 * ثم بعد هذه الوظيفة تسمى مصفوفة "ledStates" تكون {0، 100، 80، 60، 0، 0} محاكاة تأثير الدوران * / void rotateLeds () {byte intermediateLedStates [NUM_LEDS] ؛ لـ (int i = 0 ؛ i <NUM_LEDS ؛ i ++) {intermediateLedStates = 0 ؛ } لـ (int i = 0؛ i <NUM_LEDS؛ i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ؛ } else {intermediateLedStates [i + 1] = ledStates ؛ }} else {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ؛ } else {intermediateLedStates [i - 1] = ledStates ؛ }}} لـ (int i = 0؛ i <NUM_LEDS؛ i ++) {ledStates = intermediateLedStates ؛ }} uint32_t getColor (كثافة العمليات) {switch (colorSelection) {case 0: return strip. Color (كثافة ، 0 ، 0) ؛ الحالة 1: شريط العودة اللون (0 ، الكثافة ، 0) ؛ الافتراضي: عودة الشريط.اللون (0 ، 0 ، كثافة) ؛ }}
أتمنى أن تكون قد استمتعت بهذا ، يمكنك استخدام قسم التعليقات لطرح الأسئلة علي.
موصى به:
التحكم في الكمبيوتر باستخدام الإيماءات والإدخال باللمس: 3 خطوات
التحكم في الكمبيوتر باستخدام الإيماءات وإدخال اللمس: هذا مشروع تجريبي لـ Piksey Atto الجديد. نستخدم TTP224 touch IC ووحدة إيماءات APDS-9960 للتحكم في الكمبيوتر. نقوم بتحميل رسم تخطيطي إلى Atto مما يجعله يعمل مثل لوحة مفاتيح USB ثم يرسل رموز المفاتيح المناسبة depen
قياس مسافة القرب باستخدام مستشعر الإيماءات APDS9960: 6 خطوات
قياس مسافة القرب باستخدام مستشعر الإيماءات APDS9960: في هذا البرنامج التعليمي سوف نتعلم كيفية قياس المسافة باستخدام مستشعر الإيماءات APDS9960 و arduino و Visuino. شاهد الفيديو
ماوس يتم التحكم فيه عن طريق الإيماءات باستخدام Micro: bit: 5 خطوات
ماوس يتم التحكم فيه بالإيماءات باستخدام Micro: bit: مقدمة المشروع عبارة عن ماوس يتم التحكم فيه عن طريق الإيماءات ، على شكل قفاز مع micro: bit مدمج فيه. إنه مشروع مستوحى من فكرة مبكرة لدي كمهندس مضمن. أرغب دائمًا في الوصول إلى ماوس لاسلكي ومجموعة لوحة مفاتيح
سيارة يتم التحكم فيها عن طريق الإيماءات: 5 خطوات (بالصور)
السيارة التي يتم التحكم فيها عن طريق الإيماءات: تلعب الروبوتات دورًا مهمًا في الأتمتة في جميع القطاعات مثل الإنشاءات والعسكرية والطبية والتصنيع وما إلى ذلك
بيانو Pi بالموجات فوق الصوتية مع أدوات التحكم في الإيماءات: 10 خطوات (بالصور)
Ultrasonic Pi Piano with Gesture Controls!: يستخدم هذا المشروع مستشعرات الموجات فوق الصوتية HC-SR04 غير مكلفة كمدخلات ويولد ملاحظات MIDI التي يمكن تشغيلها من خلال المزج على Raspberry Pi للحصول على صوت عالي الجودة. يستخدم المشروع أيضًا شكلًا أساسيًا من التحكم بالإيماءات ، حيث الموسيقى