Показ различных объявлений на разнообразных досках/панелях играет существенную роль в жизни современного общества. Одними из самых популярных средств отображения подобной информации в настоящее время являются цифровые светодиодные панели ввиду их высокой надежности и других достоинств. Ранее на нашем сайте мы уже рассматривали ряд проектов, в которых мы использовали светодиодную матрицу 8x8, но в этой статье мы рассмотрим светодиодную матрицу значительно большего размера.
В данной статье мы будем использовать модули матричных дисплеев размером 32x16 светодиодов, которые также известны как светодиодные матричные дисплеи P10 (P10 LED Display Module), для скроллинга на них текста под управлением платы Arduino. Эти модули P10 можно объединять вместе как по горизонтали, так и по вертикали, и создавать из них светодиодные панели/матрицы практически любых размеров.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- 32*16 P10 LED display module (светодиодный матричный дисплей) (купить на AliExpress).
- 16-пиновый FRC коннектор.
- Импульсный источник питания (SMPS) на 5 В, 3 А (купить на AliExpress).
- Соединительные провода.
Принцип работы светодиодных матричных дисплеев P10
Светодиодные матричные дисплеи P10 наиболее удобны для создания наружных и внутренних досок объявлений. Подобный дисплей содержит 512 светодиодов высокой яркости, смонтированных на пластиковом основании. Любое количество этих дисплеев можно объединить как по горизонтали, так и по вертикали.
Обозначение 32*16 у этих дисплеев обозначает, что они содержат 32 светодиода в каждой строке и 16 светодиодов в каждом столбце. Итого получаем 512 светодиодов.
Технические характеристики светодиодных матричных дисплеев P10:
- яркость: 3500-4500nits;
- максимальная потребляемая мощность: 20 Вт;
- напряжение питания: 5 В постоянного тока;
- водонепроницаемость: IP65;
- конфигурация 1 Вт на пиксел;
- широкие углы обзора;
- высокая контрастность.
Назначение контактов светодиодных дисплеев P10
- Enable: этот контакт используется яркостью дисплея при помощи подачи на него импульса ШИМ (широтно-импульсной модуляции);
- A, B: контакты мультиплексирования, позволяют обратиться к любым контактам при помощи технологии мультиплексирования;
- Shift clock (CLK), Store clock (SCLK) и Data: контакты управления обычным регистром сдвига. В этих дисплеях используется регистр сдвига 74HC595.
Распиновка модуля P10 показана на следующем рисунке.
Схема проекта
Схема подключения светодиодного дисплея P10 к плате Arduino представлена на следующем рисунке.
Схема соединений светодиодного дисплея P10 и платы Arduino показана в следующей таблице.
Дисплей P10 | Плата Arduino |
ENABLE | 9 |
A | 6 |
B | 7 |
CLK | 13 |
SCLK | 8 |
DATA | 11 |
GND | GND |
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Примечание: подключайте контакты питания каждого модуля P10 к импульсному источнику питания (SMPS) 5 В по отдельности. Если вы планируете использовать больше модулей P10 для создания светодиодной матрицы, то соответствующим образом вам будет необходимо масштабировать и импульсный источник питания (SMPS).
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе мы должны подключить все используемые библиотеки. Библиотека “DMD.h” будет использоваться для работы со светодиодными дисплеями P10. Скачайте ее по этой ссылке и установите ее в вашу Arduino IDE. Библиотека “TimerOne.h” будет использоваться для задач обработки прерываний, ее можно скачать по следующей ссылке.
Также мы будем использовать библиотеку “Arial Black font” для отображения текста на нашем дисплее.
1 2 3 4 5 |
#include <SPI.h> #include <DMD.h> #include <TimerOne.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" |
Далее следует указать количество строк и столбцов нашей светодиодной панели – поскольку для ее создания мы использовали только один модуль P10, то число строк и столбцов должно быть равно 1. Затем укажем шрифт Arial_Black_16, который будет использоваться для скроллинга текста на дисплее.
1 2 3 4 |
#define ROW 1 #define COLUMN 1 #define FONT Arial_Black_16 DMD led_module(ROW, COLUMN); |
Функция scan_module() будет проверять все поступающие по интерфейсу SPI данные. Если данные будут поступать, то будет срабатывать прерывание, в обработчике которого будут выполняться необходимые действия.
1 2 3 4 |
void scan_module() { led_module.scanDisplayBySPI(); } |
Внутри функции void setup() мы будем инициализировать таймер и прикреплять прерывание к функции scan_module. Функция clearScreen(true) будет использоваться для очистки экрана дисплея.
1 2 3 4 5 6 |
void setup() { Timer1.initialize(2000); Timer1.attachInterrupt(scan_module); led_module.clearScreen( true ); } |
Далее, для отображения строки на экране дисплея, необходимо с помощью функции selectFont() задать используемый шрифт. После задания шрифта мы будем высвечивать на экране дисплея приветственное сообщение “Welcome to Circuit Digest” с помощью функции drawMarquee().
1 2 |
led_module.selectFont(FONT); led_module.drawMarquee("Welcome to Circuit Digest",25, (32 * ROW), 0); |
И, наконец, чтобы производить скроллинг текста на нашем светодиодном дисплее, мы будем переключать наше сообщение справа налево с заданным временным интервалом.
1 2 3 4 5 6 7 8 9 10 11 |
long start = millis(); long timming = start; boolean flag = false; while (!flag) { if ((timming + 20) < millis()) { flag = led_module.stepMarquee(-1, 0); timming = millis(); } } |
Исходный код программы (скетча)
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 |
#include <SPI.h> #include <DMD.h> #include <TimerOne.h> #include "SystemFont5x7.h" #include "Arial_black_16.h" #define ROW 1 #define COLUMN 1 #define FONT Arial_Black_16 DMD led_module(ROW, COLUMN); void scan_module() { led_module.scanDisplayBySPI(); } void setup() { Timer1.initialize(2000); Timer1.attachInterrupt(scan_module); led_module.clearScreen( true ); } void loop() { led_module.selectFont(FONT); led_module.drawMarquee("Welcome to Circuit Digest",25, (32 * ROW), 0); long start = millis(); long timming = start; boolean flag = false; while (!flag) { if ((timming + 20) < millis()) { flag = led_module.stepMarquee(-1, 0); timming = millis(); } } } |
Здравствуйте. Спасибо за статью. Скажите, а будет ли работать этот скетч для нескольких панелей, например 4 шт. По схеме 2х2, т.е.2 по горизонтали и 2 по вертикали. И как соединить панели в таком режиме
Добрый день, эти панели можно соединять вместе и по горизонтали, и по вертикали, но лично я это не пробовал, у меня нет такого количества данных панелей. Скорее всего, программу будет необходимо немного изменить поскольку изменится общее количество строк и столбцов в составной панели
Здравствуйте! А кто может сделать блок для FLProg
Добрый день, к сожалению я не могу. Не знаю, отпишется ли здесь кто-нибудь из тех, кто может