فهرست مطالب:

کنترل حلقه LED نئوپیکسل با حسگر اشاره: 3 مرحله (همراه با تصاویر)
کنترل حلقه LED نئوپیکسل با حسگر اشاره: 3 مرحله (همراه با تصاویر)

تصویری: کنترل حلقه LED نئوپیکسل با حسگر اشاره: 3 مرحله (همراه با تصاویر)

تصویری: کنترل حلقه LED نئوپیکسل با حسگر اشاره: 3 مرحله (همراه با تصاویر)
تصویری: Marlin Firmware 2.0.x Explained 2024, نوامبر
Anonim
Image
Image
مونتاژ و بارگذاری
مونتاژ و بارگذاری

در این آموزش ما قصد داریم با یک سنسور حرکت (APDS-9960) و یک حلقه نئوپیکسلی بازی کنیم تا نحوه ترکیب هر دوی آنها با استفاده از Arduino UNO را بیاموزیم.

محصول نهایی به حرکات سمت چپ - راست با حرکت دادن حرکت led به راست یا چپ و به حرکات بالا به پایین با تغییر رنگ led پاسخ می دهد.

در مراحل بعدی ، لیست قسمت ها و نحوه اتصال اجزاء را به طور مختصر مرور می کنید. و سپس کد را مرحله به مرحله مرور می کنیم تا نحوه عملکرد آن را بیاموزیم.

مرحله 1: اجزاء

1. آردوینو UNO

2. کابل usb

3. سنسور حرکت APDS9960 (https://www.sparkfun.com/products/12787)

4. حلقه led 24 نئوپیکسل led (https://www.adafruit.com/product/1586)

5. کابل های نان زن-مرد ، مرد-مرد نرد

6. تخته نان

7. منبع تغذیه 5 ولت برای حلقه led (من از 4 باتری عقب استفاده می کنم)

8. برای اتصال حلقه نئوپیکسل به تخته نان باید سه پین نر به آن لحیم کنید: GND ، PWR و پین کنترل. برای این کار به آهن لحیم کاری و شار احتیاج دارید

اجزای اصلی در اینجا سنسور حرکت APDS-9960 و حلقه نئوپیکسلی 24 است. می توانید آردوینوهای مختلف ، منبع تغذیه کابل های USB و بردبرد را به دلخواه تغییر دهید.

مرحله 2: مونتاژ و بارگذاری

مونتاژ

قبل از شروع ، مطمئن شوید که همه اجزای روی میز خود را دارید. ما مراحل خوبی را باید دنبال کنیم:). من همچنین شماتیک Fritzing را به عنوان یک تصویر و همچنین در قالب مهیج پیوست کرده ام.

1. 3 پین نر را به حلقه نئوپیکسل (GND ، PWR ، پین کنترل) لحیم کنید

2. حلقه نئوپیکسل را به تخته نان وصل کنید

3. سنسور APDS9960 را به تخته نان متصل کنید

4. زمینه را متصل کنید: بسته باتری ، arduino UNO ، APDS9960 و neopixel را به زمین نان برید

5. برق را وصل کنید: arduino UNO 3V به پین برق APDS9960 ، نئوپیکسل به پک باتری

6. پین کنترل neopixel را به پین arduino D6 وصل کنید

7. SDA و SCL APDS9960 را به ترتیب به A4 و A5 وصل کنید

8. پین وقفه APDS9960 را به arduino D2 وصل کنید

بارگذاری کد

ابتدا باید کتابخانه های arduino لازم را بارگیری و نصب کنید:

1. کتابخانه حلقه نئوپیکسل:

2. کتابخانه حسگر حرکت:

اگر نمی دانید چگونه کتابخانه های arduino را نصب کنید ، این آموزش را ببینید.

پس از بارگیری و نصب کتابخانه های بالا ، می توانید مخزن arduino من را در اینجا کلون یا بارگیری کنید: https://github.com/danionescu0/arduino ، و ما از این طرح استفاده می کنیم: https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures

در بخش بعدی ، کد را مستقیماً در این آموزش قرار می دهم ، بنابراین اگر دوست دارید می توانید آن را کپی و جایگذاری کنید.

در نهایت آردوینو را با استفاده از کابل usb کامپیوتر متصل کنید ، باتری های 1.5 ولت را در بسته باتری قرار دهید و طرح را در آردوینو بارگذاری کنید.

مرحله 3: چگونه کار می کند؟

در این قسمت آخر یاد می گیریم که چگونه این اجزا با هم ترکیب شده اند ، چگونه از کتابخانه های آنها استفاده کنم و چگونه ساختار کد خود را ایجاد کرده ام:

ابتدا اجازه دهید نگاهی گذرا به سنسور و روشهای API کتابخانه neopixel که از آنها استفاده می کنیم بیندازیم

1. API Neopixel از adafruit

در این کتابخانه از روش هایی استفاده می کنیم که رنگ led های فردی را کنترل کرده و آنها را اعمال می کند

- شامل کتابخانه:

#عبارتند از

- اعلام کتابخانه

#تعریف NEOPIXED_CONTROL_PIN 6

#تعریف NUM_LEDS 24 نوار Adafruit_NeoPixel = Adafruit_NeoPixel (NUM_LEDS ، NEOPIXED_CONTROL_PIN ، NEO_RBG + NEO_KHZ800) ؛

- مقداردهی اولیه

#به طور معمول در بلوک راه اندازی

void setup () {strip.begin ()؛ # شاید چیزهای دیگر در اینجا #…. }

- پیکسل های جداگانه را روشن کنید و سپس همه تغییرات را روی نوار اعمال کنید (آن را به روشی ارائه دهید)

# پیکسل 0 را قرمز تنظیم کنید

strip.setPixelColor (0 ، strip. Color (255 ، 0 ، 0)) ؛ # پیکسل 1 را تنظیم کنید تا سبز باشد strip.setPixelColor (1 ، نوار. رنگ (0 ، 255 ، 0)) ؛ # پیکسل 2 را تنظیم کنید تا آبی باشد strip.setPixelColor (2 ، نوار. رنگ (0 ، 0 255)) ؛ strip.show ()؛

2. سنسور حرکت APDS 9960

از این کتابخانه ما از تابع "خواندن اشاره" استفاده می کنیم. این تابع قادر خواهد بود بین دستورات چپ-راست ، بالا-پایین ، نزدیک-دور تمایز قائل شود. در اینجا یک ترفند وجود دارد ، ما قصد نداریم آخرین حسگر را به طور مداوم از آخرین حس شده بپرسیم. تخته دارای قابلیت "پینگ" از طریق وقفه ای است که یک حرکت پیدا شده است.

- شامل کتابخانه ، مشابه نئوپیکسل

- کتابخانه را پین وقفه و پرچم وقفه را اعلام کنید

#تعریف APDS9960_INT 2

SparkFun_APDS9960 apds = SparkFun_APDS9960 ()؛ int isr_flag = 0؛

- راه اندازی اولیه کتابخانه ، معمولاً در داخل تابع راه اندازی

void setup ()

{ # پین وقفه را به عنوان INPUT اعلام کرده و یک تابع را به آن pinMode وصل کنید (APDS9960_INT ، INPUT) ؛ attachInterrupt (0 ، interruptRoutine ، FALLING) ؛ if (apds.init () && apds.enableGestureSensor (درست)) {Serial.println ("مقداردهی اولیه APDS-9960 کامل شد") ؛ } else {Serial.println ("هنگام APDS-9960 init مشکلی پیش آمد!")؛ } # راه اندازی چیزهای دیگر شاید}

- تابع وقفه را تعریف کنید ، در اینجا فقط یک پرچم تنظیم می کنیم

void interruptRoutine () {

isr_flag = 1؛ }

- داخل عملکرد حلقه پرچم را به صورت دوره ای بررسی کنید تا ببینید آیا یک حرکت تشخیص داده شده است یا خیر

حلقه خالی ()

{ # پرچم را بررسی کنید (isr_flag == 1) { # اگر پرچم تنظیم شده است ، وقفه را بردارید ، پردازش لازم را در داخل تابع handleGesture () # انجام دهید و سپس پرچم را بازنشانی کرده و وقفه را جدا کنید interachInterrupt (0). handleGesture ()؛ isr_flag = 0؛ attachInterrupt (0 ، interruptRoutine ، FALLING) ؛ } # چند کد دیگر در اینجا شاید}

- تعریف تابع () handleGesture که در آن می توانیم آخرین حرکت را درخواست کنیم

void handleGesture () {

# اگر هیچ حرکتی برگشت پذیر نیست ، این فقط یک بررسی مطمئن است اگر (! apds.isGestureAvailable ()) {بازگشت ؛ } # آخرین ژست را می خواند ، با موارد شناخته شده مقایسه می کند و یک سوئیچ پیام (apds.readGesture ()) را چاپ می کند {case DIR_UP: Serial.println ("UP") ؛ زنگ تفريح؛ مورد DIR_DOWN: Serial.println ("پایین") ؛ زنگ تفريح؛ مورد DIR_LEFT: Serial.println ("چپ") ؛ زنگ تفريح؛ مورد DIR_RIGHT: Serial.println ("RIGHT")؛ زنگ تفريح؛ مورد DIR_FAR: Serial.println ("FAR")؛ زنگ تفريح؛ }}

حالا بیایید کل کد را در عمل ببینیم:

بنابراین من API پایه سنسور حرکت و حلقه نئوپیکسلی را توضیح دادم ، حالا بیایید موارد را کنار هم قرار دهیم:

الگوریتم به این صورت اجرا می شود:

- راه اندازی کتابخانه ها (کد بالا را ببینید)

- ایجاد مجموعه ای از شدت های led به نام "ledStates". این آرایه شامل 24 شدت led است که به صورت نزولی از 150 تا 2 مرتب شده اند

- در داخل حلقه اصلی بررسی کنید که آیا پین وقفه تغییر کرده است ، آیا زمان تغییر انیمیشن یا رنگ led است

- عملکرد "handleGesture ()" آخرین حرکت را بررسی می کند و تابع "toggleColor" را برای حرکات بالا -پایین فرا می خواند یا یک متغیر جهانی "ledDirection" را برای حرکات چپ - راست تنظیم می کند

- تابع "toggleColor ()" به سادگی یک متغیر جهانی به نام "colorSelection" را با یکی از مقادیر 0 ، 1 ، 2 تغییر می دهد

- همچنین در داخل تابع حلقه اصلی یک تابع دیگر به نام "animateLeds ()؛" نامیده میشود. این تابع بررسی می کند که آیا 100 میلی ثانیه سپری شده است و در این صورت آیا led ها را با استفاده از تابع "rotateLeds ()" می چرخاند و سپس آنها را دوباره ترسیم می کند

- "rotateLeds ()" با استفاده از آرایه دیگری به نام "intermediateLedStates" ، led ها را به جلو یا عقب "می چرخاند".

چرخش "اثر" به شکل زیر خواهد بود:

# بعد از راه اندازی اولیه

{150، 100، 70، 50، 40، 30، 10، 2، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0}؛ # after 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} ؛ # after rotateLeds () دوباره {0، 0، 150، 100، 70، 50، 40، 30، 10، 2، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0، 0 فراخوانی می شود ، 0 ، 0 ، 0} ؛ # و غیره

بدین منظور ابتدا آرایه جدیدی ایجاد می کند و شدت led های قبلی را در موقعیت های جدید کپی می کند (موقعیت را افزایش دهید یا آن را کاهش دهید). پس از آن آرایه "ledStates" را با "intermediateLedStates" بازنویسی می کند ، بنابراین این روند پس از 100 میلی ثانیه دیگر ادامه می یابد.

#شامل "SparkFun_APDS9960.h"

#شامل "Adafruit_NeoPixel.h"

#شامل "Wire.h" #تعریف NEOPIXED_CONTROL_PIN 6 #تعریف NUM_LEDS 24 #تعریف APDS9960_INT 2 #تعریف LED_SPEED_STEP_INTERVAL 100 نوار Adafruit_NeoPixel = Adafruit_NeoPixel (NEOPLE) ، SparkFun_APDS9960 apds = SparkFun_APDS9960 ()؛ unsigned long lastLedChangeTime = 0؛ ledDirection کوتاه = 0 ؛ short colorSelection = 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؛ void setup () {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 = millis ()؛ Serial.println ("با موفقیت شروع شود")؛ } void loop () {if (isr_flag == 1) {detachInterrupt (0)؛ handleGesture ()؛ isr_flag = 0؛ attachInterrupt (0 ، interruptRoutine ، FALLING) ؛ } animateLeds ()؛ } void interruptRoutine () {isr_flag = 1؛ }) ؛ } switch (apds.readGesture ()) {case DIR_UP: Serial.println ("UP")؛ toggleColor ()؛ زنگ تفريح؛ مورد DIR_DOWN: Serial.println ("پایین") ؛ toggleColor ()؛ زنگ تفريح؛ مورد DIR_LEFT: ledDirection = 1؛ Serial.println ("چپ") ؛ زنگ تفريح؛ مورد DIR_RIGHT: ledDirection = -1؛ Serial.println ("راست") ؛ زنگ تفريح؛ مورد DIR_FAR: ledDirection = 0؛ Serial.println ("FAR") ؛ زنگ تفريح؛ }} / ** * تغییر رنگ led های فعلی * هر بار که این تابع فراخوانی می شود حالت leds تغییر می کند * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1 } else if (colorSelection == 1) {colorSelection = 2؛ } else {colorSelection = 0؛ }} ** ؛ } rotateLeds ()؛ برای (int i = 0؛ i <NUM_LEDS؛ i ++) {strip.setPixelColor (i، getColor (ledStates ))؛ strip.show ()؛ } lastLedChangeTime = millis ()؛ }) ، 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 (int int) {switch (colorSelection) {case 0: strip return. Color (شدت ، 0 ، 0) ؛ مورد 1: نوار بازگشت. رنگ (0 ، شدت ، 0) ؛ پیش فرض: نوار بازگشت. رنگ (0 ، 0 ، شدت) ؛ }}

امیدوارم از این مورد لذت برده باشید ، می توانید از بخش نظرات برای پرسیدن سوالات من استفاده کنید.

توصیه شده: