Подключение MAX7219 к Arduino
Драйвер светодиодной матрицы 8×8
MAX7219 к Arduino Uno и Nano по SPI: DIN на D11 (MOSI), CLK на D13 (SCK), CS на D10, питание 5 В. Уровни совпадают, выводы соединяются напрямую.
Схема подключения MAX7219 к Arduino
| MAX7219 | Arduino Uno |
|---|---|
| CLK | D13 |
| CS | D10 |
| DIN | D11 |
| VCC | 5V |
| GND | GND |
Схема из примера «Arduino Uno: «Жизнь» Конвея на матрице 8×8».
Выводы MAX7219
| Вывод | Назначение |
|---|---|
| CLK | тактовый сигнал |
| CS | защёлка (LOAD): по фронту данные попадают в регистры |
| DIN | вход данных |
| VCC | питание 5 В |
| GND | общий провод |
Код для Arduino
// «Жизнь» Конвея на матрице 8×8.
//
// Клетка выживает, если у неё два или три живых соседа, и рождается на
// пустом месте, если соседей ровно три. Больше правил нет — а из них
// получаются мигалки, планеры и целые машины. Здесь поле замкнуто в
// тор: улетевший вправо планер прилетает слева. Если поле вымерло или
// застыло, засеваем новое.
#include <SPI.h>
const int CS = 10;
byte field[8], next[8];
unsigned long generation = 0;
void maxWrite(byte reg, byte v) {
digitalWrite(CS, LOW); SPI.transfer(reg); SPI.transfer(v); digitalWrite(CS, HIGH);
}
bool alive(int x, int y) { return field[(y + 8) % 8] & (0x80 >> ((x + 8) % 8)); }
void seed() {
// Планер и мигалка: чтобы сразу было на что посмотреть.
memset(field, 0, 8);
field[0] = 0b01000000;
field[1] = 0b00100000;
field[2] = 0b11100000;
field[5] = 0b00001110;
generation = 0;
Serial.println(F("новое поле: планер и мигалка"));
}
void step() {
for (int y = 0; y < 8; y++) {
next[y] = 0;
for (int x = 0; x < 8; x++) {
int n = 0;
for (int dy = -1; dy <= 1; dy++)
for (int dx = -1; dx <= 1; dx++)
if ((dx || dy) && alive(x + dx, y + dy)) n++;
if (n == 3 || (n == 2 && alive(x, y))) next[y] |= 0x80 >> x;
}
}
bool same = !memcmp(field, next, 8);
memcpy(field, next, 8);
generation++;
int count = 0;
for (int y = 0; y < 8; y++) for (byte b = field[y]; b; b &= b - 1) count++;
Serial.print(F("поколение "));
Serial.print(generation);
Serial.print(F(", живых "));
Serial.println(count);
if (!count || same || generation > 200) seed();
}
void setup() {
Serial.begin(9600);
pinMode(CS, OUTPUT);
SPI.begin();
maxWrite(0x0F, 0); maxWrite(0x0C, 1); maxWrite(0x0B, 7); maxWrite(0x09, 0); maxWrite(0x0A, 4);
seed();
}
void loop() {
for (int y = 0; y < 8; y++) maxWrite(y + 1, field[y]);
delay(300);
step();
}
Скетч можно править и запускать в симуляторе без платы и установки среды.
Что учесть на Arduino
- Для аппаратного SPI выводы D11 и D13 фиксированы; CS можно взять любой.
- Модули соединяют цепочкой: DOUT первого идёт на DIN следующего, питание подводят к каждому.
Частые ошибки при подключении к Arduino
- Занять D11 или D13 под другое и пытаться использовать аппаратный SPI: эти выводы зарезервированы.
- Питать несколько матриц от вывода 5V Arduino при питании от USB: ток ограничен, плата перезагружается.
- Несколько матриц на полной яркости от USB компьютера — ток до ампера, плата перезагружается. Уменьшайте яркость (
setIntensity) или берите отдельный блок питания. - Картинка повёрнута или отражена — у разных модулей разная ориентация. В MD_MAX72XX тип модуля задаётся параметром (FC16_HW, GENERIC_HW…).
shutdown(0, false)не вызван — после включения MAX7219 в режиме сна, и ничего не горит.- Каскад в обратную сторону: данные идут от DIN к DOUT, первый модуль — ближний к контроллеру.
Ещё по теме
Другие детали для Arduino
HC-SR04DHT22 (AM2302)BME280DS3231SSD1306 OLED 0,96″LCD 1602 с I2CTM1637Модуль релеKY-040Клавиатура 4×4HX711ФоторезисторМодуль microSDRGB-светодиодСервопривод SG9074HC595Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодПолзунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11HTU21D