جدول المحتويات:

التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)
التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)

فيديو: التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)

فيديو: التحكم في حلقة LED من Neopixel باستخدام مستشعر الإيماءات: 3 خطوات (بالصور)
فيديو: How to Synchronize 4 Motors in Python with MINDSTORMS Robot Inventor Gelo 2024, يوليو
Anonim
Image
Image
التجميع والتحميل
التجميع والتحميل

في هذا البرنامج التعليمي ، سنلعب باستخدام مستشعر الإيماءات (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 ، كثافة) ؛ }}

أتمنى أن تكون قد استمتعت بهذا ، يمكنك استخدام قسم التعليقات لطرح الأسئلة علي.

موصى به: