🟥 ماتریس LED ۸×۸ با MAX7219 و آردوینو: شکلک، انیمیشن و تاس الکترونیکی
شصتوچهار LED در یک مربع کوچک، که با آن میشود شکلک کشید، متن متحرک ساخت، بازی مار نوشت یا یک تاس الکترونیکی درست کرد. ماتریس LED 8x8 با MAX7219 یکی از جذابترین ماژولهای آردوینو است و با فقط سه سیم داده کار میکند. در این آموزش طرز کارش را ساده میگوییم، با کتابخانهی LedControl رویش شکل میکشیم و در آخر یک تاس الکترونیکی با دکمه میسازیم. همه را هم مثل کاری که در ووکوی انجام میدهی، در شبیهساز امتحان میکنیم.
ماتریس و MAX7219 چطور کار میکنند؟
LEDهای ماتریس در ۸ سطر و ۸ ستون چیده شدهاند. پایهی مثبت همهی LEDهای یک سطر به هم وصل است و پایهی منفی همهی LEDهای یک ستون هم. پس با ۱۶ سیم میشود هر LED را انتخاب کرد، ولی نه همه را با هم. ترفند این است که سطرها را یکییکی و خیلی سریع روشن کنیم؛ چشم ما تصویر کامل را میبیند. به این کار مالتیپلکس یا اسکن میگویند.
انجام این اسکن با آردوینو هم وقت میگیرد و هم ۱۶ پایه. تراشهی MAX7219 این زحمت را برمیدارد: یک حافظهی ۶۴ بیتی دارد (یک بیت برای هر LED) و خودش بیوقفه اسکن میکند. آردوینو فقط داده را بیت به بیت از سه سیم DIN، CLK و CS برایش میفرستد؛ شبیه کاری که یک شیفترجیستر انجام میدهد. روشنایی هم با نرمافزار ۱۶ پله دارد و جریان LEDها را یک مقاومت روی ماژول محدود میکند، پس برای LEDها مقاومت جدا لازم نیست.
پایههای ماژول
| پایه | کار |
|---|---|
| VCC | ۵ ولت |
| GND | زمین |
| DIN | ورود داده |
| CS (یا LOAD) | انتخاب تراشه؛ پایان هر پیام را اعلام میکند |
| CLK | ساعت؛ آهنگ فرستادن بیتها |
طرف دیگر ماژول همین پایهها با DOUT بهجای DIN تکرار شدهاند تا بتوانی ماژول بعدی را پشتش ببندی و یک نمایشگر بلند برای متن متحرک بسازی.
قطعهها و سیمکشی
- یک آردوینو Uno
- یک ماتریس LED ۸×۸ با MAX7219
- برای تاس: یک دکمه
| پایهی ماژول | آردوینو Uno |
|---|---|
| VCC | 5V |
| GND | GND |
| DIN | D12 |
| CLK | D11 |
| CS | D10 |
کد کامل
کتابخانهی LedControl (از Eberhard Fahle) را از Library Manager نصب کن. این برنامه یک قلب و یک شکلک میکشد و بعد یک نقطهی نورانی را از همهی خانهها رد میکند.
// MAX7219 8x8 LED matrix: a heart, a smiley and a running pixel.
#include <LedControl.h>
// LedControl(DIN, CLK, CS, number of modules)
LedControl lc = LedControl(12, 11, 10, 1);
byte heart[8] = {
0b00000000,
0b01100110,
0b11111111,
0b11111111,
0b01111110,
0b00111100,
0b00011000,
0b00000000
};
byte smile[8] = {
0b00111100,
0b01000010,
0b10100101,
0b10000001,
0b10100101,
0b10011001,
0b01000010,
0b00111100
};
void drawPicture(byte pic[]) {
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, pic[row]); // one byte = one row, one bit = one LED
}
}
void setup() {
lc.shutdown(0, false); // wake the MAX7219 up (it starts asleep)
lc.setIntensity(0, 5); // brightness 0..15
lc.clearDisplay(0);
}
void loop() {
drawPicture(heart);
delay(1000);
drawPicture(smile);
delay(1000);
lc.clearDisplay(0); // one LED walks across every row
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 8; col++) {
lc.setLed(0, row, col, true);
delay(30);
lc.setLed(0, row, col, false);
}
}
}
توضیح خط به خط
LedControl(12, 11, 10, 1)ترتیب این است: DIN، CLK، CS و تعداد ماژولها. LedControl پایهها را با نرمافزار میراند، پس هر پایهی دیجیتالی را میتوانی انتخاب کنی.- عدد اول همهی دستورها (
0) شمارهی ماژول در زنجیره است؛ نزدیکترین ماژول به آردوینو صفر است. shutdown(0, false)مهمترین خط! تراشه در حالت صرفهجویی روشن میشود و تا بیدارش نکنی هیچ چیزی نشان نمیدهد.setIntensity(0, 5)روشنایی از ۰ تا ۱۵. روشنایی کمتر هم چشم را اذیت نمیکند و هم جریان کمتری میکشد.- هر
byteیک سطر است:0b01100110یعنی LEDهای ستونهای ۱، ۲، ۵ و ۶ روشن. شکل را میتوانی روی کاغذ شطرنجی بکشی و خانههای پر را ۱ بنویسی. setRowیک سطر کامل را یکجا مینویسد وsetLed(ماژول، سطر، ستون، روشن؟)فقط یک LED را. برای انیمیشن نقطهای دومی و برای تصویر اولی بهتر است.
B01100110 نوشته شدهاند. این نماد فقط در آردوینو و فقط تا ۸ بیت کار میکند؛ 0b نماد استاندارد ++C است و همهجا جواب میدهد.پروژهی کوچک: تاس الکترونیکی
با هر بار زدن دکمهی D2 (بین D2 و GND)، تاس چند بار سریع عوض میشود، کند میشود و روی یک عدد تصادفی بین ۱ تا ۶ میایستد. هر خال یک مربع ۲×۲ است.
// Electronic dice on the 8x8 matrix: press the button on D2 to roll.
#include <LedControl.h>
LedControl lc = LedControl(12, 11, 10, 1);
const int BUTTON = 2;
bool wasPressed = false;
void dot(int r, int c) { // a 2x2 dot, top-left corner at (r, c)
lc.setLed(0, r, c, true);
lc.setLed(0, r, c + 1, true);
lc.setLed(0, r + 1, c, true);
lc.setLed(0, r + 1, c + 1, true);
}
void showFace(int n) {
lc.clearDisplay(0);
if (n % 2 == 1) dot(3, 3); // 1, 3, 5: centre dot
if (n >= 2) { dot(0, 0); dot(6, 6); } // one diagonal
if (n >= 4) { dot(0, 6); dot(6, 0); } // the other diagonal
if (n == 6) { dot(3, 0); dot(3, 6); } // middle row
}
void setup() {
pinMode(BUTTON, INPUT_PULLUP);
randomSeed(analogRead(A0)); // an unconnected pin gives a random start
lc.shutdown(0, false);
lc.setIntensity(0, 6);
showFace(1);
}
void loop() {
bool pressed = digitalRead(BUTTON) == LOW;
if (pressed && !wasPressed) {
for (int i = 0; i < 10; i++) { // rolling animation that slows down
showFace(random(1, 7));
delay(60 + i * 15);
}
}
wasPressed = pressed;
delay(20);
}
تابع showFace با چهار شرط هر شش وجه را میسازد: عددهای فرد خال وسط دارند، از ۲ به بالا یک قطر، از ۴ به بالا قطر دوم، و ۶ دو خال وسط کناری. random(1, 7) عددی از ۱ تا ۶ میدهد (عدد دوم خودش جزو جواب نیست). اگر نسخهی سادهتر با LEDهای تکی را میخواهی، تاس الکترونیکی با LED را ببین.
اجرا در شبیهساز
در تینکرکد فارسی دو مثال آماده هست: ماتریس ۸×۸: لبخند و فلش و متن متحرک روی ماتریس. درسهای ماتریس LED ۸×۸، متن متحرک و برای چالش آخر بازی مار روی ماتریس قدمبهقدم جلو میروند. باز کردن و خواندن رایگان است؛ ماتریس LED جزو ماژولهای حرفهای است و برای اجرایش اشتراک Plus لازم داری.
اشکالهای رایج
- هیچ LEDی روشن نمیشود:
shutdown(0, false)را جا انداختهای، یا DIN را به DOUT (طرف خروجی ماژول) بستهای. - شکل چرخیده یا آینهای است: مدلهای مختلف ماژول (مثلاً FC-16 و مدل معمولی) جهت متفاوتی دارند. بهجای
setRowازsetColumnاستفاده کن یا ترتیب بیتها را برعکس کن. - تصویر درهم و تصادفی است: ترتیب پایهها در سازنده با سیمکشی یکی نیست؛ ترتیب DIN، CLK، CS است.
- با چند ماژول و روشنایی زیاد، آردوینو ریست میشود: هر ماژول با همهی LEDها روشن جریان زیادی میکشد. روشنایی را کم کن یا منبع ۵ ولت جدا بگذار.
- کتابخانهی دیگری مثل MD_Parola خواندهای و پایهها فرق دارد: آن کتابخانهها از SPI سختافزاری (D11 و D13) استفاده میکنند؛ LedControl هر سه پایهی دلخواه را قبول میکند.
برای عدد درشت و ساعت، سونسگمنت TM1637 مناسبتر است و برای رنگ و رنگینکمان نئوپیکسل با آردوینو را ببین. ایدههای بیشتر در پروژههای آماده و همهی آموزشهای آردوینو در صفحهی آردوینو است.
ماتریس LED را در تینکرکد فارسی باز کن 🟥سؤالهای رایج
چرا ماتریس با وجود سیمکشی درست خاموش است؟
MAX7219 در حالت خواب روشن میشود. در setup باید lc.shutdown(0, false) را صدا بزنی تا بیدار شود.
میتوانم چند ماتریس را پشت هم ببندم؟
بله. خروجی DOUT هر ماژول به DIN ماژول بعدی میرود و آخرین عدد سازندهی LedControl را تعداد ماژولها میگذاری؛ تا هشت ماژول با یک شیء.
ماتریس LED در شبیهساز رایگان است؟
خواندن مثالها و درسها رایگان است؛ ماتریس LED جزو ماژولهای حرفهای است و اجرایش اشتراک Plus میخواهد.