Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 0

Lcd 1602 бегущая строка на ардуино

Программирование бегущей строки.

Бегущая строка из Arduino и светодиодных модулей под управлением MAX7219 практически готова. Настало время перейти к заключающей, программной части.

Бегущая строка на светодиодных модулях MAX7219 и Arduino

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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 #include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> int pinCS = 10; // Подключаем CS к 10-му пину, DIN к MOSI и CLK к SCK int numberOfHorizontalDisplays = 1; // Количество модулей по горизонтали int numberOfVerticalDisplays = 8; // Количество модулей по вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = «»; int wait = 10; // Скорость прокрутки в миллисикундах int spacer = 1; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина символа /* Перекодировка русского шрифта из UTF-8 в Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m = { ‘0’, ‘\0’ }; k = source.length(); i = 0; while (i < k) { n = source; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m = n; target = target + String(m); } return target; } /* Код для работы с com-портом */ String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = «»; // Формируемая из символов строка while (Serial.available() > 0) { // Если в сериал порту есть символы c = Serial.read(); // Читаем символ //Serial.print(c,HEX); Serial.print(» «); Serial.print(c); if (c == ‘\n’) { // Если это конец строки return Serial_string; // Возвращаем строку } if (c == 0xB8) c = c — 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ if (c >= 0xBF && c <= 0xFF) c = c — 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } void setup() { Serial.begin(9600); tape = utf8rus(«QSY.BY Amateur Radio WorkShop»); // Этот текст выводиться при включении или если в com-порт не пришла информация matrix.setIntensity(3); // Яркость от 0 до 15 matrix.setRotation(matrix.getRotation()+3); //1 — 90 2 — 180 3 — 270 } void loop() { if (Serial.available()){ tape=Serial_Read(); } for ( int i = 0 ; i < width * tape.length() + matrix.width() — 1 — spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; // Номер символа выводимого на матрицу int x = (matrix.width() — 1) — i % width; int y = (matrix.height() — 8) / 2; // Центрируем текст по вертикали while ( x + width — spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape, HIGH, LOW,1); } letter—; x -= width; } matrix.write(); // Вывод сообщения на экран delay(wait); } }

Расписывать код не вижу смысла. Он и так хорошо прокомментирован. Однако есть некоторые особенности, о которых стоит упомянуть.

Примечание

Важно. Стандартная библиотека Adafruit_GFX изначально поддерживает только английские шрифты, поэтому ребята из России постарались и переписали библиотеку добавив русские шрифты и всякие вкусняшки

Все библиотеки и скетч доступны у меня на странице в GitHUB.

Кусок кода для работы с com-портом, нужен для того чтобы оперативно менять текст сообщения выводимого на светодиодный модуль. Однако он нужен нам не только для этого. В дальнейшем посредством этой функции мы свяжем наш Telegram Bot и бегущую строку на Arduino.

Необходимый набор инструментов и материалов

Ниже приведена таблица с подробным описанием инструментов, которые понадобятся для конструирования бегущих огней на Ардуино.

ИнструментОсобенности
Arduino NanoНано – модель, которая по размерам самая миниатюрная среди линейки Ардуино. По своему характеру данная платформа напоминает своего сородича – Ардуино Уно. Начинающие электронщики, в основном, строят компактные модели своих устройств, поэтому в этом пригодится компактная Нано. Гнездо под внешнее питание спрятано внутри. Работа производится через USB-порты. Остальные характеристики схожи с моделью Уно.

Технические параметры:

  • напряжение, требуемое для питания устройства, – 5 Вольт;
  • масса – 7 грамм;
  • размер – 19х42 мм;
  • рабочая частотность – 16 МГц;
  • флеш память – 16 Кб;
  • оперативная память – 2 Кб;
  • цифровые пины – 14 штук, причем 6 можно использовать, как ШИМ-выходы
  • требуемое питание при входе – около 12 Вольт.

Существует 2 способа для питания платформы:

  1. Через микро-USB или мини-USB.
  2. При использовании внешнего питательного элемента, в котором общее напряжение от 6 до 20 Вольт. Практически отсутствуют пульсационные волны.
Лента из светодиодовЛента из светодиодов подключается параллельным способом, по несколько отрезков. Каждый отрезок должен быть не больше 5 м в длину. Кроме того, в магазинах она продается именно по таким меркам. Если же потребуется создать строку, на которую нужно 10 или даже 15 метров, придется повозиться. Нельзя ни при каких условиях соединять первый кусок с началом второго. Считается, что 5 метров – длина, показывающая расчет, при котором удерживаются дорожки ленты. Если нагрузить ленту, то произойдет поломка, и сделанное изделие испортится.

Да и со стороны ухоженности текстовая дорожка будет некрасиво выглядеть из-за неравномерного свечения: в начале дорожке свет будет ярким, а в конце потускнеет.

ПроводаНабор проводов для соединения компонентов
Плата для управления процессомНа управляющую платформу помещается микропроцессор и остальные части для готового изделия (например Тройка Шилд).

Машинка на Ардуино Нано своими руками

Программа для машинки на Ардуино Нано имеет два режима работы — прямое управление от Android смартфона или ик-пульта, а также автономный режим: машинка ездит сама по заданному алгоритму. Для индикации режима работы используются светодиоды. Питание машинки производится от аккумулятора Крона. Можно использовать USB шнур для питания, но моторы будут вращаться медленнее.

Так как вся схема должна поместиться внутри компьютерной мышки, то для управления моторчиками используются транзисторы вместо Motor Shield Arduino. Это позволяет сэкономить место, но минус данного решения в том, что у машинки не будет заднего хода (моторы могут вращаться только в одну сторону). А сами моторчики имеют редукторы для увеличения скорости оборотов и мощности вращения колес.

Программирование бегущей строки

Бегущая строка из Arduino и светодиодных модулей под управлением MAX7219 практически готова. Настало время перейти к заключающей, программной части. На компьютере должно быть установлено программное обеспечение (ПО) для используемого Arduino и драйвер к нему. Далее необходимо скачать две библиотеки и скетч (специальную программу, которая будет загружаться и выполняться процессором Arduino). Установку библиотек производят при закрытом Arduino IDE в папку «Documents – Arduino – Libraries». Затем скачивают и запускают скетч и проверяют наличие библиотек и корректность других данных.

Библиотека 1: arduino-Max72xxPanelБиблиотека 2: Adafruit-GFX-Library

Настройка скетча:

  • «number of horizontal displays» указывают количество строк, в нашем случае 1;
  • «number of vertical displays» указывают количество матриц, в нашем случае 8;
  • «string tape» указывают надпись, выводимую на дисплей;
  • «int wait» задают скорость вывода в миллисекундах.

После проверки введенных данных остаётся щелкнуть мышкой на кнопку «загрузить». Затем отключиться от ПЭВМ, вставить батарейку и произвести запуск устройства.

В заключение хочется добавить, что бегущая строка своими руками собирается довольно быстро даже без навыков работы с Arduino. Поэтому бояться этой замысловатой платы не стоит. Также стоит отметить, что сделать бегущую строку можно длиннее, увеличив количество светодиодных матриц.

Привет Ребятушки. Сегодня запилим бегущую строку на светодиодных модулях MAX7219 и Arduino. Задача очень простая и не потребует от нас больших знаний в области электроники и программирования. Для начала предлагаю изучить немного теории по устройству светодиодной матрицы, принципу ее подключения и посмотреть видео результата к которому мы будем стремиться на протяжении всей статьи.

Публикация от Pavel V. Hladkikh (@eu4dgc) Мар 8, 2018 в 1:40 PST

Светодиодная матрица — это графический индикатор, который можно использовать для вывода простых изображений, букв и цифр. Я не ставлю задачу подробно разобраться с устройством матричных индикаторов, однако стоит заметить, что по сути матрица состоит и 8х8 светодиодов. По сути все сводиться к динамической индикации. Основываясь на этом, понятно, что группировать несколько матриц вместе задача не из простых. На каждый новый ряд или колонку матриц, нужно добавлять новый сдвиговый регистр вместе с проводами и резисторами, а по-хорошему еще и микросхему ULN2003.

К счастью, инженеры давно уже разработали специализированные микросхемы для управления разного рода индикаторами. В этой статье мы рассмотрим матричный модуль с микросхемой MAX7219. Как станет понятно позже, работать с таким модулем одно удовольствие.

#3 Пример

Выводим надпись «Русский язык» на дисплей LCD1602 подключённый по шине I2C:

#include // Подключаем библиотеку для работы с шиной I2C
#include // Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2); // Объявляем объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
//
uint8_t symbol = { // Объявляем массив из 6 собственных символов (к и й я з ы), каждый символ состоит из 8 байт
{ 0, 0,18,20,24,20,18, 0 }, // к
{ 0, 0,17,19,21,25,17, 0 }, // и
{10, 4,17,19,21,25,17, 0 }, // й
{ 0, 0,15,17,15, 5, 9, 0 }, // я
{ 0, 0,14,17, 6,17,14, 0 }, // з
{ 0, 0,17,17,29,19,29, 0 }}; // ы
//
void setup(){ //
lcd.init(); // Инициируем работу с LCD дисплеем
lcd.backlight(); // Включаем подсветку LCD дисплея
lcd.createChar(1, symbol); // Загружаем 1 символ «к» в ОЗУ дисплея
lcd.createChar(2, symbol); // Загружаем 2 символ «и» в ОЗУ дисплея
lcd.createChar(3, symbol); // Загружаем 3 символ «й» в ОЗУ дисплея
lcd.createChar(4, symbol); // Загружаем 4 символ «я» в ОЗУ дисплея
lcd.createChar(5, symbol); // Загружаем 5 символ «з» в ОЗУ дисплея
lcd.createChar(6, symbol); // Загружаем 6 символ «ы» в ОЗУ дисплея
lcd.setCursor(0, 0); // Устанавливаем курсор в позицию (0 столбец, 0 строка)
lcd.print(«Pycc\1\2\3 \4\5\6\1»); // Выводим текст «Pycckий языk», где «Pycc» написано латиницей, а «kий языk» — символами из ОЗУ дисплея
} // Если нужно вывести символ из ОЗУ дисплея, то пишем \ и номер символа
//
void loop(){} // Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

Как вывести текст

Вывести текст можно 2 способами:

  • создать массив символов/изображений и выводить его последовательно со смещением;
  • использовать скачанную библиотеку с функциями.

Чтобы вывести массив, надо в вечном цикле организовать цикл for с количеством итераций, равным длине текста в пикселях, и внутри него выводить сформированный массив.

Есть также библиотека Adafruit_GFX, в которой содержатся:

  1. Английские буквы в обоих типах регистра.
  2. Стандартные знаки препинания.
  3. Функции, позволяющие выводить окружности и отрезки.

С помощью этой библиотеки можно даже управлять RGB-светодиодами, изменяя их цвет.

Чтобы с ее помощью вывести символ, нужно прописать функцию drawChar.

У этой функции следующие аргументы:

  • положение символа относительно верхнего левого угла;
  • символ в библиотеке;
  • цвет символа (для двухтонной сборки HIGH значит, что светодиод горит, LOW — потушен);
  • фон (для двухцветной матрицы LOW — черный фон, HIGH -инверсный);
  • размер (если по вертикали 1 диодная сборка, то размер равен 1).

В стандартном виде Adafruit_GFX работает только с латинскими символами, но есть и версия библиотеки, в которую включен русский шрифт. Для вывода стандартного текста она подходит лучше всего.

Модуль светодиодной матрицы с микросхемой MAX7219

Модуль представляет из себя плату с микросхемой, необходимой для неё обвязкой и, собственно, матричным индикатором. Обычно индикатор не впаивают в плату, а вставляют в разъем. Это сделано для того, чтобы группу модулей можно было сначала закрепить на какой то поверхности винтами, а затем вставить в них матрицы.

У модуля есть пять выводов на каждой стороне. С одной стороны данные входят в модуль, с другой стороны данные выходят из модуля и передаются в следующий. Это позволяет соединять матрицы у цепочку.

Входной разъем / Выходной разъем:

  • VCC, GND — питание;
  • DIN — вход данных;
  • CS — выбор модуля (chip select);
  • CLK — синхроимпульс.

Работает модуль от напряжения 5 Вольт.

ВЫВОД ТЕКСТА С ПОМОЩЬЮ БИБЛИОТЕКИ ADAFRUIT-GFX-LIBRARY

Подобным же образом можно выводить на матрицу и любой другой символ, например, букву. Но чтобы иметь возможность отображать любую букву английского алфавита, нам необходимо будет определить в программе целых 26 восьмибайтных массива! Это очень муторно, и разумеется кто-то это уже сделал до нас.

В популярной библиотеке Adafruit-GFX-Library помимо функций для работы с графикой и текстом, имеется и база латинских букв в верхнем и нижнем регистрах, а также все знаки препинания и прочие служебные символы. Ссылка на библиотеку есть в конце статьи.

Отобразить символ на матрице можно с помощью функции drawChar.

drawChar( x, y, символ, цвет, фон, размер );

Первые два параметра функции отвечают за координаты верхнего левого угла символа. Третий параметр — это сам символ. Цвет символа в нашем случае будет равен 1 или HIGH, так как матрица двухцветная. Фон равен 0 или LOW. Последний параметр «размер» сделаем равным 1.

Напишем программу, которая будет по-очереди выводить на матрицу все буквы фразы: «HELLO WORLD!».

Примечание. В библиотеке Adafruit_GFX имеется множество функций для работы с графикой. Например, drawCircle( 3, 3, 2, HIGH ) начертит окружность с центром {3,3} и радиусом 2. Последний параметр — цвет, но в случае монохромной матрицы он равен 1 или HIGH. Функция drawLine( 0, 0, 3, 6, HIGH ) начертит отрезок между точками {0,0} и {3,6}.

Вывод пикселей с помощью библиотеки Max72xxPanel

Для управления микросхемой MAX7219 воспользуемся библиотекой Max72xxPanel
. Скачать её можно по ссылкам в конце статьи.

Установим библиотеку и напишем небольшой код, который будет выводить на дисплей всего одну точку с координатами x=3 и y=4. Точка будет мигать с периодом 600 миллисекунд.

#include
#include
#include
int pinCS = 10;
int numberOfHorizontalDisplays = 1; // количество матриц по-горизонтали
int numberOfVerticalDisplays = 1; // количество матриц по-вертикали
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
matrix.setIntensity(4); // яркость от 0 до 15
}
void loop() {
matrix.drawPixel(3, 4, HIGH); // зажигаем пиксель с координатами {3,4}
matrix.write(); // вывод всех пикселей на матрицу
delay(300);
matrix.drawPixel(3, 4, LOW); // гасим пиксель
matrix.write();
delay(300);
}

Как уже говорилось ранее, матричные модули с микросхемой MAX7219 можно легко объединять. Именно для этой цели в начале программы мы задаем количество матриц по-горизонтали и по-вертикали. В данном случае используется одна матрица, так что оба этих параметра будут равны 1.

Важно отметить, что после включения и выключения пикселей с помощью функции drawPixel
, необходимо вызвать функцию write. Без функции write, пиксели не высветятся на матрице!. Теперь напишем код, который отобразит на матрице смайл

Смайл зашифруем с помощью массива из восьми байт. Каждый байт массива будет отвечать за строку матрицы, а каждый бит в байте за точку в строке

Теперь напишем код, который отобразит на матрице смайл. Смайл зашифруем с помощью массива из восьми байт. Каждый байт массива будет отвечать за строку матрицы, а каждый бит в байте за точку в строке.

Вывод пикселей с помощью библиотеки Max72xxPanel

Для управления микросхемой MAX7219 воспользуемся библиотекой Max72xxPanel. Скачать её можно по ссылкам в конце статьи.

Установим библиотеку и напишем небольшой код, который будет выводить на дисплей всего одну точку с координатами x=3 и y=4. Точка будет мигать с периодом 600 миллисекунд.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> int pinCS = 10; int numberOfHorizontalDisplays = 1; // количество матриц по-горизонтали int numberOfVerticalDisplays = 1; // количество матриц по-вертикали Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); void setup() { matrix.setIntensity(4); // яркость от 0 до 15 } void loop() { matrix.drawPixel(3, 4, HIGH); // зажигаем пиксель с координатами {3,4} matrix.write(); // вывод всех пикселей на матрицу delay(300); matrix.drawPixel(3, 4, LOW); // гасим пиксель matrix.write(); delay(300); }

Как уже говорилось ранее, матричные модули с микросхемой MAX7219 можно легко объединять. Именно для этой цели в начале программы мы задаем количество матриц по-горизонтали и по-вертикали. В данном случае используется одна матрица, так что оба этих параметра будут равны 1.

Важно отметить, что после включения и выключения пикселей с помощью функции drawPixel, необходимо вызвать функцию write. Без функции write, пиксели не высветятся на матрице!. Теперь напишем код, который отобразит на матрице смайл

Смайл зашифруем с помощью массива из восьми байт. Каждый байт массива будет отвечать за строку матрицы, а каждый бит в байте за точку в строке

Теперь напишем код, который отобразит на матрице смайл. Смайл зашифруем с помощью массива из восьми байт. Каждый байт массива будет отвечать за строку матрицы, а каждый бит в байте за точку в строке.

Примечание. В библиотеке Max72xxPanel есть функция setRotation, которая задает ориентацию изображения на матрице. Например, если мы захотим повернуть смайл на 90 градусов, нужно будет сразу после вызова функции setIntensity вызвать setRotation с соответствующими аргументами:

matrix.setRotation( 0, 1 );

первый параметр — это индекс матрицы, в нашем случае он равен нулю; второй параметр — количество поворотов на 90 градусов.

Способ вывода данных на матрицы

При каскадном включении, выход DOUT предыдущего драйвера соединяется с входом DIN следующего драйвера, группы выводов CS и CLK соединяются параллельно. При загрузке данных информация сдвигается побитно, сначала загружаются данные предназначенные для последнего драйвера в цепочке, затем остальные по очереди. Для одного драйвера пакет состоит из 2 байт, это адресный байт и байт данных.

Печатная плата модуля спроектирована так, что данные загружаемые в регистры драйвера Digit0-Digit7 отображаются в строках матрицы (горизонтально), ниже приведена поясняющая картинка:

Для вывода символов я решил взять стандартную таблицу со шрифтом 5×7, которую использовал для графического дисплея Nokia 5110. Но в этой таблице байты символов упакованы по-другому, каждый байт предназначен для вертикального отображения в столбец, таким образом, просто передавать байты на драйвер не получится. Можно конечно переписать всю таблицу символов, но это слишком утомительно. В данном случае необходимо переворачивать символы, извлекая данные побитно.

Данные проще записать за один сеанс, предварительно подготовив пакеты байтов для всех матриц, то есть сразу заполнить одну строку на всю длину панели, затем остальные строки в последующих сеансах (всего 8 сток). Для 5-ти матриц за сеанс передается 10 байт данных, для всей панели соответственно получим 80 байт.

Можно конечно использовать пустой регистр No-Op (адрес 0x00), предназначенный для обращения к отдельному драйверу в цепочке, но при этом также придется отправлять байты на всю длину строки. В этом случае только один пакет будет записан в конкретный драйвер, для остальных драйверов данные запишутся в регистры No-Op, не повлияв на их функционирование. Такой способ нельзя назвать рациональным, так как увеличивается количество передаваемых данных, что замедляет процесс вывода информации.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации