Когда вы хотите добавить дисплей в какой либо свой электронный проект, то у вас всегда есть широкий выбор по поводу того какой дисплей выбрать: OLED, ЖК 16x2, семисегментный или даже E-Paper/электронные чернила. Но есть еще один недорогой вид дисплея, который почему то значительно реже освещается в сети интернет – это светодиодный матричный дисплей (Dot Matrix Display). И в данной статье мы рассмотрим подключение светодиодного матричного дисплея MAX7219 к плате Arduino.
Ранее на нашем сайте мы рассматривали следующие проекты с использованием светодиодных матричных дисплеев:
- светодиодная панель на Arduino и матричных дисплеях P10;
- визуализатор музыки на Arduino и матричном дисплее 32x8.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- MAX7219 32x8 Dot Matrix Display Module (модуль светодиодного матричного дисплея) (купить на AliExpress).
Обзор модуля светодиодного матричного дисплея 8x8 MAX7219
Существует все версии модуля светодиодного матричного дисплея 8x8 MAX7219 (MAX7219 8x8 LED Matrix Display module) – универсальный модуль (generic) и FC-16. Обе эти версии будут рассмотрены в нашей статье.
Светодиодный матричный дисплей
Модуль светодиодного матричного дисплея MAX7219 состоит из 64 светодиодов, объединенных в форме матрицы 8х8, благодаря чему им удобно управлять с помощью техники мультиплексирования. Обычный монохромный матричный дисплей 8×8 имеет 16 контактов, 8 для строк и 8 для столбцов. Его внешний вид показан на следующем рисунке.
Чип драйвера светодиодного дисплея MAX7219
Чип MAX7219 – это микросхема драйвера светодиодных дисплеев с общим катодом, которая позволяет подключать к микропроцессорам различные типы светодиодных дисплеев, начиная от семисегментных цифровых и до 8-символьных, в том числе и графические дисплеи из 64 индивидуальных светодиодов. Микросхема MAX7219 совместима с интерфейсами SPI, QSPI и MICROWIRE и имеет набор драйверов для уменьшения электромагнитных излучений.
Наиболее частой проблемой при использовании технологии мультиплексирования является то, что при ее применении микроконтроллер будет постоянно занят обновлением состояния дисплея и у него не будет свободных ресурсов для выполнения других задач. Но при использовании драйвера MAX7219 вам не стоит беспокоиться об этой проблеме поскольку большинство этих задач данный драйвер возьмет на себя. Вам необходимо будет всего лишь передавать необходимые последовательные данные по интерфейсу SPI.
MAX7219 может полностью контролировать 64 индивидуальных светодиода и одновременно он может обновлять состояние дисплея с частотой до 800 Гц. Также он позволяет управлять и яркостью свечения светодиодов дисплея – и это он может делать не прекращая выполнение других задач.
Установка яркости дисплея с помощью драйвера MAX7219
Чип драйвера дисплея MAX7219 позволяет управлять яркостью дисплея программным или аппаратным способом. Аппаратно это можно сделать с помощью резистора для настройки яркости, который находится внизу платы модуля.
Данный резистор отвечает за верхний предел тока и, таким образом, он ограничивает общую яркость светодиодов дисплея. В следующей таблице представлены номиналы этого резистора, которые вам необходимо использовать в соответствии с напряжением и прямым током для вашей светодиодной матрицы, то есть, к примеру, если у вас светодиоды на 2.5V 10 mA, то значение сопротивления данного резистора должно быть равно 59,3 кОм.
Далее в статье мы рассмотрим и программное управление яркостью свечения светодиодов дисплея.
Распиновка модуля светодиодного матричного дисплея MAX7219
Распиновка модуля светодиодного матричного дисплея MAX7219 показана на рисунке ниже. Он имеет 5 существенных контактов: VCC, GND, DIN, CS и SCK. Все контакты модуля дисплея цифровые, за исключением VCC и Ground. Модуль может работать только от напряжения 5V. Если вы используете его в режиме максимальной яркости, то вы можете подать до 1A тока для питания светодиодов дисплея.
Назначение контактов:
VCC подключается к источнику питания с напряжением 5V. Но имейте ввиду, что модуль дисплея потребляет 1A тока, поэтому рекомендуется использовать внешний источник питания 5V.
GND – общий провод (земля) модуля дисплея, его можно подключить к любому контакту микроконтроллера.
DIN – контакт ввода данных, его можно подключить к любому цифровому контакту микроконтроллера.
CS/LOAD – контакт выбора чипа (chip select pin) модуля дисплея, можно подключить к любому цифровому контакту платы Arduino.
CLK – контакт синхронизации модуля дисплея, можно подключить к любому цифровому контакту платы Arduino.
Как работает светодиодный матричный дисплей 8x8
Принцип работы светодиодного матричного дисплея основан на использовании технологии мультиплексирования. При данной технологии каждый столбец дисплея запитывается на определенный период времени и переключение между столбцами происходит так быстро (несколько тысяч раз в секунду) что человеческий глаз воспринимает дисплей непрерывно горящим. Наглядно этот процесс показан на следующей gif картинке.
Компоненты светодиодного матричного дисплея MAX7219
Компоненты светодиодного матричного дисплея MAX7219 показаны на следующем рисунке. Как вы можете видеть, их не очень много.
Кроме самой микросхемы MAX7219 на печатной плате модуля присутствуют два коннектора типа "папа" (male headers) – один для ввода данных, а другой для вывода. Также модуль содержит фильтрующий и развязывающий конденсаторы. И, конечно же, на плате модуля вы можете увидеть токоограничивающий резистор, с помощью которого можно регулировать яркость свечения светодиодов дисплея.
Наиболее часто задаваемые вопросы про модуль светодиодного матричного дисплея MAX7219
Какое назначение у контакта 18 модуля MAX7219?
Данный контакт предназначен для установки выходного тока модуля при помощи подключения к данному контакту резистора. Второй конец резистора подключен к питанию.
Как можно управлять матричным дисплеем MAX7219 с помощью WIFI модуля ESP8266?
Очень просто. Поскольку микросхема MAX7219 имеет возможность обмена данными по протоколам SPI и QSPI, то ее можно непосредственно подключить к SPI контактам модуля ESP8266 или платы Arduino.
Схема модуля светодиодного матричного дисплея MAX7219
Как вы можете видеть, в ней нет ничего сложного. Линия управления сегментами и цифрами подключена к микросхеме MAX7219. Фильтрующий и развязывающий конденсаторы подключены к линии питания поскольку они осуществляют фильтрацию выбросов напряжения на этой линии. Токоограничивающий резистор необходимо выставить пользователю для регулировки яркости свечения светодиодов дисплея.
Схема проекта
Схема подключения светодиодного матричного дисплея MAX7219 к плате Arduino представлена на следующем рисунке.
Если у вас модуль дисплея FC-16, то вам необходимо просто подключить 4 провода к Arduino и подключить к модулю внешний источник питания 5V 1A. После этого все параметры работы дисплея можно будет настраивать в программе.
Подключение одиночного модуля MAX7219 осуществить немного сложнее поскольку в этом случае вам необходимо подключить контакт dout модуля к контакту Din другого модуля, а контакты clock и data подключить к плате Arduino и другим модулям.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы мы используем шину интерфейса SPI (более подробно об использовании данного интерфейса в плате Arduino вы можете прочитать в этой статье) вместе с линией выбора чипа. Для корректного функционирования программы необходимо установить библиотеки MD_MAX72XX и MD_Parolaby от marco. Обе эти библиотеки можно установить с помощью менеджера библиотек Arduino IDE.
Для модуля MAX7219 универсального типа (одиночный модуль)
Первым делом в коде программы подключим все необходимые библиотеки, зададим тип аппаратного обеспечения, укажем число модулей и контакт выбора чипа (chip select pin).
1 2 3 4 5 6 7 8 9 10 |
// 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 1 #define CS_PIN 3 |
Далее создадим объект библиотеки md parola.
1 |
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); |
В функции setup() инициализируем объект для работы с дисплеем с помощью метода begin. Затем установим яркость дисплея и очистим его экран.
1 2 3 4 5 6 7 8 |
void setup() { // Initialize the object myDisplay.begin(); // Set the brightness of the display (0-15) myDisplay.setIntensity(2); // Clear the display myDisplay.displayClear(); } |
В функции void loop() зададим выравнивание, выведем символ на дисплей и добавим задержку 1000 мс. Это мы сделаем для всех символов, которые хотим вывести на экран дисплея. В нашем случае мы выведем на экран дисплея текст "circuit digest".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
void loop() { myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("C"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("I"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("R"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("C"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("U"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("I"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("T"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("D"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("I"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("G"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("E"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("S"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("T"); delay(1500); } |
На этом написание программы для одиночного модуля мы закончили, перейдем к коду для модуля типа FC16.
Для модуля MAX7219 типа FC16
Для модуля типа FC16 мы создадим дисплей со скроллингом и код для него будет практически такой же как и в выше рассмотренном примере. Здесь мы рассмотрим только изменения от этого кода.
Первым делом нужно изменить тип используемого аппаратного обеспечения.
1 |
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW |
Далее необходимо изменить число используемых устройств (MAX_DEVICES) на 4 чтобы код программы мог понять что мы работаем с 4 дисплеями.
1 |
#define MAX_DEVICES 4 |
Затем в функции setup необходимо добавить еще одну дополнительную строку:
1 |
myDisplay.displayScroll("Hello", PA_CENTER, PA_SCROLL_LEFT, 100); |
Она указывает микросхеме MAX7219 на то, что нужно работать в качестве дисплея со скроллингом.
И, наконец, в функции loop() необходимо будет вызвать функции displayAnimate() и displayReset().
1 2 3 4 |
void loop() { if (myDisplay.displayAnimate()) { myDisplay.displayReset(); } |
Тестирование работы проекта
На следующем видео показано тестирование работы модуля MAX7219. Поскольку мы тестируем два типа дисплея, то кодов программы у нас будет тоже два. Сначала мы загрузим в плату Arduino код программы для одиночного модуля MAX7219, который будет выводить на него фразу CIRCUIT DIGEST, по одной букве в каждый момент времени.
Для модуля FC-16 мы будем использовать пример hello из библиотеки и делать дисплей со скроллингом как показано на следующем видео.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
// 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 1 #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() { // Intialize the object myDisplay.begin(); // Set the brightness of the display (0-15) myDisplay.setIntensity(2); // Clear the display myDisplay.displayClear(); } void loop() { myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("C"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("I"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("R"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("C"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("U"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("I"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("T"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("D"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("I"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("G"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("E"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("S"); delay(650); myDisplay.setTextAlignment(PA_LEFT); myDisplay.print("T"); delay(1500); } |
"Какое назначение у контакта 18 модуля MAX7219?
Данный контакт предназначен для установки выходного тока модуля при помощи подключения к данному контакту резистора. Второй конец резистора подключен к земле."
А по схеме - к питанию, как и должно быть.
Да, спасибо. Исправил опечатку