🌈 رنگینکمان نئوپیکسل با آردوینو و کتابخانهی Adafruit_NeoPixel
نئوپیکسلها LEDهای رنگی هوشمندی هستند که میتوانی دهها تایشان را پشت سر هم ببندی و همه را فقط با یک پایهی آردوینو کنترل کنی. در این آموزش روی یک حلقهی ۱۲تایی نئوپیکسل یک رنگینکمان چرخان میسازیم؛ از آن افکتهایی که همه را جلوی پروژهات نگه میدارد. اگر قبلاً در wokwi یا ویدیوهای خارجی این افکت را دیدهای، این نسخهی فارسی و خطبهخطش است.
نئوپیکسل چطور کار میکند؟
داخل هر نئوپیکسل (اسم فنیاش WS2812) سه LED قرمز، سبز و آبی و یک چیپ کوچک هست. آردوینو یک رشتهی داده به اولین LED میفرستد؛ آن LED رنگ خودش را برمیدارد و بقیه را به بعدی میدهد، مثل نامهای که دستبهدست میشود. برای همین با یک سیم داده میشود صدها LED را جداگانه رنگ کرد.
قطعهها و اتصال
- آردوینو Uno
- حلقهی نئوپیکسل ۱۲تایی (یا نوار ۸تایی)
- در مدار واقعی: یک مقاومت ۳۳۰ اهم سر راه داده و یک خازن ۱۰۰۰ میکروفاراد روی تغذیه (پیشنهادی)
| پایهی نئوپیکسل | آردوینو |
|---|---|
| DIN (ورودی داده) | پایهی دیجیتال 6 |
| 5V / VCC | 5V |
| GND | GND |
کد کامل
#include <Adafruit_NeoPixel.h>
#define LED_PIN 6
#define NUM_LEDS 12
Adafruit_NeoPixel ring(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
ring.begin();
ring.setBrightness(60); // از 255؛ کم نگه دار تا چشمت و منبع تغذیه راحت باشند
ring.show(); // همه خاموش
}
void loop() {
for (long firstHue = 0; firstHue < 65536; firstHue += 256) {
for (int i = 0; i < ring.numPixels(); i++) {
long hue = firstHue + (i * 65536L / ring.numPixels());
ring.setPixelColor(i, ring.gamma32(ring.ColorHSV(hue)));
}
ring.show();
delay(15);
}
}
توضیح خطهای مهم
Adafruit_NeoPixel ring(12, 6, NEO_GRB + NEO_KHZ800): یک حلقه با ۱۲ LED روی پایهی ۶.NEO_GRBترتیب رنگها در این چیپ است (سبز، قرمز، آبی) وNEO_KHZ800سرعت ارسال داده.setBrightness(60): نور کلی را محدود میکند. هر LED با نور کامل سفید تا ۶۰ میلیآمپر میکشد؛ ۱۲ تا با هم یعنی بیش از ۷۰۰ میلیآمپر!- رنگ به روش HSV: به جای قرمز-سبز-آبی، رنگ را با یک عدد «فام» (Hue) میگوییم. در این کتابخانه فام از ۰ تا ۶۵۵۳۵ است و دور کامل چرخهی رنگها را میزند: قرمز، زرد، سبز، آبی، بنفش و دوباره قرمز. برای رنگینکمان از این راحتتر نمیشود.
i * 65536L / ring.numPixels(): به هر LED یک تکهی مساوی از چرخهی رنگ میدهد، پس کل رنگینکمان دور حلقه پخش میشود. حرفLعدد راlongمیکند تا ضرب در آردوینو Uno (کهintش ۱۶ بیتی است) سرریز نکند.firstHue += 256: هر دور حلقهی بیرونی، کل رنگینکمان کمی میچرخد. عدد بزرگتر یعنی چرخش سریعتر.gamma32: چشم ما نور را خطی نمیبیند؛ این تابع رنگها را طبیعیتر میکند.ring.show(): تا این خط اجرا نشود، رنگها فقط در حافظهاند و روی LEDها نمیروند.
ring.setPixelColor(0, ring.Color(255, 0, 0)); ring.show();. شمارهی LEDها از ۰ شروع میشود.اجرا در شبیهساز
در تینکرکد فارسی مثال آمادهی رنگینکمان نئوپیکسل و نسخهی سادهترش نئوپیکسل هست. درسهای رنگهای نئوپیکسل و رنگینکمان قدمبهقدم همین را یاد میدهند. حلقه و نوار نئوپیکسل جزو ماژولهای حرفهای اشتراک پلاس هستند؛ مثالها برای خواندن رایگان باز میشوند و برای اجرا پلاس لازم است.
اشکالهای رایج
- هیچ LEDی روشن نمیشود: به ورودی DIN وصل کردهای یا به خروجی DOUT؟ داده فقط از سمت DIN وارد میشود.
ring.begin()وring.show()را هم چک کن. - رنگها جابهجا هستند (قرمز به جای سبز): ترتیب رنگ نوار تو فرق دارد؛
NEO_GRBرا بهNEO_RGBتغییر بده. - فقط چند LED اول روشناند: عدد
NUM_LEDSرا درست وارد نکردهای. - آردوینو ریست میشود یا رنگها میپرند: جریان زیاد است. نور را کم کن یا برای نوارهای بلند منبع ۵ ولت جدا بگذار و GNDها را به هم وصل کن.
- رنگینکمان خیلی کند است:
delayرا کم کن یا گامfirstHueرا بزرگتر کن.
نئوپیکسل را با میکروپایتون هم امتحان کن: OLED و نئوپیکسل روی پیکو. پروژههای بیشتر آردوینو در صفحهی شبیهساز آردوینو منتظرت هستند.
رنگینکمان نئوپیکسل را باز کن 🌈