سخت افزار قطعات الکترونیک میکروکنترلر AVR

راه اندازی LED RGB با چیپ WS2812 توسط میکروکنترلر AVR اتمگا

نوشته شده توسط علی زاهدی

دیگر زمان آن که برای نور پردازی اتاق و یا میزکار خود از چراغ های مطالعه معمولی استفاده کنید، به پایان رسیده است. شاید تا به حال در ویدیو های مختلف و یا در اتاق دوستان خود نور پردازی های با رنگ های مختلف مانند رنگ بنفش دیده باشید که زیبایی فضا را بسیار بیشتر کرده است. ممکن است پیش خود بگویید این کار بسیار هزینه بر و سخت است. اما بر خلاف تصور، شما میتوانید با استفاده از LED های Ws2812 به راحتی نور پردازی اتاق، میز کار و یا حتی کیس کامپیوتر خود را انجام دهید. در این آموزش قصد داریم تا به راه اندازی این نوع LED با کمک میکروکنترلر AVR بپردازیم. در ادامه با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


LED RGB Ws2812


Ws2812 یک LED کنترل هوشمند است که مدار کنترل و تراشه RGB داخل یک پکیج ۵۰۵۰ به صورت یک پارچه قرار گرفته است. کنترل کننده داخلی این LED شامل  پورت داده دیجیتال هوشمند Latch و مدار درایو تقویت کننده  تغییر شکل سیگنال است. پروتکل انتقال داده از حالت ارتباطی تک NZR استفاده می کند. این LED با ولتاژ ۵ ولت کار میکند. و عملکرد آن به صورت سری است. هر LED دارای ۱ پایه ورودی و یک پایه خروجی است. پایه خروجی LED اول به ورودی LED دوم متصل می‌شود. و این حلقه میتواند ادامه پیدا کند.  در ماژول های Neopixel نیز ار این نوع LED استفاده می‌شود.

 

از جمله ویژگی های این نوع LED میتوان به موارد زیر اشاره نمود:

  • حفاظت از اتصال معکوس هوشمند ، اتصال معکوس منبع تغذیه به IC آسیب نمی رساند.
  • مدار کنترل و LED در یک پکیج ۵۰۵۰ به صورت یکپارچه قرار گرفته و از یک منبع تغذیه می‌شوند.
  • سیگنال انتقال پورت آبشاری توسط تک خط.
  • رنگ نور بسیار ثابت و مقرون به صرفه بود.
  • ارسال اطلاعات با سرعت ۸۰۰ کیلوبیت بر ثانیه.
  • و …

 


پروتکل ارتباطی Ws2812


بیایید برای درک بهتر نحوه عملکرد این LED فراید کار آن را بررسی کنیم. هر LED قرمز، سبز و آبی به صورت جداگانه در یک واحد Ws2812 طوری تنظیم شده است که در ۲۵۶ سطح روشنایی میدرخشد. توسط یک دنباله باینری ۸ بیتی که از ۰ تا ۲۵۵ نشان داده می‌شود. هر سه LED کنار هم نیاز به سه مجموعه ۸بیتی (۲۴ بیت) روشنایی دارد. در ادامه یک راهنمای سریع برای راه اندازی این LED نوشته شده است.

  • دنباله ۲۴ بیتی که گفته شد توسط میکروکنترلر به Ws2812 اول ارسال می‌شود.
  • هنگامی که چندین LED وجود دارد ، دنباله داده ای که LED دوم را کنترل می کند بلافاصله پس از اولین با داده های سبز ، قرمز و آبی شروع می شود. دنباله در آن الگو ادامه می یابد تا زمانی که همه LED های موجود را روشن کند.
  • اولین LED اطلاعات کل زنجیره LED ها را دریافت می کند ، سپس همان داده ها را بدون دنباله ای که برای خود اعمال کرده است ، ارسال می کند و LED دوم را به اولین جزء لیست (تا آنجا که می داند) تبدیل می کند.
  • این واحد LED “شماره یک جدید” به انتقال اطلاعات ادامه می دهد تا زمانی که دیگر توالی LED باینری باقی نماند.

 

به تصویر بالا توجه کنید. این تصویر شامل کانال CH1 که خروجی میکروکنترلر متصل به ۲ عدد Ws2812 است. و کانال CH2 که تنها ۲۴ بیت از ۴۸ بیتی که روی کانال CH1 است را شمال می شود. به عبارت دیگر میتوان گفت که کانال CH1 به پایه Din یا همان ورودی Ws2812 اول و کانال CH2 به پایه Din ورودی Ws2812 دوم (این پایه به Dout خروجی Ws2812 اول متصل است) وصل شده است.

در تصویر بالا پالس های پهن نشانگر ۱ و پالس های کوتاه نشانگر ۰ هستند. حالا اگر با دقت بیشتری به موج CH1 توجه کنید. متوجه که این موج تشکیل شده از ۲ عدد پالس ۲۴ بیتی کاملا مشابه که هر کدام برای یک واحد Ws2812 است. در صورتی که این موج روی کانال را به باینری ترجمه کنیم رشته “۰b100101100000000000000000” این رشته به معنای “۰b10010101” یا در مبنای دسیمال ۱۵۰ است. که رنگ سبز را با روشنایی متوسطی روشن میکند. و ۱۶ بیت باقی مانده که برای رنگ های آبی و قرمز است، کاملا خاموش خواهد بود.

 


اتصالات پروژه


انواع مختلفی از این نوع LED در بازار موجود است. از ماژول های خطی و دایره ای شکل تا چیپ های LED به صورت SMD که می‌توانید با شکل مورد نظر خود بر روی PCB مونتاژ کنید. اما همانطور که گفته شد در ماژول های مختلف اتصالات این نوع به LED به این صورت است که پایه VCC به خط مثبت ۵ ولت و پایه GND به خط منفی متصل می شود (بین پایه های تغذیه هر LED یک عدد خازن قرار ۱۰۰ نانو فاراد قرار می‌گیرد) پایه Din مربوط به Ws2812 اول یه یکی از پایه های میکروکنترلر متصل می شود. سپس پایه Dout هر Ws2812 به پایه Din ال ای دی  Ws2812 بعدی متصل می‌شود. برای درک بهتر این مطلب به تصویر زیر توجه کنید.

 


کتابخانه Ws2812


برای راه اندازی این نوع LED می‌توانید با استفاده از روشی که بالا تر توضیح داده شد به صورتی مقدار دهی LED ها را به دست بگیرید. اما این کار بسیار زمانبر خواهد بود و احتمال خطا در آن بسیار زیاد است. در این قسمت قصد داریم کتابخانه ای را به شما معرفی کنیم تا عملیات راه اندازی و کنترل هر تعداد LED که مورد نظرتان است را به راحتی بدست بگیرید. کتابخانه cpldcpu ، کتابخانه بسیار کاملی است که کنترل LED های Ws2812 به راحتی روی میکروکنترلرهای Arduino، AVR و ARM در اختیار شما میگذارد. با کلیک بر روی نام کتابخانه میتوانید وارد صفحه Github کتابخانه شده و آن را دانلود کنید.

 


کدنویسی پروژه


در این آموزش از کامپایلر اتمل استودیو استفاده میکنم. برای استفاده از این کتابخانه ابتدا بایستی فایل هدر آن را به کد خود اضافه کنید.

#include "light_ws2812.h"

 

سپس بایستی ارایه ای با استراکچر cRGB ساخته و در قسمت تعداد عناطر آرایه را تعداد LED هایی که مورد استفاده قرار داده اید، مشخص میکند. برای درک بهتر به مثال زیر توجه کنید.

struct cRGB led[5];

 

پایه ای که به Din ال ای دی Ws2812 اول متصل است را بایستی داخل فایل ws2812_config.h تعین کنید. برای مثال در مثال زیر پایه Din به پورت B پایه شماره ۲ وصل است.

#define ws2812_port B     // Data port 
#define ws2812_pin  2     // Data out pin

تا به اینجا تظیمات مورد نیاز برای استفاده از این کتابخانه و راه اندازی Ws2812 را انجام داده اید. حالا برای کنترل نور LED ها مطابق کد زیر ۳ پارامتر در اختیار ما قرار میگیرد. پارامتر R برای رنگ قرمز، G رنگ سبز، B رنگ آبی است. هر یک از این پارامتر ها بین ۰ تا ۲۵۵ قابل تنظیم است که این عدد میزان روشنایی هر رنگ است. با تنظیم عدد هر یک از پارامتر ها میتوانید رنگ های مختلف را ایجاد کنید. در کد زیر رنگ سبز با زوشنایی متوسطی روشن شده و رنگ های آبی و قرمز خاموش هستند.

led[0].r=0;
led[0].g=150;
led[0].b=0;   

 

پس از تنظیم رنگ ها بایستی تابع آپدیت رنگ تنظیم شده بر روی LED مورد نظر را فراخوانی کنید. این تابع دارای ۲ ورودی است که در ورودی اول بایستی آرایه تعریف شده برای LED هارا نوشته و سپس در ورودی دوم شماره LED مورد نظر که قصد دارید رنگ مورد نظر بر روی آن LED روشن شود را بنویسید.

ws2812_setleds(led,1);

 

در ادامه برنامه ای با استفاه از این توابع نوشته شده است. پس از کامپایل برنامه با استفاده از پروگرامر این برنامه را روی میکروکنترلر پروگرام کنید.

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "light_ws2812.h"

struct cRGB led[1];

int main(void)
{
  #ifdef __AVR_ATtiny10__
  CCP=0xD8;		// configuration change protection, write signature
  CLKPSR=0;		// set cpu clock prescaler =1 (8Mhz) (attiny 4/5/9/10)
  #endif

  while(1)
  {
    led[0].r=255;led[0].g=00;led[0].b=0;    // Write red to array
    ws2812_setleds(led,1);
    _delay_ms(500);                         // wait for 500ms.

    led[0].r=0;led[0].g=255;led[0].b=0;			// green
    ws2812_setleds(led,1);
    _delay_ms(500);

    led[0].r=0;led[0].g=00;led[0].b=255;		// blue
    ws2812_setleds(led,1);
    _delay_ms(500);
  }
}

 


لوازم مورد نیاز


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

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید. بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

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

درباره نویسنده

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۸ دیدگاه

  • سلام مهندس این پروژه جواب نداد با مگا هشت زدم فقط اینکه اون کد
    #ifdef __AVR_ATtiny10__
    بجای تاینی ۱۰ مگاهشت نوشتم

    • با سلام
      لطفا پایه ای که LED هارا به آن متصل کرده اید را اعلام کنید. بخشی که فرمودین تنها یک شرط است که برای میکرو ATtiny 10 تعریف شده است. نیازی به تغیر آن نیست. میتوانید آن بخش را کاملا پاک کنید.

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

  • سلام و درود در این برنامه اگر بخوام برای مثال ۶۰عدد پیکسل تعریف کنم به این صورت که از پیکسل ۱ تا ۱۰رنگ دیفالتش سبز باشه و از۱۱ تا۲۰ آبی باشه و از ۲۱ تا ۶۰ قرمز باشه(تفکیک رنگ) چجوری باید برنامه رو ایجاد کنیم؟؟

    • با سلام
      بایستی ابتدا تعداد LED هارا در استراکچر ابتدای برنامه همانند دستور زیر تعریف کنید.
      struct cRGB led[60];
      سپس داخل کد با حلقه for میتوانید تعیین کنید که کدام LED ها به چه رنگی باشد. برای مثال برای رنگ سبز led های ۱ تا ۱۰ به صورت زیر عمل کنید.
      for(int i=0;i<10;i++)
      {
      led[i].r=0; led[i].g=255; led[i].b=0;
      ws2812_setleds(led,i+1);
      }

  • سلام و خسته نباشید.
    من همه کارها را انجام دادم و به میکروی attiny2313 وصل کردم ولی هیچ چراغی روشن نمی‌شود. با نمونه کدهای دیگر هم تست کردم (که همگی شبیه به همین کد بودند) ولی هیچ کدام جواب ندادند. مورد دیگری به ذهن شما می‌رسد که چک کنم؟

    • با سلام
      در صورتی که تمامی مراحل به درستی نجام شود. مطابق آموزش LED ها روشن خواهد شد. اتصالات و همچنین تنظیمات مربوط به انتخاب پایه متصل به ورودی LED اول را مورد بررسی مجدد قرار دهید.

  • با سلام
    ممنون از مطلب خوبتون
    من تمام نکاتی که گفته بودید را انجام دادم ولی نمیتونم با میکرو ATmega16A ال ای دی را راه اندازی کنم
    امکانش هست راهنمایی کنید؟

    • با سلام
      لطفا اتصالات و مواردی که همچون فرکانس کاری میکروکنترلر را بررسی کنید. در صورتی که موراد گفته شده صحیح باشد انتخاب میکروکنترلر تفاوتی ندارد.

  • سلام با مگا ۳۲ وکریستال۸ فقط تونستم باتابع setledsتعیین کنم چنتا ledروشن بشن همهledها سفید روشن میشن وفرقی اصلا نداره بهrgbهاش چه مقداری بدم توی یه مدار دیگه ی مگا۳۲ که روی۱mhداخلی تنظیم شده فقط تونستمledاول روروشن کنم کلا خیلی عجیب وقریبه چند روزه دارم روش کار میکنم میشه یه پروژشو روی مگا۳۲ به صورت کامل اپلود کنید ببینم مشکلم کجاست
    ممنون

  • روی۱mhهم به جای تغییر رنگ رنگها روی هم اضافه میشدن واخر سر سفید نشون میداد وهمون سفید میموند اول بدون ترتیب یعنی اول سبز روشن میشه بعد قرمز اضافه میشه که مجموعش میشه زرد وبعد ابی که مجموع سفید شد من با کد ویژن کار کردم دفعه ی اولمه که اتمل استادیو کار میکنم اتمل استادیو تنظیم خاصی لازم داره؟

    • با سلام
      برای استفاده از این کتابخانه بایستی از کریستال خارجی ۱۶ مگاهرتز استفاده کنید.

  • سلام وقت بخیر
    ممنون از آموزش
    یه سوال داشتم
    ارزانترین ای سی که برای ساخت کنترلر led 2812 میشه استفاده کرد چی هست
    ۱۰ تا تم توش جا بشه هم بسته
    ممنون

    • با سلام
      این نوع LED تقریبا با تمامی میکروکنترلر های بازار قابل راه اندازی هست. اما میکروکنترلر های STM32F0 از شرکت ST و خانواده ATtiny از شرکت Atmel ایسی های در دسترس و ارزان قیمتی هستند.

  • سلام مهندس ممنون از سایت خوب شما مهندس من با اردوینو یو نو خیلی راحت کتابخانه های ۲۸۱۲ رو راه اندازی می کردم الان چند روز است از هر مدل کد ۲۸۱۲ که استفاده می کنم این پیغام بهم میده خواهش کمکم کنید Arduino: 1.8.19 (Windows 8), Board: “Arduino Uno”

    RGB_Clock:47:10: fatal error: WS2812.h: No such file or directory

    #include

    ^~~~~~~~~~

    compilation terminated.

    exit status 1

    WS2812.h: No such file or directory

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

  • سلام، ممنون از اطلاعات خوبی که توی سایتتون درج کردید، مخصوصا برای همین led های RGB برنامه پذیر که جای دیگه مشابهش نیست.
    من قبلا با کدویژن کار میکردم اما الان چون این کتابخونه برای اتمل هستش و من اتمل بلد نبودم و بخاطر همین تاپیک شروع کردم، کد شمارو عیناً کپی کردم و فقط نوع میکرو و فرکانسش رو مشخص کردم، برنامه ارور میده. امکانش هست راهنماییم کنید؟
    ارورها:
    ۱- ld returned 1 exit status
    ۲- recipe for target ‘atmel test.elf’ failed
    ۳- undefined reference to `ws2812_setleds’