🟥 ماتریس 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
VCC5V
GNDGND
DIND12
CLKD11
CSD10

کد کامل

کتابخانه‌ی 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);
    }
  }
}

توضیح خط به خط

💡 در کدهای قدیمی‌تر شکل‌ها با 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 لازم داری.

اشکال‌های رایج

برای عدد درشت و ساعت، سون‌سگمنت TM1637 مناسب‌تر است و برای رنگ و رنگین‌کمان نئوپیکسل با آردوینو را ببین. ایده‌های بیشتر در پروژه‌های آماده و همه‌ی آموزش‌های آردوینو در صفحه‌ی آردوینو است.

ماتریس LED را در تینکرکد فارسی باز کن 🟥

سؤال‌های رایج

چرا ماتریس با وجود سیم‌کشی درست خاموش است؟

MAX7219 در حالت خواب روشن می‌شود. در setup باید lc.shutdown(0, false) را صدا بزنی تا بیدار شود.

می‌توانم چند ماتریس را پشت هم ببندم؟

بله. خروجی DOUT هر ماژول به DIN ماژول بعدی می‌رود و آخرین عدد سازنده‌ی LedControl را تعداد ماژول‌ها می‌گذاری؛ تا هشت ماژول با یک شیء.

ماتریس LED در شبیه‌ساز رایگان است؟

خواندن مثال‌ها و درس‌ها رایگان است؛ ماتریس LED جزو ماژول‌های حرفه‌ای است و اجرایش اشتراک Plus می‌خواهد.

مقاله‌های مرتبط

🖥️

راه‌اندازی نمایشگر OLED SSD1306 با آردوینو و کتابخانه‌ی Adafruit

🌈

رنگین‌کمان نئوپیکسل با آردوینو و کتابخانه‌ی Adafruit_NeoPixel

🦾

سروو موتور با آردوینو: جاروب ۰ تا ۱۸۰ درجه و کنترل با پتانسیومتر

🐞

دیباگ قدم‌به‌قدم کد آردوینو در شبیه‌ساز آنلاین: بریک‌پوینت و دیدن متغیرها

همه‌ی آموزش‌های سنسورها و ماژول‌ها ← · همه‌ی مقاله‌ها