Жк дисплеи с шиной

Дружим STM32 с LCD дисплеем 1604 по I2C шине (библиотека HAL)

В этой статье я хотел бы рассказать о своем опыте подключения LCD дисплеев к микроконтроллеру STM32 с использованием библиотеки HAL по I2C шине.

Жк дисплеи с шиной

Подключать буду дисплей 1602 и 2004. Они оба имеют припаянный I2C адаптер на основе чипа PCF8574T. Отладочной платой выступит Nucleo767ZI, а средой разработки – STM32CubeIDE 1.3.0.

Про принцип работы I2C шины подробно рассказывать не буду, советую заглянуть сюда и сюда.

Создаем проект, выбираем отладочную плату:

Жк дисплеи с шиной

Указываем, что будем использовать I2C1. Также я подключу UART5 для общения с платой, это нужно для получения информации от платы об адресе дисплея.

Жк дисплеи с шиной

Жк дисплеи с шиной

В этом же окне можно посмотреть номера ножек, к которым подключается дисплей, в моем случае получилось так:

Жк дисплеи с шиной

Для начала подключим всего один дисплей, я начну с 1602. Также я подключу известный бывалым ардуинщикам адаптер USB-UART CH340 для получения данных с платы.

Жк дисплеи с шиной

Обратите внимание, адаптер подключается RX к TX и TX к RX, перемычка на адаптере стоит на 3.3В

Жк дисплеи с шиной

Рассмотрим подробнее работу с микросхемой PCF8574T и дисплеем. Ниже приведена принципиальная схема модуля с дисплеем:

Жк дисплеи с шиной

Микросхема PCF8574T по функционалу схожа с регистром сдвига 74hc595 – она получает по I2C интерфейсу байт и присваивает своим выводам (P0-P7) значения соответствующего бита.

Рассмотрим какие выводы микросхемы соединены с дисплеем и за что отвечают:

Видео:Как работает ЖК-дисплей? (Анимация)Скачать

Как работает ЖК-дисплей? (Анимация)
  • Вывод Р0 микросхемы соединен с выводом RS дисплея, отвечающего за то, принимает дисплей данные (1) или инструкции по работе дисплея (0);
  • Вывод Р1 соединен с R\W, если 1 – запись данных в дисплей, 0 – считывание;
  • Вывод Р2 соединен с CS – вывод, по изменению состояния которого идет считывание;
  • Вывод Р3 – управление подсветкой;
  • Выводы Р4 — Р7 служат для передачи данных дисплею.

К одной I2C шине может быть подключено несколько устройств одновременно. Для того, чтобы можно было обращаться к конкретному устройству, каждое из них имеет свой адрес, для начала выясним его. Если контакты А1, А2 и А3 на плате адаптера не запаяны, то адрес будет скорее всего 0х27, но лучше проверить. Для этого напишем небольшую функцию, которая покажет адреса всех устройств, которые подключены к I2C шине:

Данная функция опрашивает все адреса от 0 до 127 и если с этого адреса поступил ответ, она отправляет номер этого адреса в 16-тиричной форме в UART.

Для общения с платой я использую программу Termite. По умолчанию скорость UART у микроконтроллера устанавливается в значении 115200, необходимо установить такую же в термите. Вызываем функцию в основном теле программы, прошиваем плату и коннектимся в термите к нашему микроконтроллеру:

Жк дисплеи с шиной

Точками отображаются все адреса, с которых ответ не был получен. Адрес у моего дисплея 0х26, так как я запаял перемычку А0. Теперь подключим второй дисплей параллельно первому, и посмотрим, что выдаст программа:

Жк дисплеи с шиной

Имеем два адреса: 0х26 (дисплей 1602) и 0х27 (дисплей 2004). Теперь о том, как работать с дисплеем. Микроконтроллер посылает байт адреса, а все устройства, подключенные к шине, сверяют его со своим. Если он совпадает, то модуль начинает общение с микроконтроллером. В первую очередь нужно настроить дисплей: откуда будет идти отсчет символов и в какую сторону, как будет вести себя курсор и т.п. После этого уже можно будет передавать дисплею информацию для вывода. Особенность в том, что мы можем использовать только 4 бита для передачи информации, т.е. данные необходимо разбивать на две части. Данные хранятся в старших битах (4-7), а младшие биты используются для указания того, будет ли включена подсветка (3 бит), приходят ли данные для вывода или же настройки работы дисплея (вывод RS, 0 бит), и 2 бит, по изменению которого происходит считывание, т.е чтобы отправить 1 байт данных необходимо отправить 4 байта – 1й байт будет содержать 4 бита информации, 2й бит в состояние 1, 2й байт это повторение 1-го, только уже 2й бит в состояние 0. 3й и 4й байт аналогично, только там содержится вторая половина данных. Звучит немного непонятно, покажу на примере:

Разберем все по порядку. В начале идут переменные, хранящие в себе адрес дисплея, и биты настроек, которые необходимо отправлять каждый раз вместе с данными. В функции отправки мы в первую очередь проверяем, есть ли по записанному адресу модуль. В случае получения сообщения HAL_OK начинаем формировать байты для отправки. В начале байт, который мы будем отправлять, необходимо разделить на две части, оба из них записать в старшие биты. Допустим, мы хотим, чтобы дисплей отобразил символ ‘s’, в двоичной системе это 1110011 (калькулятор). С помощью логической операции & мы записываем в переменную up = 01110000, т.е. записываем только старшие биты. Младшие биты в начале сдвигаются влево на 4 символа, а потом записываются в переменную lo = 00110000. Дальше мы формируем массив из 4 байт, которые содержат информацию о символе, который необходимо вывести. Теперь к существующим байтам приписываем биты конфигурации (0-3 биты). После этого отправляем байт адреса и 4 байта информации на дисплей с помощью функции HAL_I2C_Master_Transmit();

Читайте также: Кордовые заплатки для ремонта шин размеры

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

Эти команды поместим перед началом бесконечного цикла, чтобы настройки отправлялись единожды перед началом работы (как void setup у ардуинки). Функция I2C_send помимо байта требует указать, будут отправляться настройки дисплея или же данные. Если второй аргумент функции 0, то настройки, а если 1, то данные.

И последний штрих – нужна функция, которая будет отправлять сроку посимвольно. Тут все довольно просто:

Собрав все эти функции воедино можно написать:

Жк дисплеи с шиной

Отлично, с дисплеем 1602 разобрались, теперь 2004. Разница между ними минимальная, даже этот код будет отлично работать. Все отличие сводится к организации адресов ячеек на дисплее. В обоих дисплеях память содержит 80 ячеек, в дисплее 1602 первые 16 ячеек отвечают за первую строчку, а за вторую строчку отвечают ячейки с 40 по 56. Остальные ячейки памяти на дисплей не выводятся, поэтому, если отправить на дисплей 17 символов, последний не перенесется на вторую строчку, а будет записан в ячейку памяти, не имеющую выхода на дисплей. Чуть более наглядно, память устроена так:

Жк дисплеи с шиной

Для перевода строки я пользовался командой I2C_send(0b11000000,0);, она просто переходит к 40 ячейке. В дисплее 2004 все поинтереснее.

Первая строка — ячейки с 1 по 20
Вторая строка — ячейки с 40 по 60
Третья строка — ячейки с 21 по 40
Четвертая строка — ячейки с 60 по 80,
т.е. если отправить команду

Жк дисплеи с шиной

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

Видео:ЛУЧШИЙ ЭКРАН ДЛЯ АРДУИНО ARDUINO TFT LCD 1.44 SPI 128Х128 ЗА $3!Скачать

ЛУЧШИЙ ЭКРАН ДЛЯ АРДУИНО ARDUINO TFT LCD 1.44 SPI 128Х128 ЗА $3!

Жк дисплеи с шиной

На этом пожалуй все с этими дисплеями, полезные ссылки, благодаря которым я смог во всем этом разобраться:

  1. Код во многом посмотрел вот тут
  2. Таблицы для конфигурации дисплея смотрел тут
  3. Порядок действий смотрел тут

Программа и datasheet

Панель оператора (HMI) с шиной I2C для Arduino

В рамках работы с неким ардуино-совместимым оборудованием(о нем в конце) понадобился мне экран с кнопками для управления и отображения текущей информации. То есть, была нужна панель оператора, она же HMI.

Решено было сделать HMI самостоятельно, а в качестве интерфейса использовать «квадратную» шину i2c.

Жк дисплеи с шиной

Если интересен процесс разработки и программирования подобных девайсов, добро пожаловать под кат.

  • Дисплей 1602, монохромный 16х2 символов
  • 5 кнопок: вверх, вниз, отмена, ввод, редактирование(edit)
  • Интерфейс i2c
  • Разъем подключения DB9F
  • Размеры 155х90х44 мм

Тут возникнут очевидные вопросы:

Жк дисплеи с шиной

Конечно, можно было у тех же китайцев купить готовый шилд c дисплеем и клавиатурой и типа такого:

К этому шилду можно припаять 2 платки FC-113 и получится функционально то же самое, что и у меня: дисплей с клавиатурой, работающие по i2c. Цена набора составит от 4$.

Но на этой плате меня не устраивает размер кнопок, а мне хотелось большие, с возможностью установки разноцветных колпачков. Подключать Arduino к HMI мне хотелось не на соплях, а через нормальный разъем DB9F, а значит нужно было делать соединительную плату. А в этом случае какая разница, делать одну плату или две? Кроме того, у меня уже было в запасе несколько дисплеев 1602, а потому мне нужно было потратить всего 1.02$ для покупки на Алиэкспресс платы FC-113 (0.55$) и расширителя портов PCF8574P (0.47$).

Ну а самое главное- если имеешь дело с Ардуино, то самостоятельное изготовление шилдов для него это само собой разумеющееся дело, правда ведь?

В сфере АСУ ТП, где я работаю, HMI для связи с устройствами используют интерфейсы цифровой передачи данных RS-232,RS-485, CAN и т.д. Поэтому для меня логично, что моя самодельная HMI будет вся работать по интерфейсу передачи данных, в данном случае по i2c.

Если бы я смастерил устройство, где дисплей работает по квадратной шине, а кнопки идут напрямую на входа Ардуино, это бы вызывало у меня чувство глубокого неудовлетворения. Как представлю эту картину: из панели торчит отдельно шнурок на интерфейс, отдельно провода на входа, брррр…

Кроме того, различие между платой кнопок, которые идут напрямую ко входам Ардуино, и платой кнопок с интерфейсом i2c, заключается только в микросхеме PCF8574P(0.47$), конденсаторе и двух резисторах.

Кнопки у меня слева направо имеют такие функции: вверх, вниз, отмена, ввод, редактирование.
Кнопка «редактирование» отнесена от остальных чуть в сторону для акцентирования своей функции- изменение значений логических параметров(вкл/выкл) или переход в режим редактирования в случае параметров числовых.

Читайте также: Юттд шин тсукими галерея

Всего кнопок 5, хотя микросхема на плате клавиатуры позволяет подключить до 8 штук.
Достаточно было бы обойтись четырьмя кнопками и функционал бы не пострадал- «ввод» и «редактирование» можно совместить в одной кнопке. Но мне просто жалко стало, что из 8 ног микросхемы расширителя порта половина будет не задействована.
Еще отдельная кнопка «редактирование» может быть полезна, если я решу в одной строке выводить несколько параметров. Тогда этой кнопкой можно будет переключаться между параметрами, указывая, какой именно из них нужно изменить. Примерно так работает кнопка «SET» в популярных китайских HMI OP320.

Если первые две кнопки означают вверх и вниз, то почему бы их не разместить вертикально, как, например, сделано в указанном выше китайском шилде?

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

Железо

Видео:LCD дисплей 128х64 на ST7920Скачать

LCD дисплей 128х64 на ST7920

Жк дисплеи с шиной

Жк дисплеи с шиной

1. Самодельная соединительная плата с разъемом DB9F. Так, как питание +5V для расширителей портов и дисплея берем с Ардуино, на плате поставил предохранитель 0.1 А.

2. Всем нам хорошо известный дисплей 1602 с припаянной платой FC-113, которая подключает дисплей к шине i2c.

3. Самодельная клавиатурная плата с микросхемой PCF8574P, которая будет читать состояния кнопок и передавать их по шине i2c. Кстати, «дисплейная» плата FC-113 тоже основана на микросхеме PCF8574, только с индексом T, т.е. планарная, а не DIP, как PCF8574P.

Кнопки я поставил 12х12мм с квадратным толкателем- на них можно надеть большие разноцветные колпачки.

Жк дисплеи с шиной

Жк дисплеи с шиной

Жк дисплеи с шиной

Стоит сказать пару слов про микросхему PCF8574P, на основе которой я сделал клавиатурную плату.
PCF8574P это расширитель портов с интерфейсом i2c. Всего в нем 8 портов, каждый из которых можно сконфигурировать на работу в качестве входа или выхода. Для этой микросхемы и обвязки как таковой не требуется(вспомните, к примеру, max232), я только на всякий случай поставил конденсатор по питанию.

Адрес микросхемы PCF8574P задается с помощью адресных ног A0, A1, A2, которые подтягивают к земле или к питанию через резистор 10 кОм.

На клавиатурной плате я все адресные ноги PCF8574P поставил на землю, поэтому адрес жестко настроен как 0x20 и поменять его нельзя.

Как я уже писал, в качестве разъема для HMI я выбрал DB9F. На него от Ардуино поступают сигналы +5 V, GND, SDA, SCL.

Жк дисплеи с шиной

Провод для связи по i2c Ардуино и HMI сделал длинной 1.4 м, работает без глюков.

Платы нарисовал в Sprint Layout 6, методом ЛУТ перенес на текстолит и вытравил в растворе перекиси и лимонной кислоты.

В сети есть много рецептов травления лимонной кислотой плат на фольгированном стеклотекстолите.

Я делал такой раствор: 100 мл перекиси водорода 3%, 50 г лимонной кислоты, 3 чайные ложки соли. Баночку с перекисью подогрел в кастрюле с водой до температуры где-то 70 градусов.

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

Жк дисплеи с шиной

Потом процесс стихает. Переворачиваем плату.

Видео:Графический дисплей на контроллере ST7920. Подключаем к Stm32. Практикуемся с шиной SPI.Скачать

Графический дисплей на контроллере ST7920. Подключаем к Stm32. Практикуемся с шиной SPI.

Жк дисплеи с шиной

Жк дисплеи с шиной

Корпус сделал у друга из оргстекла 4 мм на станке лазерной резки.

Купить готовый корпус или сделать самому? Немного подумав, решил делать сам. Те, что видел в продаже, мне не подходили или по цене, или по эстетическим соображениям, или были на DIN-рейку, что тоже меня не устраивало.

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

Обратился за помощью и друг не отказал- за пару минут лазером нарезали деталей.

Пользуясь случаем, хочу сказать, спасибо тебе, Коля! Иначе мне пришлось бы еще целый день пилить и шлифовать фанеру, а результат едва бы был таким блистательным.

Программирование

С точки зрения Ардуино, данная HMI представляет из себя 2 устройства, которые работают по шине i2c: дисплей(LCD) с адресом 0x27 и клавиатура с адресом 0x20. Соответственно, работать Arduino будет отдельно с клавиатурой и отдельно с LCD.

Работа с LCD осуществляется через специальную библиотеку «LiquidCrystal_I2C.h», ее нужно установить в Aduino IDE.

Работа с клавиатурой осуществляется через стандартную библиотеку «Wire.h», которая изначально имеется в Aduino IDE.

Жк дисплеи с шиной

1. Для начала проверим, видит ли Ардуино наш HMI. Для этого загружаем в нее программу, которая будет сканировать шину i2c на предмет нахождения на ней устройств.

Во время выполнения этой программы, Ардуино будет писать результаты сканирования шины i2c в последовательный порт. Для просмотра этих данных, в Arduino IDE заходим Инструменты-> Монитор порта.

Читайте также: Размеры шин рено кенго

Жк дисплеи с шиной

Видим, что Ардуино на шине i2c определило два устройства с адресами 0x20 и 0x27, это клавиатура и LCD соответственно.

2. Теперь посмотрим, как работает наша клавиатура. Создадим программу, которая будет опрашивать состояние кнопок и выводить его на LCD.

Жк дисплеи с шиной

3. Наконец можно переходить к тому, ради чего все затевалось- созданию многоуровневого меню в Ардуино. Через меню будем не только смотреть информацию, но и управлять выходами самого Ардуино.

Жк дисплеи с шиной

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

Видео:1.8" TFT LCD Display module ST7735S 128x160, ОбзорСкачать

1.8" TFT LCD Display module ST7735S 128x160, Обзор

Получилась у меня очередная вариация древовидного меню. Меню позволяет выводить в каждой строке одновременно статический текст и значение переменной. Например, можно вывести название параметра и его значение.

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

Параметры можно изменять нажатием кнопки «Edit». Причем, в теге каждого параметра указывается, доступен ли он для редактирования или только для чтения. Если текущий параметр только для чтения, в начале строки указатель будет ‘*’, если редактирование параметра разрешено, указатель станет ‘+’.

LCD 1602 и языковой вопрос

Отдельно нужно затронуть вопрос русификации.

В знакогенераторе некоторых LCD 1602 нет русских букв, а вместо них прошиты японские кракозябры. Перепрошить знакогенератор невозможно. Поэтому придется или писать на экране слова латинскими буквами, или в программе формировать русские буквы самому, т.к. в LCD 1602 есть возможность создавать и хранить в ОЗУ LCD собственные символы. Но, в последнем случае, можно выводить на экран не больше восьми «самодельных» символов за раз.

В принципе, нет ничего страшного, если писать на LCD русские слова английскими буквами. Вон, даже почтенная французская компания Shneider Electric(та самая, что еще до революции продавала гаубицы царю) за полтора десятилетия не сподобилась внедрить в свои знаменитые программируемые реле Zelio русский язык. Но это не мешает активно торговать ими на просторах всего СНГ. Причем, канальи, испанский и португальский языки ввели.

На многих наших заводах эти Zelio общаются с персоналом фразами типа «NASOS 1 VKL».

Когда непонятно, есть ли русские буквы в конкретном LCD, нужно вывести на экран все символы его знакогенератора. Если кириллица есть, она начинается со 160 позиции.

Но даже если ваш LCD 1602 русифицирован, вывести на экран русские слова не так просто. По крайней мере, используя библиотеку «LiquidCrystal_I2C.h» при работе с LCD по шине i2c.

Если просто выводить русский текст, например инструкцией lcd.print(«Привет. »), то вместо «Привет. » на экране появится какая-то белиберда.

Это потому, что русские буквы Arduino IDE переводит в двухбайтный код UTF-8, а в LCD все символы однобайтные.

Та же проблема, кстати, наблюдается при передаче русских текстов из Ардуино в монитор порта Arduino IDE. Ардуино передает в последовательный порт русские буквы в двухбайтной кодировке UTF-8, а монитор порта Arduino IDE пытается их читать в однобайтной кодировке Windows-1251 (cp1251). Хотя cp1251 тоже 8-битная, как и кодировка LCD 1602, но с ней не совпадает.

Можно формировать русские тексты через коды символов. К примеру, строку ‘ЖК дисплей’ на русифицированный LCD получится вывести так:

Но мне такой подход не нравится.

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

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

На этом про самодельную HMI с шиной i2c у меня все.

Ах да, в начале статьи я писал, что делаю HMI не совсем для Ардуино, а для ардуино-совместимого оборудования. Это я про ПЛК CONTROLLINO MAXI, который программируется из среды Arduino IDE (и многих других).

Жк дисплеи с шиной

CONTROLLINO MAXI это фактически Arduino + куча шилдов и все оформлено как промышленный ПЛК. Но про него в следующий раз.

→ Архив со схемами, скетчами и печатной платой в формате lay6
→ Ардуино-совместимый ПЛК СONTROLLINO, работа с которым вдохновила на создание HMI i2c
→ Расширитель портов PCF8574 и подключение его к Arduino
→ Плата FC-113 для работы LCD 1602 по шине i2c и подключение ее к Arduino
→ Многоуровневое древовидное меню, общие принципы создания на Си
→ Кодировка UTF-8
→ Кодировка Windows-1251

Видео:Подключение дисплея 1602 lcd i2c. 1602 ардуино дисплейСкачать

Подключение дисплея 1602 lcd i2c. 1602 ардуино дисплей
  • Свежие записи
    • Нужно ли менять пружины при замене амортизаторов
    • Скрипят амортизаторы на машине что делать
    • Из чего состоит стойка амортизатора передняя
    • Чем стянуть пружину амортизатора без стяжек
    • Для чего нужны амортизаторы в автомобиле


    📹 Видео

    LCD дисплей LCM1602A-14, I2C и SPIСкачать

    LCD дисплей LCM1602A-14, I2C и SPI

    Текстовые LCD дисплей на контроллере HD44780, Уроки ArduinoСкачать

    Текстовые LCD дисплей на контроллере HD44780, Уроки Arduino

    Шина I2C. Подключаем LCD дисплей к ArduinoСкачать

    Шина I2C. Подключаем LCD дисплей к Arduino

    Вот почему OLED и AMOLED дисплеи — худшие на рынке! 🤢🤮Скачать

    Вот почему OLED и AMOLED дисплеи — худшие на рынке! 🤢🤮

    ЖК дисплеиСкачать

    ЖК дисплеи

    Инверсия монохромного дисплеяСкачать

    Инверсия монохромного дисплея

    Миниатюрный ЖК дисплей для часиков и не толькоСкачать

    Миниатюрный ЖК дисплей для часиков и не только

    Подключение дисплея LCD12864B на ST7920 к Arduino по SPIСкачать

    Подключение дисплея LCD12864B на ST7920 к Arduino по SPI

    Дисплей LCD 1602 с шиной I2CСкачать

    Дисплей LCD 1602 с шиной I2C

    Сколько Будет Стоить САМОДЕЛЬНЫЙ LCD Пиксель на Жидких Кристаллах?Скачать

    Сколько Будет Стоить САМОДЕЛЬНЫЙ LCD Пиксель на Жидких Кристаллах?

    Ремонт дисплея за 5 минут и без вложенийСкачать

    Ремонт дисплея за 5 минут и без вложений

    Ремонт ( ВСЕХ ) LCD дисплея тестера Мультиметра или калькулятора и их аналоговСкачать

    Ремонт ( ВСЕХ ) LCD дисплея тестера  Мультиметра  или калькулятора и их аналогов

    Восстановление ЖК экрана!! БЕЗ РАЗБОРКИ, БЕЗ ИНСТРУМЕНТА! Как вернуть к жизни неработающие сегменты.Скачать

    Восстановление ЖК экрана!! БЕЗ РАЗБОРКИ, БЕЗ ИНСТРУМЕНТА! Как вернуть к жизни неработающие сегменты.

    ЖК дисплей подключениеСкачать

    ЖК дисплей подключение
Поделиться или сохранить к себе:
Технарь знаток