" title="Написать письмо">Написать письмо
Донаты на карту ВТБ:
2200 4002 2461 6363

Статьи по дате (многие всегда актуальны)

Статистика

Пользователи : 1
Статьи : 2130
Просмотры материалов : 7885071
 
ЖК-дисплей на Arduino (07.02.2025). Печать E-mail
2025 - Февраль
07.02.2025 10:27
Save & Share
В связи с сжиганием рукожопным стажёром Arduino Nano и семисегментного индикатора TM1637, пришлось перейти на резервную систему Arduino Mega 2560 и ЖК-экраны.

С Arduino Mega 2560 знакомство было впервые. 6.5 лет назад были куплены ЖК-экраны для Arduino (1602A без I2C и 2004A с I2C) - чисто побаловаться на Arduino Nano. Тогда баловство растянулось на несколько дней и вылилось в стойкое понимание, тогда и сейчас. Интерфейс I2C - должен быть в каждом покупаемом модуле для Arduino: экономия контактов и использование улучшенных сторонних библиотек по работе с модулями. На примере обоих моделей экранов: вместо 4 контактов было бы занято 16 - вся Arduino Nano ушла бы под экран.

К сожалению, треш с ЖК-экранами продолжился и сейчас (из-за чего и был ранее выбран TM1637: меньше возможностей, но гораздо меньше геморроя, а также дешевле и миниатюрнее ещё):
- библиотека LiquidCrystalRus мутировала в очередной проект от AlexGyver: GyverLCDbars - позволяющий не просто полосы прокрутки на дисплее рисовать, а графики в высоту. Можно добавить ещё одну мысль: так как размер каждой ячейки экрана 6x8 пикселей - можно попробовать рисовать и обычные графики (точками тонкие линии) - мирясь с полосками между ячейками;
- именно на анализ библиотек много времени ушло. Так как GyverLCDbars достаточно много жрёт ресурсов - казалось бы, есть компактный аналог (русские буквы и цифры): LCD_1602_RUS_ALL от ssilver2007 (2 H-файла 21.6КБ). Но не смог приспособить его: в Arduino IDE v.1.8.18 нет встроенной LiquidCrystal_I2C.h, а внешние вызывают ошибки компилирования (куча разных CPP- и H-файлов от разных авторов). Поэтому, LiquidCrystalRus остался бы оптимальным выбором (она ещё обновилась 4 года назад), если бы она поддерживала I2C. Тупик? - пока да: либо русские буквы, либо I2C. Это может быть темой для диплома бакалавра, если студенту удастся объединить жопу с пальцем - и эта связка будет работать на всех версиях Arduino IDE;
- по-прежнему можно купить на алиэкспрессе комплектный 2004A, отдельно экран 1602A и плату I2C. Однако цены изменились. Экран стоит минимум 138руб со скидкой (200руб без), плата - минимум 79руб, 2004A - минимум 300руб. В магазинах РФ, естественно: 2004A гонят из-за рубежа и загоняют минимум за 610руб (попался 1 лот за "360руб" - но там доставка только платная 199руб - очень мутный лот в принципе).

После многочасового анализа и выбора библиотеки: экран 2004A заработал через несколько часов с LiquidCrystal_I2C от 07.2020 (разработчики не пишут версии своего продукта - совсем скатились уже). Скачать библиотеку с гитхаба от johnrickman, припаять 4 контакта, залить скетч с отображением одной строки с английскими буквами - не работает:
- цифровой пин имеет максимум тока 40мА - вход Vcc 2004A потребляет 30мА от +5В. Но при этом, как ни игрался с PORTD и DDRD, - завести его с цифрового пина не смог. Оказалось, в Mega 2560 не работают эти команды. В свою очередь, digitalWrite зажгла светодиод через резистор (т.е. смещения у цифровых каналов нет) - но экран не осилила. pinMode - не зажгла вообще ничего. Только комбинация pinMode+digitalWrite зажгла всё (похоже, по умолчанию подключалось встроенное сопротивление 40кОм) - 18.7мА от USB;
- проблемой стал анализ пинов Arduino, к которым припаиваются SDA и SCL. По умолчанию для них пины A4 и A5 соответственно - и нигде в исходниках это не указано (только старые вопросы на форумах поставили точку в этом вопросе). Пишут, что на плате I2C должны быть 3 перемычки для смены адреса, чтобы можно было подключаться к другим каналам, - но, по факту, на моей плате I2C перемычка только 1 (отвечает за подсветку экрана аппаратно). Скорее всего, A4 и A5 выбраны не просто так: A6 и A7 не работают на выход в Arduino Nano - унификация под разные платы Arduino;
- даже правильно припаянные аналоговые каналы не заработали. Исправление смещения аналоговых каналов относительно цифровых (с 14 на 54) - зажигало светодиод по-соседству на A2, но никакая комбинация pinMode информацию на дисплей не передавала. Потому что руки нужно оторвать тем, кто в интернете пишет о соответствии SDA и SCL аналоговым каналам. На 2560, если найти картинку её распиновки, чётко отмечены 2 пары SDA и SCL - одна из них: контакты 20 и 21 (на самой плате номера не написаны);
- но и этого оказалось мало. Потребовалось изменение адреса устройства с 0x27 на 0x3F.

Именно после последнего - и произошли кардинальные изменения:
- стало видно не ярко горящие нечётные строки по 20 ячеек, а все;
- контрастность ячеек при этом стала другой - стало возможным разглядеть все тусклые ячейки;
- в части этих тусклых ячеек, собственно, "Hello, world!" и высветилось. Хрюкаешь как в 13 лет: когда "Hello, World" на QBasic'е вывел;
- изначальные настройки чёткости ячеек на экране не понравились - потенциометром на плате I2C отрегулировал их яркость. Этот винт работает, даже если просто питание подано. Им можно докрутить контрастность до такого состояния, что надписи станут не белыми, а красными.

Исходник для Mega 2560 (требуется ещё тест на написание текста в разных ячейках и тест, нужны ли pinMode, - но пока нет сил).

#include "LiquidCrystal_I2C.h" //CPP-файл в проекте тоже лежит.
LiquidCrystal_I2C lcd(0x3f, 20, 4); //Адрес устройства (0x27 или 0x3f), число ячеек по горизонтали на экране, число ячеек по вертикали. Многие примеры в интернете указывают для 2004A "16 и 2" - бред: они в названии прямо написаны.

//Vcc.
pinMode(6, OUTPUT);
digitalWrite(6, HIGH);

//SDA, SCL.
pinMode(20, OUTPUT);
pinMode(21, OUTPUT);

lcd.init(); //Вот сюда бы входными параметрами сделать SDA и SCL, подменяя их на нужные аналоговые каналы.
lcd.backlight(); //Включить подсветку.
lcd.setCursor(0,1); //Первая ячейка второй строки.
lcd.print("S**a, bl**b, na**y!"); //Так и выведется.

(добавлено 08.02.2025) Команда PORTA тоже не работает - пока Mega рассматривается как ущербная. Специально пересмотрел все исходники, сделанные в своё время на UNO вместо Nano, - не было там таких проблем с PORT и DDR.

Также её входной цифровой канал не заземлился резистором 22кОм - когда успешно заземляется в Arduino Nano. Эта величина была уменьшена до 1.6кОм (да, почти в 14 раз). Именно поэтому во всех исходниках пишу не только версию проекта, но и на какой плате Arduino он был выполнен (версию самой платы не всегда удаётся написать).

Поправил исходники выше, в соответствии с поведением экрана. Каретка, при выводе символов, - смещается; при печатании на одном и том же месте в цикле - её надо возвращать назад. Каретка сама делает Enter на следующую строку, если строка не помещается в одну.

В плате I2C есть микросхема PCF8574. Если разобраться, как она работает, - можно создать свою плату I2C на 8 экранов сразу. Есть также видео на ютубе пользователя Arturos TV "Подключение нескольких устройств по шине I2C" - но из-за сраного роскомпозора невозможно его посмотреть!

Вчера видел мельком библиотеку для создания больших чисел на экране - но целенаправленный небрежный поиск не дал результата. Помнится, в названии было слово "Big".

(добавлено 09.02.2025) Для сравнения, стоит отметить особенность TM1637 (почему столько негатива в сторону ЖК). У него 2 пина информации: CLK и DIO. Не надо искать пинов с такими же названиями на плате - достаточно подключить их к любым 2 цифровым каналам и настроить их правильно на вход-выход. Этого же ожидается от ЖК, но это в корне не так.

(добавлено 18.02.2025) Описка: потенциометр - управление именно контрастностью ячеек. Подсветка остаётся на таком же уровне. setBacklight() - имеет только параметр-аналог true/false 0x08/0x00.

(добавлено 19.02.2025) Да, даже новая версия библиотеки - русский язык не держит. Проблема - ещё глубже: при применении библиотеки RobotClass_LiquidCrystal_I2C - вместо русских букв по-прежнему шли кракозябры.

Оказывается, в часть экранов зашивают поддержку кириллицы, а в часть - нет. А потом выясняется, что это частично враньё (с целью продажи своих ЖК-дисплеев от RobotClass), и кириллица присутствует - но произвольным набором русских символов. И вместо слова "Ошибка" высвечивается "Опзица" (LCD_1602_RUS от ssilver2007 v.1.0.5 - с правкой инклуда LiquidCrystal_I2C.h). То есть, написать функцию подмены одних русских символов на другие - и всё удачно заработает.

Подсветка ЖК-экрана - постоянно фонит в аналоговые каналы, погрешность либо +3%, либо константа в несколько разрядов.

Самописный самоконтроль показал, что автоперенос строк работает паршиво: отображаются 1, 3, 2, 4 строки - библиотеку, похоже, надо менять. Библиотека из репозитория Arduino.cc v.1.1.2 от 2016 - такой же результат. Поэтому, возможно, это и баг самого дисплея. setCursor() - работает нормально.

(добавлено 24.02.2025) Всё оказалось ещё хуже. Оказывается, кириллица работает нормально. Но стоит только забыть писать setCursor перед каждым вторым и последующим вызовом print - библиотека тупит: слова начинает разбивать на части (при этом по определённому странному алгоритму) - и разбрасывать буквы, в т.ч. за пределы экрана.

Слово "Опзица" вместо "Ошибка" - набор букв из фразы "Ошибка: Повышение analogWrite привело к понижению U: позиция ". Остальные буквы и символы - тупо за пределы экрана унесло (на дисплее могут отображаться и скрытые пробелы).

При этом такая лажа наблюдается только в том случае, если есть русские буквы. С цифрами - работает нормально: 80 цифр одних (чтобы забить весь экран), 80 цифр других - только перенос строк страдает (1, 3, 2, 4).

Так как функций print в библиотеке LCD_1602_RUS много - единственный путь: в проекте создать свою функцию print для экрана, где входные параметры - объект экрана, выводимый текст, начальная строка, начальная ячейка, затирать ли экран, время отображения 80-символьных частей.

А дальше - наступил Epic Fail: русский алфавит, при выводе на экран, отображается не просто перемешиванием букв, а часть букв одинаковая. Похоже, дело в том, что ему нельзя много русских букв кормить именно разных: ЖЖЖЖЖЖЖ выведет хоть 80шт; а вот алфавит 33 разных буквы - "автозаменой". То есть, каждую выводимую на экран русскоязычную строку надо проверять: корректно она отобразится или нет, не много ли разновидностей русских букв для него. Была найдена закономерность: разных заглавных букв алфавита должно быть не больше 16. Но и она толком не работает: слово с 17 буквами в составе "АБВГДЕЁЖЗИЙКЛМНОААААААААААААААААААББС" - выводит нормально. Возможно, имеет значение и количество зажигаемых пикселей в разновидностях букв.

Полная бредятина.

Впрочем, небольшое количество русских букв - не вредит (на крайний случай, написал функцию-транслитератор на английский). Но для выведения описания ошибок русскими буквами - уже не годится.


(добавлено 25.02.2025) Раньше существовала единственная библиотека, объединяющая I2C и русские символы, - однако автор её поспешно удалил, и на гитхабе она теперь 404. Скорее всего, он столкнулся с такой же фигнёй.

С маленькими буквами русского алфавита - ещё хуже: можно только 10 разновидностей.
Обновлено ( 25.02.2025 18:12 )
 
 

Последние новости


©2008-2025. All Rights Reserved. Разработчик - " title="Сергей Белов">Сергей Белов. Материалы сайта предоставляются по принципу "как есть". Автор не несет никакой ответственности и не гарантирует отсутствие неправильных сведений и ошибок. Вся ответственность за использование материалов лежит полностью на читателях. Размещение материалов данного сайта на иных сайтах запрещено без указания активной ссылки на данный сайт-первоисточник (ГК РФ: ст.1259 п.1 + ст.1274 п.1-3).

Много статей не имеет срока устаревания. Есть смысл смотреть и 2011, и даже 2008 год. Политика сайта: написать статью, а потом обновлять ее много лет.
Рекламодателям! Перестаньте спамить мне на почту с предложениями о размещении рекламы на этом сайте. Я никогда спамером/рекламщиком не был и не буду!
Top.Mail.Ru