Вы абсолютно правы в своих сомнениях. Использование двух микросхем MAX7219 для вашей задачи — это избыточно, дорого и потребует лишнего места на плате. MAX7219 создан для непрерывного свечения всей матрицы, а у вас
в любой момент времени горят только 4 светодиода (углы одной клетки).
У Arduino UNO (ATmega328P) есть 18 свободных цифровых/аналоговых пинов (D2–D13 и A0–A5). Для матрицы 9×9 вам нужно ровно
9 строк + 9 столбцов = 18 пинов. Это идеальное совпадение!
Главная проблема, которую нужно решить — это
яркость. При динамической индикации (мультиплексировании) 9 строк каждый светодиод горит только 1/9 времени (скважность 9). Чтобы светодиод светился нормально (в среднем 5 мА), через него нужно пропускать импульсный ток около
45 мА. Выводы Arduino не могут безопасно выдавать более 20 мА на пин.
Ниже приведены 3 оптимальных способа решения этой задачи, от самого простого до самого профессионального.
---
### Вариант 1. «Золотая середина»: ULN2803 + PNP-транзисторы (Рекомендуется)
Это самый надежный способ, который позволяет использовать обычные светодиоды и давать им достаточный ток для яркого свечения даже при дневном свете.
Суть: Мы используем Arduino только для управления ключами, а ток берут напрямую от линии 5V.
- Столбцы (Катоды, 9 шт.): Используем 2 микросхемы ULN2803A (в DIP корпусе). Это сборка дарлингтонских транзисторов, каждая микросхема имеет 7 каналов (итого 14, нам хватит 9). Они отлично работают как «сток» (sink) и выдерживают до 500 мА на канал.
- Строки (Аноды, 9 шт.): Используем 9 обычных PNP-транзисторов (например, BC327, 2N3906 или КТ3107).
* Эмиттеры подключены к 5V.
* Коллекторы — к строкам матрицы.
* Базы — к пинам Arduino через резисторы 1 кОм.
*
Важно: Так как в каждый момент времени сканируется только
одна строка, только один пин Arduino будет открыт (сигнал LOW), и только один транзистор будет потреблять базовый ток (~4 мА). Это абсолютно безопасно для микроконтроллера.
Токоограничивающие резисторы: Ставятся на каждый из 9 столбцов (между ULN2803 и катодами светодиодов). Рассчитываются исходя из нужного импульсного тока (например, 40 мА). Для красного светодиода это будет примерно 68–82 Ом.
---
### Вариант 2. Прямое подключение (Только для сверхъярких светодиодов)
Если вы используете современные сверхъяркие светодиоды (яркостью от 1000 mcd и выше), им для комфортной видимости достаточно среднего тока всего
1–2 мА.
При скважности 9 это дает импульсный ток
9–18 мА, что
вписывается в лимиты выводов Arduino (максимум 20 мА на пин).
Суть:
- 9 пинов Arduino идут напрямую к строкам.
- 9 пинов идут к столбцам через токоограничивающие резисторы.
- Плюсы: Не нужно паять транзисторы и микросхемы, схема максимально простая.
- Минусы: Если в комнату попадет яркий солнечный свет, индикация может казаться тускловатой. Придется очень внимательно следить, чтобы сумма токов на один PORT микроконтроллера (например, PORTD) не превышала 100 мА.
---
### Вариант 3. Сдвиговые регистры (Если не хватает пинов)
Если вам нужны пины Arduino UNO для других задач (экран, кнопки, датчики), вы можете управлять матрицей 9×9 всего через
3 пина (SPI: SCK, MOSI, CS/LATCH).
Суть:
- Строки: Сдвиговой регистр 74HC595 (или два) управляет базами тех же 9 PNP-транзисторов.
- Столбцы: Либо те же ULN2803, управляемые еще одним сдвиговым регистром, либо специализированные светодиодные драйверы, например, TLC59281 (16-канальный драйвер с контролем тока, их нужно 3 штуки на 48 каналов, они сами стабилизируют ток и не требуют резисторов).
- Плюсы: Экономия 15 пинов Arduino.
- Минусы: Чуть более сложный код и больше деталей на плате.
---
### Как это будет работать в коде (Логика)
Поскольку у вас горит только одна клетка, код будет элементарным. Вам не нужны сложные библиотеки.
Допустим, выбрана клетка с координатами
cellX и
cellY (от 0 до 7).
Ее углы — это пересечения
(cellX, cellY),
(cellX+1, cellY),
(cellX, cellY+1),
(cellX+1, cellY+1).
В цикле мультиплексирования (опрос строк от 0 до 8) логика будет такой:
for (int row = 0; row < 9; row++) {
// 1. Гасим всё
turnOffAllRows();
turnOffAllCols();
// 2. Проверяем, относится ли текущая строка к углам выбранной клетки
if (row == cellY || row == cellY + 1) {
// 3. Включаем нужные столбцы
turnOnCol(cellX);
turnOnCol(cellX + 1);
// 4. Включаем текущую строку
turnOnRow(row);
}
// 5. Задержка для мультиплексирования (около 2-3 мс на строку)
delayMicroseconds(2000);
}
### Резюме
Откажитесь от идеи с MAX7219.
1. Если хотите
максимальной яркости и надежности — собирайте
Вариант 1 (2 микросхемы ULN2803 + 9 транзисторов BC327 + 9 резисторов). Это выйдет дешевле и проще в разводке, чем два MAX7219.
2. Если хотите
минимум деталей — берите
Вариант 2, но обязательно купите сверхъяркие (Ultra Bright / High Efficiency) светодиоды.