کنترل تعداد زیادی LED رنگی + ترتیب‌دهی چند LED: ایجاد یک نمودار میله‌ای

قسمت 42
مشاهده سایر جلسات آموزش
229 بازدید
۱۴۰۴-۰۹-۱۶
8 دقیقه
  • نویسنده: Arduino captain
  • درباره نویسنده: من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!

در قسمت 41 از آموزش آردوینو به بررسی راه‌اندازی LEDهای توان‌بالا و تنظیم رنگ یک LED پرداختیم. در این قسمت قصد داریم درباره کنترل تعداد زیادی LED رنگی و ترتیب‌دهی چند LED: ایجاد یک نمودار میله‌ای (Bar Graph) صحبت کنیم.

کنترل تعداد زیادی LED رنگی

فرض کنید می‌خواهید تنها با استفاده از یک پایه‌ی دیجیتال، رنگ تعداد زیادی LED را کنترل کنید.

در این روش از LEDهای RGB هوشمند استفاده می‌شود؛ این LEDها یک کنترل‌کننده‌ی کوچک درون خود دارند که امکان کنترل تعداد زیادی LED را تنها از طریق یک پایه‌ی دیجیتال فراهم می‌کند. این کد نمونه با استفاده از کتابخانه‌ی Adafruit NeoPixels (که از طریق Arduino Library Manager قابل‌نصب است)، رنگ LEDها را بر اساس مقدار خوانده‌شده از یک پایه‌ی آنالوگ تغییر می‌دهد. شکل 1 نحوه‌ی اتصال یک حلقه‌ی NeoPixel و یک پتانسیومتر را برای کنترل رنگ نشان می‌دهد.

شکل 1: اتصال یک حلقه NeoPixel

شکل 1: اتصال یک حلقه NeoPixel

✅نکته

اگر از یک برد ۳٫۳ ولتی استفاده می‌کنید، لازم است هم پتانسیومتر و هم سیم مثبت نئوپیکسل را به ۳٫۳ ولت وصل کنید، نه ۵ ولت.

این اسکچ یک stick، نوار یا گروهی از نئوپیکسل‌های زنجیره‌ای Adafruit را که شامل هشت LED RGB هستند، راه‌اندازی می‌کند. اگر تعداد LEDهای متفاوتی وصل کرده‌اید، می‌توانید مقدار متغیر numOfLeds را تغییر دهید، اما در نظر داشته باشید که هر LED ممکن است تا ۶۰ میلی‌آمپر مصرف کند (اگر روی نور سفید با حداکثر روشنایی تنظیم شده باشد). یک پورت USB می‌تواند تا حدود هشت LED را تغذیه کند، اما برای تعداد بیشتر باید کانکتورهای تغذیهٔ نوار LED را به یک منبع تغذیهٔ ۵ ولت با جریان بالاتر وصل کنید؛ البته باید زمین (GND) منبع تغذیه را به زمین آردوینو هم متصل کنید.

اگر از یک برد ۳٫۳ ولتی استفاده می‌کنید، نباید نئوپیکسل‌ها را با ولتاژی بیشتر از ۳٫۷ ولت تغذیه کنید (مثل باتری لیتیوم-پلیمر)، زیرا نئوپیکسل‌ها به سیگنال داده‌ای نیاز دارند که نزدیک به ولتاژ تغذیهٔ آن‌ها باشد. هنگام استفاده از یک منبع تغذیهٔ خارجی، باید یک خازن ۱۰۰۰ میکروفاراد را بین پین‌های مثبت و منفی منبع تغذیه وصل کنید تا از پیکسل‌ها محافظت شود (به پلاریته خازن توجه کنید و مطمئن شوید که آن را درست وصل می‌کنید).

متغیر leds با این کد تعریف شده است:

شاید برای شما مفید باشد:
پلتفرم آردوینو: روح آردوینو در کالبدهای دیگر قسمت اول | همراه با راه‌اندازی OLED و سنسور دما DS18B20

این کد یک ساختار حافظه ایجاد می‌کند تا رنگ هر LED را ذخیره کند و با نوار LED ارتباط برقرار کند. شما باید تعداد LEDهای نوار (count)، پینی که خط داده به آن وصل شده (ledPin) و نوع نوار LED مورداستفاده خود را مشخص کنید (در این مثال: NEO_GRB + NEO_KHZ800.) لازم است داکیومنت کتابخانه و نوار خود را بررسی کنید تا ببینید آیا به تنظیمات متفاوتی نیاز دارید یا نه، اما هیچ ضرری ندارد که همه گزینه‌های موجود در کتابخانه را امتحان کنید تا یکی را پیدا کنید که درست کار می‌کند.

برای تعیین رنگ یک LED خاص، از روش led.setPixelColor استفاده می‌کنید. باید شماره LED موردنظر را مشخص کنید (شماره‌ها از ۰ برای اولین LED  شروع می‌شوند) و رنگ دلخواه را تعیین کنید. برای ارسال داده‌ها به LEDها باید led.show را فراخوانی کنید. می‌توانید مقدار چند LED را قبل از فراخوانی led.show تغییر دهید تا همه با هم تغییر کنند. مقادیری که تغییر نکرده‌اند، در تنظیمات قبلی خود باقی می‌مانند. هنگام ایجاد شیء Adafruit_NeoPixel، همه مقادیر به ۰ مقداردهی اولیه می‌شوند.

کتابخانه NeoPixel شامل تابعی برای تبدیل hue به مقدار RGB است: ColorHSV. پارامتر اول رنگ (hue)، پارامتر دوم شدت رنگ (saturation) و پارامتر سوم روشنایی (brightness) است. تابع gamma32 روی خروجی ColorHSV اعمال می‌شود تا تفاوت بین نحوه نمایش رنگ‌ها توسط کامپیوتر و نحوه درک آن‌ها توسط چشم انسان جبران شود.

هر LED یا «پیکسل» دارای اتصال‌هایی برای ورودی و خروجی داده، تغذیه و زمین است. آردوینو ورودی داده اولین پیکسل را کنترل می‌کند و خروجی داده آن به ورودی داده پیکسل بعدی در زنجیره متصل می‌شود. شما می‌توانید پیکسل‌ها را به‌صورت جداگانه یا به شکل نوارهایی که از قبل به هم متصل شده‌اند، خریداری کنید.

اگر نوار LED شما توسط کتابخانه Adafruit پشتیبانی نمی‌شود

نوارهای LED قدیمی از تراشه WS2811 استفاده می‌کردند. بعد از آن نسخه‌های مختلف دیگری مانند WS2812 ،WS2812B و APA102 عرضه شدند. اگر LEDهای شما توسط کتابخانه Adafruit پشتیبانی نمی‌شوند، می‌توانید از کتابخانه FastLED استفاده کنید. بردهای Teensy 3.x و بالاتر که با آردوینو سازگار هستند، می‌توانند هشت نوار LED را روی پین‌های مختلف کنترل کنند و با ترکیبی از سخت‌افزار و نرم‌افزار پرسرعت، امکان ایجاد انیمیشن‌های بسیار باکیفیت را فراهم می‌کنند.

LEDها به‌صورت تک‌تک موجود هستند، اما روی نوارهای انعطاف‌پذیر در رول‌ها نیز عرضه می‌شوند و با فاصله‌های مختلف بین LEDها مشخص می‌شوند (معمولاً به‌صورت LED بر متر یا فوت). شرکت Adafruit انواع مختلفی از فرم‌فاکتورهای PCB تولید می‌کند، از جمله حلقه‌های LED، نوارهای کوتاه و پنل‌ها که تحت برند NeoPixel عرضه می‌شوند.

راهنمای Adafruit NeoPixel Uber شامل:

کتابخانه Teensy که تصاویر خوبی از نحوه سیم‌کشی برای منبع تغذیه با تعداد زیاد LEDها دارد و همچنین یک برنامه Processing که داده‌ها را از ویدئو استخراج می‌کند تا بتوانید آن‌ها را به کد اضافه کرده و ویدئو را روی نوارهای LED نمایش دهید.

ترتیب‌دهی چند LED: ایجاد یک نمودار میله‌ای (Bar Graph)

فرض کنید می‌خواهید یک نمودار میله‌ای LED داشته باشید که تعداد LEDهای روشن شده متناسب با یک مقدار در برنامه شما یا مقداری که از یک سنسور خوانده می‌شود، باشد. می‌توانید LEDها را همان‌طور که قسمت‌های قبل توضیح داده شد، وصل کنید (اگر می‌خواهید LEDهای بیشتری داشته باشید، از پین‌های اضافی استفاده کنید). شکل 2 شش LED را نشان می‌دهد که به پین‌های متوالی متصل شده‌اند.

شکل 2: شش LED با کاتدهای متصل به پین‌های آردوینو

شکل 2: شش LED با کاتدهای متصل به پین‌های آردوینو

این اسکچ یک سری از LEDها را روشن می‌کند، به‌طوری که تعداد LEDهای روشن شده متناسب با مقدار یک سنسور است که به یک پورت ورودی آنالوگ متصل شده است:

شاید برای شما مفید باشد:
()analogWrite در آردوینو

پین‌هایی که به LEDها متصل هستند، در آرایه ledPins نگهداری می‌شوند. برای تغییر تعداد LEDها، می‌توانید المان‌هایی به این آرایه اضافه یا حذف کنید، اما مطمئن شوید که مقدار متغیر NbrLEDs با تعداد المان‌های آرایه برابر باشد که باید با تعداد پین‌ها همخوانی داشته باشد. می‌توانید به کامپایلر اجازه دهید مقدار NbrLEDs را برای شما محاسبه کند، با جایگزین‌کردن این کد:

با این کد:

تابع sizeof اندازه (تعداد بایت‌ها) یک متغیر را برمی‌گرداند—در اینجا، تعداد بایت‌های موجود در آرایه ledPins. ازآنجاکه این آرایه شامل اعداد صحیح است (هر عنصر دو بایت)، تعداد کل بایت‌های آرایه بر اندازه یک عنصر (sizeof(ledPins[0])) تقسیم می‌شود و این مقدار، تعداد عناصر آرایه را به دست می‌دهد.

تابع map در آردوینو برای محاسبه تعداد LEDهایی استفاده می‌شود که باید روشن شوند، به‌صورت متناسب با مقدار سنسور. کد برای هر LED حلقه می‌زند و آن را روشن می‌کند اگر مقدار متناسب سنسور بزرگ‌تر از شماره LED باشد.

برای مثال: اگر مقدار سنسور کمتر از ۱۰ باشد، هیچ LEDی روشن نمی‌شود؛ اگر مقدار سنسور نصف مقدار ماکزیمم باشد، نصف LEDها روشن می‌شوند. در حالت ایده‌آل، پتانسیومتر در کمترین تنظیم مقدار صفر را برمی‌گرداند، اما در دنیای واقعی ممکن است کمی تغییر داشته باشد. وقتی سنسور به بیشترین مقدار می‌رسد، همه LEDها روشن می‌شوند. اگر مشاهده کردید آخرین LED هنگام حداکثر مقدار پتانسیومتر چشمک می‌زند، می‌توانید مقدار دوم تابع map را از ۱۰۲۳ به حدود ۱۰۰۰ کاهش دهید.

شکل 2 نشان می‌دهد که همه آندها به هم متصل شده‌اند که به آن Common Anode گفته می‌شود و کاتدها به پین‌ها وصل هستند؛ در این حالت، پین باید LOW باشد تا LED روشن شود.

اگر LEDها به‌گونه‌ای باشند که آندها به پین‌ها متصل باشند و کاتدها به هم متصل شده باشند که به آن Common Cathode گفته می‌شود، LED وقتی روشن می‌شود که پین HIGH شود.

در این اسکچ، از نام‌های ثابت LED_ON و LED_OFF استفاده شده تا انتخاب بین اتصال Common Anode یا Common Cathode راحت باشد. برای تغییر برنامه به حالت Common Cathode، کافی است مقادیر این ثابت‌ها را به‌صورت زیر جابه‌جا کنید:

ممکن است بخواهید سرعت کاهش نور LEDها را کند کنید؛ مثلاً برای شبیه‌سازی حرکت نشانگر یک volume meter. در اینجا یک نسخهٔ تغییریافته از اسکچ آمده است که وقتی سطح کاهش می‌یابد، میله‌های LED را به‌آرامی خاموش می‌کند:

شاید برای شما مفید باشد:
راه‌اندازی I2C در میکروکنترلر WCH | قسمت دوازدهم آموزش CH32

کاهش نور (Decay) با خطی که از تابع max استفاده می‌کند مدیریت می‌شود. این تابع بالاترین مقدار بین مقدار سنسور و مقدار ذخیره‌شده کاهش‌یافته را برمی‌گرداند. اگر مقدار سنسور بیشتر از مقدار کاهش‌یافته باشد، این مقدار در storedValue ذخیره می‌شود. در غیر این صورت، سطح storedValue در هر بار اجرای حلقه، به اندازه ثابت decay کاهش می‌یابد (که توسط تابع delay روی ۱۰ میلی‌ثانیه تنظیم شده است). افزایش مقدار ثابت decay باعث می‌شود زمان لازم برای خاموش‌شدن کامل LEDها کمتر شود.

می‌توانید این نمودار میله‌ای را با استفاده از NeoPixel هم پیاده‌سازی کنید. کد مربوط به این کار به‌صورت زیر خواهد بود:

اطلاعات
229
0
0
اشتراک و حمایت
profile نویسنده: Arduino captain متخصص الکترونیک

من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!


ویراستار: محمد کبیر
مقالات بیشتر

slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله

خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer
نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله