Подключение светодиодного матричного дисплея MAX7219 к Arduino
Если вы какое-то время работали с Arduino, скорее всего, вы сталкивались с матричными дисплеями. Они повсюду — от биржевых тикеров и цифровых часов до огромных наружных рекламных щитов. За многими из этих дисплеев стоит маленький, но мощный чип: MAX7219.
MAX7219 — это популярный и надёжный способ управления светодиодными матричными дисплеями с лёгкостью. Он может управлять до 64 отдельными светодиодами (сетка 8×8), используя всего три вывода данных на Arduino. Более того, он поддерживает последовательное соединение (daisy-chaining), что означает возможность подключения нескольких дисплеев в ряд для создания гораздо более крупных визуальных проектов — идеально для вывесок, счётчиков или бегущих строк.
Хотите ли вы отображать простые сообщения, сделать мини-табло или создать бегущую строку — модуль MAX7219 делает этот процесс простым и увлекательным. В этом руководстве мы рассмотрим, как работают эти дисплеи, как подключить их к Arduino и как написать код для управления.
Давайте погружаться и зажигать огни!
Обзор модуля MAX7219
Существует несколько типов модулей MAX7219, но два наиболее распространённых — это модуль общего типа (generic) и модуль FC-16.
Модуль общего типа (Generic):
Модуль FC-16:
Эти модули обычно включают светодиодный матричный дисплей 8×8 и плату расширения MAX7219. Давайте разберём, что делает каждая часть и как они работают вместе.
Матричный дисплей
Матричный дисплей 8×8 содержит 64 маленьких светодиода, расположенных в сетке из 8 строк и 8 столбцов. Вы можете подумать, что для управления всеми этими светодиодами потребуется 64 отдельных провода (по одному на каждый светодиод) плюс дополнительные провода для питания — но это было бы слишком сложно!
Вместо этого дисплей использует технику, называемую мультиплексирование. Этот хитроумный метод соединяет строки и столбцы в матричный паттерн, сокращая количество управляющих выводов до 16 — 8 для строк и 8 для столбцов.
При мультиплексировании дисплей подсвечивает только одну строку за раз. Пока эта строка активна, соответствующие столбцы также активируются для включения нужных светодиодов в этой строке. Это означает, что в любой момент горит не более восьми светодиодов.
Дисплей быстро переключается между строками — сотни или тысячи раз в секунду! Благодаря инерции зрения человеческого глаза это быстрое переключение создаёт впечатление, что все светодиоды горят одновременно.
Плата расширения MAX7219
Мультиплексирование — это отлично, но им сложно управлять, потому что вашему микроконтроллеру пришлось бы постоянно обновлять дисплей, чтобы изображение оставалось стабильным.
Именно здесь чип MAX7219 становится очень полезным! Он берёт на себя обновление дисплея автоматически, так что вам не нужно об этом беспокоиться.
Всё, что вам нужно — отправлять простые команды через SPI, используя всего три провода данных (плюс один для земли). Получив данные, чип самостоятельно обновляет дисплей — до 800 раз в секунду — и поддерживает стабильную яркость светодиодов. Это освобождает ваш микроконтроллер для других важных задач.
Чип MAX7219 включает несколько отличных функций:
Режим энергосбережения: Вы можете выключить дисплей, когда он не нужен, для экономии энергии.
Безопасность при запуске: Чип держит все светодиоды выключенными в течение первых нескольких секунд при включении, предотвращая случайное мерцание или странные паттерны при запуске.
Последовательное соединение (daisy-chaining): Если вам нужен более крупный дисплей, вы можете соединить несколько модулей MAX7219, используя те же 3 провода данных SPI. Это позволяет легко создавать бегущие строки или строить более крупные визуальные проекты!
Настройка яркости и тока на модуле MAX7219
Чип MAX7219 позволяет регулировать яркость дисплея двумя способами: аппаратно или программно. Давайте рассмотрим оба метода.
Аппаратное управление яркостью
На плате расширения MAX7219 находится резистор RSet. Этот резистор управляет величиной тока, протекающего через каждый светодиод, что напрямую влияет на общую яркость дисплея.
Для разных светодиодных дисплеев нужны разные номиналы резисторов, в зависимости от типа используемых светодиодов. Например, для красной LED-матрицы со светодиодами, которым нужны 2V и 20 мА тока, следует использовать резистор 28 кОм.
В таблице ниже показано, какие значения резисторов использовать, исходя из напряжения и тока, необходимых светодиодам вашего матричного дисплея.
Программное управление яркостью
Яркость также можно изменять непосредственно в коде. Мы покажем, как именно это сделать, позже в руководстве, когда начнём программировать дисплей.
Распиновка модуля MAX7219
Независимо от типа модуля MAX7219 (generic или FC-16), он будет иметь два набора выводов:
Входной разъём
Эти выводы используются для подключения модуля к микроконтроллеру (например, Arduino):
VCC — это вывод питания. Подключите его к источнику питания 5V. Поскольку дисплей может потреблять довольно много энергии (до 1A при максимальной яркости), лучше использовать отдельный источник питания. Если вы хотите использовать вывод 5V Arduino, держите яркость низкой (ниже 25%), чтобы не перегреть стабилизатор напряжения.
GND — это вывод заземления. Его необходимо подключить к общей земле.
DIN — это вывод входных данных. Его можно подключить к любому цифровому выводу Arduino.
CS — вывод выбора кристалла. Он также подключается к цифровому выводу Arduino.
CLK — вывод тактирования. Подключается к ещё одному цифровому выводу.
Выходной разъём
Второй набор выводов используется при последовательном соединении нескольких дисплеев (daisy-chaining):
VCC подключается к выводу VCC следующего модуля.
GND подключается к выводу GND следующего модуля.
DOUT — это вывод выходных данных, подключается к выводу DIN следующего модуля.
LOAD подключается к выводу CS следующего модуля.
CLK подключается к выводу CLK следующего модуля.
Схема подключения модуля MAX7219 к Arduino
Теперь, когда мы узнали, как работает модуль MAX7219, пора подключить его к Arduino и запустить!
Начнём с подключения питания. Как упоминалось ранее, дисплей может потреблять довольно много энергии (до 1A при максимальной яркости), поэтому мы будем использовать отдельный источник питания вместо 5V вывода платы Arduino.
Если вы используете только один модуль generic-типа MAX7219 и держите яркость низкой, можно питать его напрямую от Arduino — но в целом безопаснее так не делать.
Далее подключим выводы для связи по SPI. Поскольку модуль MAX7219 требует быстрой передачи данных, он лучше всего работает при подключении к аппаратным выводам SPI на Arduino. Для плат Arduino UNO или Nano V3.0 это выводы: digital 13 (SCK), 12 (MISO), 11 (MOSI) и 10 (CS).
Если вы используете другую плату Arduino, проверьте `официальную документацию Arduino `_, чтобы найти правильные аппаратные выводы SPI для вашей конкретной модели.
Вот краткая справочная таблица подключений:
| MAX7219 Module | Arduino | |
| GND | GND | |
| DIN | 11 | |
| CS/LOAD | 3 | |
| CLK | 13 |
Вот как подключить модуль Generic MAX7219:
Вот как подключить модуль FC-16 MAX7219:
Последовательное соединение нескольких дисплеев
Если вы хотите создать более крупный дисплей из нескольких модулей MAX7219, их можно легко соединить последовательно. Просто подключите вывод DOUT первого модуля к выводу DIN следующего. Затем соедините VCC, GND, CLK и CS между всеми дисплеями.
Установка библиотеки
Написание всего кода для управления дисплеем MAX7219 с нуля было бы сложным и трудоёмким. К счастью, существует полезная библиотека `MD_Parola `_, которая значительно упрощает задачу.
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджера библиотек на левой боковой панели.
Введите «parola» в строке поиска для фильтрации результатов.
Найдите библиотеку MD_Parola от MajicDesigns.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Поскольку библиотека MD_Parola зависит от других библиотек для корректной работы, вам будет предложено установить зависимости, включая библиотеку MD_MAX72XX.
Когда появится это сообщение, просто нажмите INSTALL ALL, чтобы всё было настроено правильно.
Пример 1 для Arduino — Отображение текста на модуле MAX7219
В первом примере мы будем отображать простой текст на светодиодном дисплее MAX7219 — без анимации или специальных эффектов. Это поможет нам познакомиться с работой дисплея и способами управления им с помощью Arduino.
Перед загрузкой кода необходимо изменить две важные переменные в скетче, чтобы он знал, какое аппаратное обеспечение дисплея вы используете.
Первая переменная — HARDWARE_TYPE. Она сообщает Arduino, какой тип модуля MAX7219 вы используете.
Установите
HARDWARE_TYPEвGENERIC_HW, если ваш модуль имеет зелёную печатную плату.Установите
HARDWARE_TYPEвFC16_HW, если ваш модуль имеет синюю печатную плату.
Вторая переменная — MAX_DEVICES. Она сообщает Arduino, сколько чипов MAX7219 в вашем дисплее. Каждый чип MAX7219 управляет одной светодиодной матрицей 8×8. Например, если вы используете дисплей 8×32 (четыре матрицы 8×8 в ряд), установите MAX_DEVICES в 4.
После обновления этих двух переменных загрузите скетч на Arduino.
// Including the required Arduino libraries
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Uncomment according to your hardware type
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
// Defining size, and output pins
#define MAX_DEVICES 4
#define CS_PIN 3
// Create a new instance of the MD_Parola class with hardware SPI connection
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void setup() {
// Initialize the object
myDisplay.begin();
// Set the intensity (brightness) of the display (0-15)
myDisplay.setIntensity(0);
// Clear the display
myDisplay.displayClear();
}
void loop() {
myDisplay.setTextAlignment(PA_LEFT);
myDisplay.print("Left");
delay(2000);
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.print("Center");
delay(2000);
myDisplay.setTextAlignment(PA_RIGHT);
myDisplay.print("Right");
delay(2000);
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.setInvert(true);
myDisplay.print("Invert");
delay(2000);
myDisplay.setInvert(false);
myDisplay.print(1234);
delay(2000);
}
Вывод
Чтобы текст отображался правильно, дисплей должен быть правильно расположен:
Если вы используете модуль generic, убедитесь, что чип MAX7219 находится сверху при взгляде на дисплей.
Если вы используете модуль FC-16, сторона с надписью DIN должна быть справа.
Если всё подключено и ориентировано правильно, вы должны увидеть слова «Left», «Center», «Right», «Invert» и число «1234», отображающиеся одно за другим с небольшой паузой между ними.
Объяснение кода
Скетч начинается с подключения всех необходимых библиотек. Библиотеки MD_Parola и MD_MAX72xx помогают управлять дисплеем и обрабатывать текстовые эффекты, а библиотека SPI обеспечивает связь между Arduino и чипом MAX7219.
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
Далее мы указываем программе тип используемого модуля, устанавливая HARDWARE_TYPE. Поскольку в этом примере мы используем модуль FC-16, устанавливаем его в FC16_HW. Затем устанавливаем MAX_DEVICES в 4, потому что модуль FC-16 имеет четыре светодиодные матрицы 8×8 в ряд. Наконец, определяем CS_PIN — вывод Arduino, подключённый к выводу CS (Chip Select) модуля MAX7219. В этом примере мы используем цифровой вывод 3.
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CS_PIN 3
После этого мы создаём новый объект класса MD_Parola. Этот объект поможет нам управлять дисплеем. При создании мы передаём тип оборудования, вывод CS и количество устройств.
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
В функции setup() мы подготавливаем всё к работе. Сначала инициализируем дисплей с помощью функции begin(). Затем устанавливаем яркость светодиодов с помощью setIntensity(brightness). Значение brightness может варьироваться от 0 (очень тускло) до 15 (очень ярко). В данном случае установлено 0 для экономии энергии. Наконец, очищаем дисплей с помощью displayClear(), чтобы начать с чистого экрана.
void setup() {
myDisplay.begin();
myDisplay.setIntensity(0);
myDisplay.displayClear();
}
В функции loop() мы показываем различные сообщения.
Сначала выравниваем текст по левому краю с помощью setTextAlignment(PA_LEFT) и отображаем слово «Left» с помощью print("Left"). Затем ждём 2 секунды.
myDisplay.setTextAlignment(PA_LEFT);
myDisplay.print("Left");
delay(2000);
Далее меняем выравнивание на центр и показываем слово «Center». После ещё одной паузы переключаем выравнивание вправо и показываем слово «Right».
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.print("Center");
delay(2000);
myDisplay.setTextAlignment(PA_RIGHT);
myDisplay.print("Right");
delay(2000);
После этого переключаем выравнивание обратно на центр и включаем эффект инверсии с помощью setInvert(true). Затем показываем слово «Invert».
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.setInvert(true);
myDisplay.print("Invert");
delay(2000);
Наконец, выключаем эффект инверсии с помощью setInvert(false) и отображаем число 1234. Поскольку это число, а не слово, мы не используем кавычки.
myDisplay.setInvert(false);
myDisplay.print(1234);
delay(2000);
Пример 2 для Arduino — Бегущий текст на дисплее MAX7219
Иногда нужно показать более длинное сообщение на LED-матрице, но дисплей недостаточно широк, чтобы вместить его целиком. Именно здесь пригодится эффект бегущего текста. В этом примере мы покажем, как прокручивать сообщение по экрану, чтобы можно было увидеть весь текст.
Загрузите скетч на Arduino. Вы должны увидеть слово «Hello», плавно прокручивающееся по LED-матрице справа налево.
// Including the required Arduino libraries
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Uncomment according to your hardware type
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
// Defining size, and output pins
#define MAX_DEVICES 4
#define CS_PIN 3
// Create a new instance of the MD_Parola class with hardware SPI connection
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void setup() {
// Initialize the object
myDisplay.begin();
// Set the intensity (brightness) of the display (0-15)
myDisplay.setIntensity(0);
// Clear the display
myDisplay.displayClear();
myDisplay.displayScroll("Hello", PA_CENTER, PA_SCROLL_LEFT, 100);
}
void loop() {
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
}
После загрузки скетча на Arduino вы должны увидеть:
Объяснение кода
Вы заметите, что почти всё в этом скетче — от начала кода до конца функции setup() — точно такое же, как в предыдущем примере. Главное отличие в том, что в конце функции setup() мы добавляем функцию displayScroll(). Эта функция указывает дисплею прокручивать сообщение по экрану. В нашем примере прокручиваемое сообщение — слово «Hello».
myDisplay.displayScroll("Hello", PA_CENTER, PA_SCROLL_LEFT, 100);
Эта функция принимает четыре аргумента: displayScroll(pText, align, textEffect, speed)
pText— сообщение, которое вы хотите прокручивать.align— устанавливает выравнивание текста. Вы можете использовать те же параметры выравнивания, что и в предыдущем примере:PA_CENTER,PA_LEFTилиPA_RIGHT.textEffect— определяет тип эффекта прокрутки. УстановкаPA_SCROLL_LEFTпрокручивает текст справа налево.speed— управляет скоростью прокрутки в миллисекундах. Меньшие значения ускоряют прокрутку.
В функции loop() мы используем две основные функции для поддержания прокрутки текста.
Сначала вызывается displayAnimate() для выполнения самой прокрутки. Эта функция автоматически перемещает текст и возвращает true по завершении анимации. Затем мы используем displayReset() для сброса анимации прокрутки к началу, чтобы она могла начаться заново.
void loop() {
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
}
Поскольку эти две функции находятся внутри функции loop(), сообщение «Hello» будет прокручиваться по дисплею снова и снова, создавая непрерывный эффект бегущей строки.
Если вы хотите попробовать другие интересные эффекты (прокрутка вверх, вниз или затухание), ознакомьтесь со `справочником библиотеки MD_Parola `_ на GitHub.