در ادامه آموزش های اصفهان درایو قصد داریم با هم راه اندازی WS2812 LED رو آموزش ببینیم. بدون اتلاف وقت سریعا سراغ روش راه اندازی میریم. WS2812 یک چیپ کنترل هوشمند نور LED هست. همونطور که میدونید هر رنگی از این LEDها، از ترکیب سه رنگ سبز، آبی و قرمز ساخته میشه. با تنظیم مقداری از 0 تا 255 برای هر رنگ شما میتونید طیف رنگی وسیعی رو از این LED ها دریافت کنید. خب پس ما نیاز داریم عددی از 0 تا 255 برای تنظیم سه رنگ به صورت جداگونه برای این درایور ارسال کنیم!
با جستجوی دیتاشیت این درایور اطلاعاتی که نیاز داریم استخراج بشه در تصویرهای زیر قابل مشاهده است:
مطابق تصویر، برای ارسال صفر 0 به سمت درایور، پالس ارسالی بهش باید برای مدت زمان 0.4 میکروثانیه سطح یک داشته باشه و برای زمان 0.85 میکروثانیه سطح صفر داشته باشه. با جمع این مقادیر، میشه نتیجه گرفت که پالس برای یک سوم از کل دوره تناوب باید سطح یک داشته باشه.
به طور مشابه برای ارسال یک به سمت درایور، پالس ارسالی برای دو سوم از طول دوره تناوب باید سطح یک داشته باشه.
در نهایت هم باید یک پالس ریست به طول بیشتر از 50 میکروثانیه برای درایور ارسال بشه که متوجه بشه 24 بیت ارسالی متشکل از 8 بیت برای قرمز، 8 بیت برای سبز و 8 بیت برای آبی تموم شده ومنتظر دریافت یک سری دیتای دیگه باشه!
بعد از این هم نحوه چیدمان بیت ها رو در تصویر زیر میتونیم مشاهده بکنیم:
مشخصه که هر داده از 24 بیت تشکیل شده، G R B
ما باید 8 بیت مربوط به سبز رو اول بفرستیم(MSB First)
دیتا برای تموم LED ها باید همراه با هم ارسال بشه، مثلا اگر شما 12 LED دارین، باید 12*24 بیت برای درایور ارسال بشه
درایور 24 بیت اول رو به LED اول اختصاص میده، 24 بیت دوم رو به LED دوم و به همین ترتیب.
بعد از ارسال داده برای تمام LEDها ما باید خط سیگنال رو LOW نگه داریم( برای زمانی بیشتر از 50 میکروثانیه)
با در نظر گرفتن طول موج پالس برای ارسال 0 و 1 منطقی، اگر ما یک شکل موج PWM داشته باشیم که دارای فرکانس 800 کیلوهرتز باشه، با تنظیم صحیح دیوتی سایکل این شکل موج قادر خواهیم بود صفر و یک رو به صورت صحیحی برای درایور ارسال کنیم. برای این منظور ما قصد داریم یک تایمر PWM با فرکانس 800کیلوهرتز ایجاد کنیم و از خاصیت DMA میکروکنترلر STM32 برای تنظیم دیوتی سایکل بهره بگیریم. حالا چرا DMA؟
اگر ما بخوایم از دستورات کتابخونه HAL برای تنظیم دیوتی سایکل استفاده کنیم، با توجه به اینکه خود این دستورات نیاز به زمانی برای اجرا دارن، زمان بندی شکل موج ارسالی برای درایور دقیق نخواهد بود و در نتیجه 0 و 1 ارسالی به درستی تنظیم نمیشه! خب حالا که ما همه چیز رو میدونیم، به سراغ تنظیمات میکروکنترلر در نرم افزار STM32CUBEMX میریم:
در این آموزش از میکروکنترلر STM32F103VET استفاده میکنیم
تنظیم کلاک میکروکنترلر روی 72 مگاهرتز
تنظیم کانال 1 تایمر به عنوان خروجی PWM
تنظیم پارامترهای تایمر به منظور تولید PWM با فرکانس 800KHZ
انجام تنظیمات DMA برای تایمر
دقت کنید که برای DMA حالت NORMAL و جهت انتقال داده هم memory to peripheral انتخاب شده!
برای تنظیم دیوتی سایکل به روی 30 درصد، کافی هست از مقدار 27 استفاده کنیم و برای داشتن دیوتی سایکل 70 درصد هم از مقدار 63!
در نهایت با درنظر گرفتن تمامی نکاتی که بالا خدمت شما عرض شده، سورس کد نهایی ما به شکل زیر نوشته میشه:
برای تنظیم رنگ و تعداد LEDها
برای تنظیم روشنایی
تعریف متغیرها
تابع ارسال
تنظیم رنگ هر LED و تست برنامه
در این آموزش به سادگی تونستیم WS2812 رو با استفاده از ویژگی DMA برای تایمر و خروجی PWM اون راه اندازی کنیم. در کد بالا این قابلیت وجود داره که روشنایی LED ها و رنگ مدنظر با ترکیبی از سه رنگ سبز، قرمز و آبی ساخته بشه و افکت های متفاوتی رو هم ایجاد کرد!
امیدواریم از این آموزش استفاده برده باشید!
دانلود پروژه
با سایر آموزش های اصفهان درایو همراه باشید!