Светодиодная матрица 8x8 MAX7219: подключение к Arduino
Матрица 8x8 на MAX7219 — 64 красных пикселя, которые занимают у Arduino всего три пина данных. Именно на ней новички обычно встречают первый «снег»: скетч из интернета скомпилировался, а вместо сердца на матрице мерцают случайные точки. Причина почти всегда в проводке или в регистрах чипа, которые после подачи питания держат мусор, пока их явно не обнулишь.
Разберу подключение по проводам, ток и каскад, дам скетч змейки на LedControl — и покажу, что из этого можно проверить в симуляторе: карточка «Светодиодная матрица 8x8 (MAX7219)» из палитры «Макетка» рисует узор мышкой, а вот LedControl-движка в рантайме нет, и это будет сказано честно.
Распиновка: пять проводов и ни одного резистора на пиксель
| Вывод модуля | Arduino Uno | Роль |
|---|---|---|
| VCC | 5 В | питание чипа и пикселей |
| GND | GND | земля, при каскаде — общая для всех модулей |
| DIN | D11 (MOSI) | поток битов: строки уходят сюда |
| CS | D10 (SS) | выбор чипа: пока CS поднят, чип слушает |
| CLK | D13 (SCK) | такт, по фронту которого чип снимает бит |
Пины D10-D13 — это аппаратная SPI-шина Uno: MAX7219 питается от неё без дополнительных библиотек шины, LedControl лишь дёргает ноги программно, поэтому пины в конструкторе можно менять. Ток всех пикселей задаёт один резистор между ISET и землёй: на модулях он уже стоит, и ставить вместо него перемычку нельзя — чип сгорит. При стандартном резисторе пиксель ест порядка 20-30 мА в пике, но развёртка светит одну строку за раз, так что средний ток модуля — десятки миллиампер; для всех 64 точек на максимальной яркости держите запас питания и не забудьте конденсатор 0,1 мкФ по питанию у модуля.
Что делает LedControl: три вызова и ни одной библиотеки шины
LedControl(din, clk, cs, число_модулей) объявляет матрицу, дальше рабочий минимум такой: shutdown(0, false) выводит чип из спячки, setIntensity(0, 4) ставит яркость от 0 до 15, clearDisplay(0) гасит мусор из регистров после подачи питания, а setLed(адрес, строка, столбец, true) зажигает пиксель. Есть и байтовые setRow и setColumn — строка целиком одним числом: 0b00111100 это четыре пикселя в середине. Забытые shutdown и clearDisplay — источник того самого «снега»: регистры MAX7219 после включения содержат случайное, и чип честно его показывает, пока вы не записали своё.
Скетч: змейка из огоньков
Классика для проверки матрицы — бегущая змейка: голова ползёт по строкам туда-обратно, хвост из четырёх пикселей гасится следом. Скетч собран на LedControl и предназначен для живой платы.
#include <LedControl.h>LedControl lc = LedControl(12, 11, 10, 1); // DIN, CLK, CS, 1 матрица int glava = 0; // позиция головы 0..63int napravo = 1; // 1 — вперёд, -1 — назад void setup() { lc.shutdown(0, false); // вывести чип из спячки lc.setIntensity(0, 4); // яркость 0..15, для комнаты хватает 4 lc.clearDisplay(0); // стереть мусор регистров} void loop() { lc.setLed(0, glava / 8, glava % 8, true); // голова: строка и столбец int hvost = glava - 4 * napravo; // хвост на 4 пикселя позади if (hvost >= 0 && hvost < 64) lc.setLed(0, hvost / 8, hvost % 8, false); if (glava == 63 && napravo == 1) napravo = -1; // разворот на краях if (glava == 0 && napravo == -1) napravo = 1; glava += napravo; delay(120);}Честно про симулятор: этот скетч в браузере не оживёт — объявление LedControl рантайм проглотит, а первый же вызов метода даст в Serial ошибку «Неизвестное имя lc», библиотека не поддержана. Зато узор змейки в браузере строится руками: карточка матрицы из палитры «Макетка» — это 64 пикселя, кликающихся мышкой, с кнопками «Очистить», «Залить» и заготовкой «Сердечко» и счётчиком горящих точек. Продумать кадры змейки или фигур тетриса до сборки железа — ровно то, для чего карточка и сделана. Проверку байтов шрифта через Serial-печать разбирает лендинг про симулятор матрицы, там же граница модели и железа.
Каскад 4-в-1 и грабли больших панелей
Четвёртый аргумент LedControl — число модулей в цепочке: DOUT первого модуля уходит в DIN второго, CLK и CS общие. Один CS на всю цепочку — и адрес в первом аргументе setLed выбирает модуль: 0, 1, 2, 3. На бегущих строках из четырёх модулей Uno справляется спокойно, узким местом становится питание: четыре матрицы на полной яркости просят запас ампер, и земля по цепочке должна быть толстой, иначе дальние модули темнят. Альтернативная связка — тот же принцип на сдвиговом регистре 74HC595 из урока про SPI и 595: MAX7219 — это, по сути, регистр с развёрткой и резистором тока внутри.
- «Снег» из случайных пикселей после включения: нет shutdown(0, false) и clearDisplay(0) в setup.
- Темнит один модуль из каскада: плохой контакт GND в цепочке — земля общая и толстая.
- Пиксели бегут не туда: перепутаны DIN и CLK, либо адрес модуля в вызове не тот.
- Яркость пляшет: дешёвые панели греть — setIntensity ниже 8 и конденсатор у каждого модуля.