موضوعاتی که در این مقاله به آنها پرداخته خواهد شد :
معرفی درایور WS2812B
WS2812B بدون تردید یکی از درایورهای RGB LED بسیار محبوب است و با توجه به ولتاژ پایین راه اندازی و روشنایی بالا و ثبات رنگ خوب ، یکی از اصلی ترین گزینه های نورپردازی برای هر سازنده است.
WS2812B در واقع یک تراشه کنترل کننده جریان ثابت قابل برنامه ریزی می باشد که با یک LED RGB درون یک پکیج با ابعاد 5050 ترکیب شده است و برای راه اندازی تنها به یک سیم دیتا نیاز دارد . بنابراین چون که هر LED رنگی یک تراشه برنامه پذیر در درون خود دارد و می توان هر پیکسل از این LED ها را با رنگ دلخواه برنامه ریزی کرد ، از این رو LED پیکسلی نیز نامیده می شوند .
شماتیک درایور WS2812B
هر LED دارای یک ورودی داده و یک پین خروجی داده است. با اتصال پین خروجی داده به پین ورودی داده LED بعدی ، می توان LED ها را به طول دلخواه به صورت نوار(Strip) و زنجیره به یکدیگر متصل نمود .
نحوه ایجاد رنگ توسط درایور WS2812B
همانطور که می دانید همه رنگها را می توان از ترکیب سه رنگ آبی(BLUE) و سبز(GREEN) و قرمز(RED) تولید کرد . هر کدام از سه رنگ اصلی شامل 8 بیت می باشد ، بنابراین هر رنگ که توسط WS2812B تولید می شود شامل سه تا 8 بیت یا 24 بیت اطلاعات به شکل زیر می باشد . توالی ارسال رنگها توسط درایورهای مختلف با هم تفاوت دارند . توالی رنگها برای درایور WS2812B به شکل GRB می باشد .
LED های WS2812B توسط شرکت Adafruit به عنوان NeoPixel معروف شده است . کاری که یک کنترلر کوچک در داخل NeoPixel انجام می دهد این است که از تمام داده های منتقل شده به آن ، به سادگی یک تکه از داده های رنگی را می گیرد و تکه های باقی مانده را به LED بعدی منتقل می کند.
پروتکل راه اندازی درایور WS2812B
برای بررسی دقیق نحوه ارسال بیت های رنگ به درایور WS2812B ، باید نگاهی به پروتکل ارتباطی آن در دیتاشیت که توسط شرکت سازنده درایور ارایه شده است بیاندازیم .
دیتاشیت WS2812B به ما نشان می دهد که هسته اصلی این پروتکل تک سیمه (1WIRE) ، یک سیگنال PWM با فرکانس تقریبی 800KHz می باشد .
اما NeoPixel چگونه می داند بیتی که بر روی یک سیم و توسط PWM دریافت می کند 0 است یا 1؟ بیایید با هم مشخص کنیم!
همانطور که می دانید در PWM فرکانس ثابت است و فقط عرض پالس(Duty Cycle) تغییر می کند . بنابراین بیت ها به صورت پالس های مستطیلی شکل ، یکی پس از دیگری ، ابتدا MSB (مهمترین بیت) با فرکانس ثابت 800 کیلوهرتز ارسال می شوند. ما با نگاه کردن به مدت زمانی که عرض پالس در سطح HIGH(5 ولت) است و چه مدت در سطح LOW(0 ولت) است ، می توانیم در طول پالس ، صفر و یک را از هم جدا می کنیم.
اکنون با توجه به دیاگرام زمانی بالا می توانیم به سوالات زیر پاسخ دهیم :
برای تنظیم یک رنگ NeoPixel چند بیت لازم است؟
BITS PER PIXEL = 8 Bit * 3 colors = 24 Bit
ارسال یک بیت چقدر زمان می برد؟
T_Bit = 1 / f_Bit = 1 / 800 kHz = 1.25 µs
ارسال یک بایت چقدر زمان می برد؟
T_Byte = 8 Bit * T_Bit = 10 µs
ارسال رنگ NeoPixel چقدر زمان می برد؟
T_RGB = T_Byte * 3 colors = 30 µs
ارسال 8 رنگ NeoPixel چقدر زمان می برد؟
T_refresh = 8 * T_RGB = 240 µs
چه زمانی می دانید که یک چرخه ارسال داده به پایان رسیده است؟
پس از ارسال همه بیت ها ، سیگنال باید حداقل 50 µs در سطح LOW (0 ولت) نگه داشته شود تا انتقال کامل شود.
متأسفانه ، پروتکل سریال تک سیمه (1WIRE) WS2812B ، توسط میکروکنترلر پشتیبانی نمی شود . چندین روش برای ایجاد این پروتکل و کنترل LED NeoPixel وجود دارد ، این امر به ویژه در میکروکنترلرهایی با نرخ پایین فرکانس کاری به دلیل سرعت نسبتاً بالای داده پروتکل ، چالش برانگیز است.
در میکروکنترلرهایی مانند STM32 که واحد سخت افزاری مناسب مثل واحد DMA و TIMER را دارند ، می توانیم با استفاده از DMA (دسترسی مستقیم به حافظه) یک RING BUFFER یا بافر دایره ای ایجاد کنیم و با استفاده از یک تایمر در مد PWM ، پروتکل را با حداقل منابع سخت افزاری ایجاد کنیم .
در میکروکنترلرهایی مثل AVR که فاقد واحد DMA می باشند ، می توان توسط واحد سخت افزاری تایمر در مد PWM و یا استفاده از روش نرم افزاری زمانبندی I/O toggling ، پروتکل تک سیمه را ایجاد نمود . در این روش منابع بیشتری از حافظه RAM استفاده می شود .
درصد خطای قابل قبول در این پروتکل 800KHz (±150KHz) یا 1.25µs (±600ns) می باشد ، بنابراین برای اینکه زمانبندی ها در موقع برنامه نویسی دقیق محاسبه و ایجاد شود ، بهتر است از زبان اسمبلی برای ایجاد این پروتکل استفاده کنیم .
منبع تغذیه مناسب برای NEOPIXEL
هر LED در حداکثر روشنایی ، حدود 60 میلی آمپر جریان مصرف می کند ، بنابراین منابع تغذیه مورد استفاده برای راه اندازی WS2812B بسته به تعداد LED های موجود در نوار یا نوارهایی که استفاده می کنید متفاوت خواهد بود . مهم است که منبع تغذیه ای را انتخاب کنید که با نیازهای نوارها مطابقت داشته باشد تا بتوانید نوار خود را در روشنایی مناسب نگه دارید. از آنجا که هر LED تقریباً همان مقدار جریان 60mA را در حداکثر روشنایی مصرف می کند ، برای یک نوار واحد با 60 LED ، به منبع تغذیه 60 * 0.06 = 3.6A در حداکثر روشنایی نیاز دارد. اگر از پورت USB 2.0 استفاده می کنید که 0.9A را ارائه می دهد ، می توانید با خیال راحت نوارهایی با 0.9/0.06 = 15 LED را روشن کنید.
انواع درایورهای NEOPIXEL
به جز درایور ws2812b درایورهای دیگری نیز وجود دارند که نوارهای neopixel توسط آن ها ساخته می شوند . برخی از این درایورها عبارتند از WS2811 , WS2812 , WS2813 , SK6812 که توسط یک پروتکل راه اندازی می شوند اما در مواردی دیگر با یکدیگر اختلاف دارند .
اولین درایور WS2811 می باشد که به صورت یک آی سی و مجزا از LED در یک پکیج تولید شده و توالی ارسال رنگ به صورت RGB می باشد یعنی ابتدا رنگ قرمز بعد سبز و سپس آبی ارسال می شود .
درایور WS2812 نسخه بعدی درایور قبلی است و با LED RGB درون یک پکیج و به صورت 6 پایه می باشد . درایور WS2812B با LED RGB درون یک پکیج بصورت 4 پایه تولید شد . توالی ارسال رنگ در درایورهای WS2812 , WS2812B به صورت GRB می باشد .
درایور SK6812 در واقع یک LED WS2812B به علاوه یک LED سفید رنگ می باشد که درون یک بسته بندی است . توالی ارسال رنگ به صورت RGBW می باشد یعنی ابتدا رنگ قرمز بعد سبز و آبی و سپس سفید را ارسال می کند و در مجموع شامل 4 بایت دیتای رنگ می باشد .
تفاوت WS2812B با WS2813
جدیدترین مدل این سری نوارهای LED WS2813 است. WS2813 یک نسخه به روز شده از WS2812B است ، شبیه به اینکه WS2812B یک نسخه بهبود یافته از WS2812 است. مانند WS2812B ، دارای مدار کنترل و تراشه RGB با LED 5050 RGB درون یک پکیج است و هر LED را می توان به صورت جداگانه کنترل کرد.
مهمترین تفاوت بین دو نوار LED ویژگی دور زدن مسیر سیگنال دیتای LED آنها است. یکی از بزرگترین مزایایی که WS2813 نسبت به WS2812B دارد این است که روی سیم های دیتا ، دو سیگنال کار می کند و سیگنال را به صورت پیوسته منتقل می کند.
این بدان معناست که اگر یک LED در وسط زنجیر بسوزد ، مدار بسته می ماند و سایر LED ها هنوز روشن می مانند . تا زمانی که هیچ ال ای دی مجاور دیگری خراب نشده باشد ، ال ای دی های باقی مانده به کار عادی خود ادامه می دهند. اما هنگامی که یک LED در نوار WS2812B شکسته یا می سوزد ، مدار خراب می شود و سایر LED های بعد از زنجیر کار نمی کنند.
این تفاوت ساده WS2813 را به عنوان نوار LED قابل اطمینان تر نشان می دهد و آن را برای پروژه نورپردازی بعدی شما ارتقا می دهد .
مزیت دیگر WS2813 نسبت به WS2812B نرخ فرکانس تجدید بالاتر 2000 هرتز است . WS2813 بنابراین جلوه های نمایش بهتری و بدون لرزش را ایجاد می کند .
WS2813 دارای RESET یا زمان بازنشانی 250 میکرو ثانیه است و LED WS2813 را قادر می سازد تا در فرکانس های پایین و میکروکنترلرهای ارزان قیمت بهتر کار کند.
آیا می توان از کنترلر یکسان برای WS2812B و WS2813 استفاده کرد؟
بله ، می توان از همان کنترلر و برنامه WS2812B برای WS2813 استفاده کرد.
راه اندازی NEOPIXEL با ARDUINO
چندین کتابخانه برای راه اندازی NEOPIXEL وجود دارد ، در این آموزش ما به کتابخانه ای که Adafruit ارایه کرده است و از تمامی درایورهای WS2811 , WS2812 , WS2813 , SK6812 پشتیبانی میکند ، خواهیم پرداخت .
برای نصب کتابخانه NEOPIXEL مسیر Sketch> Incude Library> Manage Librarise را باز کنید ، در کادر جستجو کلمه “neopixel” را جستجو کنید و سپس در کادری که عبارت “Adafruit NeoPixel” وجود دارد روی دکمه نصب در گوشه سمت کلیک کنید ، یک لحظه منتظر نصب باشید و سپس Close را فشار دهید .
اکنون با یک برنامه نمونه آزمایش کنیم که نوار NeoPixel ما چگونه کار می کند . برای شروع به این مسیر می رویم File> Examples> Adafruit NeoPixel> strandtest و یکی از مثال های خود کتابخانه را باز می کنیم .
در مثال فوق یک تابع وجود دارد که دارای سه پارامتر می باشد ، پارامتر اول که با LED_COUNT معرفی شده است بیانگر تعداد پیکسلها در نوار NEOPIXEL می باشد . پارامتر دوم که با LED_PIN معرفی شده است بیانگر پایه ای از آردوینو که به NEOPIXEL متصل می شود . پارامتر سوم نوع درایوری است که در نوار NEOPIXEL استفاده شده است و در بخش “انواع درایور NEOPIXEL” معرفی شدند .
راه اندازی NEOPIXEL با BASCOM
کتابخانه ای که در اینجا شرح داده می شود برای پشتیبانی از برنامه نویسی BASCOM برای کنترل نوارهای RGB-Led بر اساس نوع WS2812 (b) می باشد با توجه به یکسان بودن پروتکل با درایورهای WS2811 , WS2813 احتمالا با این کتابخانه راه اندازی می شود ، اما هنوز توسط ما تست نشده است .
از نسخه 2.0.7.9 نرم افزار بسکام ، این کتابخانه به شکل RainbowBSC.LIB به نرم افزار BASCOM-AVR اضافه شده است. اما اگر از نسخه های قدیمی تر استفاده می کنید باید این کتابخانه را به نرم افزار بسکام اضافه نمایید .
این کتابخانه از حداکثر 8 نوار LED مستقل از یکدیگر پشتیبانی می کند .
قابلیت راه اندازی نوارهای LED با طول کوچکتر از 256 پیکسل .
قابلیت کار کردن WS2812b در فرکانسهای 8 , 9.6 , 14.7456 , 16 مگاهرتز
حداقل الزامات برای راه اندازی WS2812B توسط نرم افزار BASCOM
64Byte SRAM, 1kByte FlashROM, 8MHz
توسط دستور زیر پیکربندی تعداد کانال های neopixel و پورت و پین های را تنظیم می کند.
CONFIG RAINBOW=channels, [,RGB=rgb] , RBx_LEN=leds, RBx_PORT=port, RBx_PIN=pin sample: Config RAINBOW=1 ,RGB=grb, RB0_LEN=8, RB0_PORT=PORTB,rb0_pin=0
این پارامتر اختیاری است که هنگام استفاده باید دومین پارامتر تعریف شود. LED های WS2812 از نوع توالی GRB هستند(سبز ، قرمز ، آبی) و 24 بیت داده ارسال می شود.
LED های RGBW دارای LED سفید اضافی نیز هستند و دیتای رنگ بصورت توالی RGBW ( قرمز ، سبز ، آبی ، سفید) ارسال می شوند که در مجموع 32 بیت داده ارسال می شود.
گزینه های مختلف برای این پارامتر عبارتند از:
اگر این پارامتر استفاده نشود به صورت پیش فرض LED های WS2811/WS2812 با توالی GRB می باشد .
عبارت RGBW برای LED هایی با درایور SK6812RGBW استفاده می شود . توجه داشته باشید که برای هر led یک بایت حافظه داخلی دیگر برای رنگ سفید نیاز است . برای استفاده از این گزینه باید از کتابخانه RAINBOWBSCN.lib استفاده شود .
RBx_LEN :
برای هر کانال حداقل تعداد led ها 1 عدد است . هر LED از 3 رنگ R (ed) ، G (reen) و B (lue) ساخته شده است . کتابخانه یک آرایه به نام _RAINBOW0 با اندازه len * 3 ایجاد می کند . بنابراین برای NEOPIXEL با طول RB0_LEN = 8 عدد LED ، یک آرایه با طول RAINBOW0_ (24) ایجاد می کند.
برای LED های RGBW ، آرایه دارای طول len * 4 است تا رنگ سفید اضافی را ذخیره کند.
مطلب پیشنهادی >> کنترل نوار رنگی NEOPIXEL توسط ماژول وای فای ESP8266 و اندروید
فیلم زیر راه اندازی یک NEOPIXEL دایره ای با 8 پیکسل توسط بسکام و میکروکنترلر ATMEGA16 با فرکانس 8 مگاهرتز داخلی را نشان می دهد .