Меню

Lcd shield i2c сделай сама

LCD дисплей – частый гость в проектах ардуино. Но в сложных схемах у нас может возникнуть проблема недостатка портов Arduino из-за необходимости подключить экран, у которого очень очень много контактов. Выходом в этой ситуации может стать I2C /IIC переходник, который подключает практически стандартный для Arduino экран 1602 к платам Uno, Nano или Mega всего лишь при помощи 4 пинов. В этой статье мы посмотрим, как можно подключить LCD экран с интерфейсом I2C, какие можно использовать библиотеки, напишем короткий скетч-пример и разберем типовые ошибки.

Жидкокристаллический дисплей (Liquid Crystal Display) LCD 1602 является хорошим выбором для вывода строк символов в различных проектах. Он стоит недорого, есть различные модификации с разными цветами подсветки, вы можете легко скачать готовые библиотеки для скетчей Ардуино. Но самым главным недостатком этого экрана является тот факт, что дисплей имеет 16 цифровых выводов, из которых обязательными являются минимум 6. Поэтому использование этого LCD экрана без i2c добавляет серьезные ограничения для плат Arduino Uno или Nano. Если контактов не хватает, то вам придется покупать плату Arduino Mega или же сэкономить контакты, в том числе за счет подключения дисплея через i2c.

Давайте посмотрим на выводы LCD1602 повнимательней:

Каждый из выводов имеет свое назначение:

  1. Земля GND;
  2. Питание 5 В;
  3. Установка контрастности монитора;
  4. Команда, данные;
  5. Записывание и чтение данных;
  6. Enable;

Технические характеристики дисплея:

  • Символьный тип отображения, есть возможность загрузки символов;
  • Светодиодная подсветка;
  • Контроллер HD44780;
  • Напряжение питания 5В;
  • Формат 16х2 символов;
  • Диапазон рабочих температур от -20С до +70С, диапазон температур хранения от -30С до +80 С;
  • Угол обзора 180 градусов.

Стандартная схема присоединения монитора напрямую к микроконтроллеру Ардуино без I2C выглядит следующим образом.

Из-за большого количества подключаемых контактов может не хватить места для присоединения нужных элементов. Использование I2C уменьшает количество проводов до 4, а занятых пинов до 2.

LCD экран 1602 (и вариант 2004) довольно популярен, поэтому вы без проблем сможете найти его как в отечественных интернет-магазинах, так и на зарубежных площадках. Приведем несколько ссылок на наиболее доступные варианты:

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

I2C / IIC(Inter-Integrated Circuit) – это протокол, изначально создававшийся для связи интегральных микросхем внутри электронного устройства. Разработка принадлежит фирме Philips. В основе i2c протокола является использование 8-битной шины, которая нужна для связи блоков в управляющей электронике, и системе адресации, благодаря которой можно общаться по одним и тем же проводам с несколькими устройствами. Мы просто передаем данные то одному, то другому устройству, добавляя к пакетам данных идентификатор нужного элемента.

Самая простая схема I2C может содержать одно ведущее устройство (чаще всего это микроконтроллер Ардуино) и несколько ведомых (например, дисплей LCD). Каждое устройство имеет адрес в диапазоне от 7 до 127. Двух устройств с одинаковым адресом в одной схеме быть не должно.

Плата Arduino поддерживает i2c на аппаратном уровне. Вы можете использовать пины A4 и A5 для подключения устройств по данному протоколу.

В работе I2C можно выделить несколько преимуществ:

  • Для работы требуется всего 2 линии – SDA (линия данных) и SCL (линия синхронизации).
  • Подключение большого количества ведущих приборов.
  • Уменьшение времени разработки.
  • Для управления всем набором устройств требуется только один микроконтроллер.
  • Возможное число подключаемых микросхем к одной шине ограничивается только предельной емкостью.
  • Высокая степень сохранности данных из-за специального фильтра подавляющего всплески, встроенного в схемы.
  • Простая процедура диагностики возникающих сбоев, быстрая отладка неисправностей.
  • Шина уже интегрирована в саму Arduino, поэтому не нужно разрабатывать дополнительно шинный интерфейс.
  • Существует емкостное ограничение на линии – 400 пФ.
  • Трудное программирование контроллера I2C, если на шине имеется несколько различных устройств.
  • При большом количестве устройств возникает трудности локализации сбоя, если одно из них ошибочно устанавливает состояние низкого уровня.

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

С одной стороны модуля мы видим выводы i2c – земля, питание и 2 для передачи данных. С другой переходника видим разъемы внешнего питания. И, естественно, на плате есть множество ножек, с помощью которых модуль припаивается к стандартным выводам экрана.

Для подключения к плате ардуино используются i2c выходы. Если нужно, подключаем внешнее питание для подстветки. С помощью встроенного подстроечного резистора мы можем настроить настраиваемые значения контрастности J

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

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

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

Жидкокристаллический монитор с поддержкой i2c подключается к плате при помощи четырех проводов – два провода для данных, два провода для питания.

  • Вывод GND подключается к GND на плате.
  • Вывод VCC – на 5V.
  • SCL подключается к пину A5.
  • SDA подключается к пину A.

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

Для взаимодействие Arduino c LCD 1602 по шине I2C вам потребуются как минимум две библиотеки:

  • Библиотека Wire.h для работы с I2C уже имеется в стандартной программе Arduino IDE.
  • Библиотека LiquidCrystal_I2C.h, которая включает в себя большое разнообразие команд для управления монитором по шине I2C и позволяет сделать скетч проще и короче. Нужно дополнительно установить библиотеку После подключения дисплея нужно дополнительно установить библиотеку LiquidCrystal_I2C.h

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

Описание функций и методов библиотеки LiquidCrystal_I2C:

  • home() и clear() – первая функция позволяет вернуть курсор в начало экрана, вторая тоже, но при этом удаляет все, что было на мониторе до этого.
  • write(ch) – позволяет вывести одиночный символ ch на экран.
  • cursor() и noCursor() – показывает/скрывает курсор на экране.
  • blink() и noBlink() – курсор мигает/не мигает (если до этого было включено его отображение).
  • display() и noDisplay() – позволяет подключить/отключить дисплей.
  • scrollDisplayLeft() и scrollDisplayRight() – прокручивает экран на один знак влево/вправо.
  • autoscroll() и noAutoscroll() – позволяет включить/выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
  • leftToRight() и rightToLeft() – Установка направление выводимого текста – слева направо или справа налево.
  • createChar(ch, bitmap) – создает символ с кодом ch (0 – 7), используя массив битовых масок bitmap для создания черных и белых точек.

В некоторых случаях при использовании указанной библиотеки с устройствами, оснащенными контроллерами PCF8574 могут возникать ошибки. В этом случае в качестве альтернативы можно предложить библиотеку LiquidCrystal_PCF8574.h. Она расширяет LiquidCrystal_I2C, поэтому проблем с ее использованием быть не должно.

Скачать библиотеку можно на нашем сайте. Библиотека также встроена в последние версии Arduino IDE.

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

Во-первых, можно увеличить или уменьшить контрастность монитора. Часто символы просто не видны из-за режима контрастности и подсветки.

Если это не помогло, то проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный i2c переходник, то проверьте еще раз качество пайки контактов.

Другой часто встречающейся причиной отсутствия текста на экране может стать неправильный i2c адрес. Попробуйте сперва поменять в скетче адрес устройства с 0x27 0x20 или на 0x3F. У разных производителей могут быть зашиты разные адреса по умолчанию. Если и это не помогло, можете запустить скетч i2c сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора. Пример скетча i2c сканера.

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

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

источник

LCD Keypad Shield – одна из самых популярных плат расширения для ардуино. Она может существенно упростить работу с жидкокристаллическими экранами, позволяя разработчику сосредоточиться на других задачах. В этой статье мы рассмотрим шилд LCD Keypad Shield для дисплея TC 1602 со встроенными 5 управляющими кнопками. Узнаем, как работает эта плата, как ее можно подключить к ардуино, рассмотрим несколько примеров скетчей в реальных проектах. Если вы не знаете, что такое шилд, то можете предварительно прочитать статью о платах расширениях и шилдах ардуино.

Рассматриваемый шилд представляет собой плату с встроенными модулями индикации и управления. Индикация осуществляется с помощью LCD-дисплея TC1602, управление – через встроенные кнопки. Есть возможность регулировки яркости дисплея прямо на плате с помощью подстроечного резистора. Плата снабжена разъемами, в которые могут быть подключены другие устройства, например, датчики. Для работы с экраном используются пины 4-10, для определения нажатия кнопок – только один аналоговый пин A0. Свободными являются цифровые пины 0-3, 11-13 и аналоговые пины A1-A5.

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

  • Тип дисплея: LCD 1602, символьный, 4-х битный режим.
  • Разрешение: 16×2 (две строки по 16 символов каждая). Знакоместо 5×8 точек.
  • Цвет дисплея: синий (возможны варианты с желтым и зеленым цветом). Буквы белого цвета.
  • Технология: STN, Transflective, Positive.
  • Контроллер дисплея: HD44780U.
  • Предельная частота обновления экрана: 5Гц
  • Питание дисплея: 5 Вольт
  • Кнопки: 6 кнопок (5 кнопок управления и Reset).
  • Дополнительные элементы: регулировка яркости подсветки (потенциометр).
  • Рабочая температура экрана: от -20 °С до +70 °С;
  • Температура хранения экрана: от -30 °С до +80 °С.
Контакт дисплея LCD 1602 Описание Контакт на LCD Shield
Пины LCD экрана
GND Земля
VDD Питание 5В
Contrast Управление контрастом Потенциометр
RS Команды/Данные 8
R/W Чтение/Запись
Enable Включение (активирование) 9
DB0 Не используется
DB1 Не используется
DB2 Не используется
DB3 Не используется
DB4 Дата 1 4
DB5 Дата 2 5
DB6 Дата 3 6
DB7 Дата 4 7
Back LED + Включение подсветки 10
Back LED – Питание подсветки
Пины для кнопок
Кнопка UP Управляющая кнопка A0
Кнопка DOWN Управляющая кнопка A0
Кнопка LEFT Управляющая кнопка A0
Кнопка RIGHT Управляющая кнопка A0
Кнопка SELECT Управляющая кнопка A0
Reset Перезагрузка платы Reset
ICSP ICSP для перепрошивки встроенного микроконтроллера HD44780U
UART Контакты для UART соединения 0, 1
Читайте также:  Как сделать самому вилочный погрузчик
  • Индикаторный светодиод (включается при подключении питания к плате).
  • Контактные площадки для подключения аналоговых устройств (GND, VSS, пин данных).
  • Потенциометр для регулирования контрастностью экрана.

Подключение шилда очень простое – нужно попасть ножками в соответствующие разъемы платы ардуино и аккуратно совместить их. Ничего дополнительно подсоединять или припаивать не надо. Нужно помнить и учитывать тот факт, что часть пинов зарезервированы для управления дисплеем и кнопками и не может быть использована для других нужд! Для удобства подключения дополнительного оборудования на плате выведены дополнительные разъемы 5В и GND к каждой контактной площадке аналоговых пинов. Это, безусловно, упрощает работу с датчиками. Также можно подключать цифровые устройства через свободные пины 0-3 и 11-13. Подключив шилд, мы можем работать с экраном и кнопками на нем так же, как с отдельными устройствами, учитывая только номера пинов, к которым припаяны соответствующие контакты.

Для работы с LCD экранами обычно используют популярную библиотеку LiquidCrystal . На этапе инициализации создается объект класса LiquidCrystal, в конструкторе которого мы указываем пины с подключенными контактами экрана. Для нашего шилда требуется использовать такой вариант: LiquidCrystal lcd(8, 9, 4, 5, 6, 7); Последовательность аргументов конструктора:

Ничего сложного в работе с объектом нет. В setup() мы инициализируем объект, указывая ему количество символов и строк:

Для вывода информации на дисплей используем метод print():

Текст выведется в место текущего нахождения курсора (в начале работы скетча это первая строка и первый символ). Для указания произвольного положения курсора можно использовать функцию setCursor( , ):

На плате присутствуют пять управляющих кнопок, работа с которыми ведется через один аналоговый пин A0. В шилде использован достаточно распространенный способ простого кодирования сигнала, при котором каждая кнопка формирует определенное значение напряжения, которое после АЦП преобразуется в соответствующее значение от 0 до 1023. Таким образом, мы можем передавать информацию о нажатии разных кнопок через один пин, считывая его при помощи функции analogRead();

Значения уровня сигнала на пине A0 в зависимости от выбранной кнопки:

Нажатие кнопки Значение на аналоговом пине
RIGHT 0-100
UP 100-200
DOWN 200-400
LEFT 400-600
SELECT 600-800
Клавиша не нажата 800-1023

Пример скетча работы с кнопками LCD Keypad Shield:

В выбранном методе кодирования есть два главных недостатка:

  • Нельзя отслеживать одновременное нажатие нескольких кнопок;
  • Возможные искажения сигнала могут привести к ложным срабатываниям.

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

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

Плата расширения LCD Keypad достаточно популярная, она проста и удобна для использования в проектах Arduino. Сегодня ее можно легко купить практически в любом интернет-магазине.

  • Упрощает подключение жидкокристаллического экрана.
  • Уменьшает общие размеры устройства, т.к. убирает выступающие провода и монтажные платы.
  • Сокращает количество ошибок, связанных с неправильным монтажом и подключением.
  • Добавляет функциональность кнопочного управления, если на плате установлены кнопки (LCD Keypad shield).
  • Стоимость шилда выше, чем стоимость отдельного экрана.
  • Не всегда нужна дополнительная функциональность в виде кнопок.
  • Шилд потребляет больше энергии, чем отдельные элементы платы.

источник

Текстовый экран 16×2 пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.

Дисплей MT-16S2H предназначен для вывода текста на латинице и кириллице.

Экран имеет 16 контактов для питания логики, взаимодействия с управляющей электроникой и подсветки.

Вывод Обозначение Описание
1 GND Общий вывод (земля)
2 Vcc Напряжение питания (3,3—5 В)
3 Vo Управление контрастностью
4 RS Выбор регистра
5 R/W Выбор режима записи или чтения
6 E Разрешение обращений к индикатору (а также строб данных)
7 DB0 Шина данных (8-ми битный режим)(младший бит в 8-ми битном режиме)
8 DB1 Шина данных (8-ми битный режим)
9 DB2 Шина данных (8-ми битный режим)
10 DB3 Шина данных (8-ми и 4-х битные режимы)(младший бит в 4-х битном режиме)
11 DB4 Шина данных (8-ми и 4-х битные режимы)
12 DB5 Шина данных (8-ми и 4-х битные режимы)
13 DB6 Шина данных (8-ми и 4-х битные режимы)
14 DB7 Шина данных (8-ми и 4-х битные режимы)
15 +LED + питания подсветки
16 –LED – питания подсветки

Дисплей может работать в двух режимах:

Использовать восьмибитный режим не целесообразно. Для его работы требуется на 4 дополнительные ноги, а выигрыша по скорости практически нет.

В качестве примера подключим дисплей к управляющей плате Arduino Uno. Для подключения понадобится Breadboard Half и соединительные провода «папа-папа».

Вывод Обозначение Пин Arduino Uno
1 GND GND
2 Vcc 5V
3 Vo GND
4 RS 12
5 R/W GND
6 E 11
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4 5
12 DB5 4
13 DB6 3
14 DB7 2
15 Vcc 5V
16 GND GND

Аналогично можно подключить дисплей к платформе Iskra JS.

Вывод Обозначение Пин Iskra JS
1 GND GND
2 Vcc 5V
3 Vo GND
4 RS P12
5 R/W GND
6 E P11
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4 P5
12 DB5 P4
13 DB6 P3
14 DB7 P2
15 Vcc 5V
16 GND GND

Для упрощения работы с LCD-дисплеем используйте встроенную библиотеку Liquid Crystal. В ней вы найдёте примеры кода с подробными комментариями.

Библиотека подходит как для работы с контроллерами на AVR-платформе, так и с ARM-контроллерами.

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

Существует два способа вывода кириллицы на текстовые дисплеи:

Рассмотрим оба способа более подробно.

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

Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:

Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x , он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона 0-9 и A-F следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две записанные рядом строки склеиваются.

Сравните две строки кода для вывода надписи «Яeee»:

Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:

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

Дисплей не может одновременно отображать символы разных страниц.

Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Полную таблицу символов с кодами можно найти в документации к экрану.

Совсем не обязательно мучатся со знакогенератором, чтобы вывести русский символ. Для решения проблемы скачайте и установите библиотеку LiquidCrystalRus.

Это копия оригинальной библиотеки LiquidCrystal с добавлением русского языка. Добавленный в библиотеку код трансформирует русские символы UTF8 в правильные коды для текстового экрана.

В качестве примера выведем фразу «Привет, Амперка» на дисплей.

Для работы с LCD-дисплеем из среды Espruino существует библиотека HD44780.

Для вывода программы приветствия, воспользуйтесь скриптом:

Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.

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

Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:

Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x , он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона 0–9 и A–F следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.

Сравните две строки кода для вывода надписи «Яeee»:

Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:

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

Дисплей не может одновременно отображать символы разных страниц.

Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Полную таблицу символов с кодами можно найти в документации к экрану.

Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».

источник

Текстовый экран 16×2 (I²C) пригодится для вывода показаний датчиков, отображения простых меню, подсказок и приветствий.

Дисплей MT-16S2H-I предназначен для вывода текста на латинице и кириллице.

Экран имеет 18 контактов для питания логики, взаимодействия с управляющей электроникой и подсветки.

Вывод Обозначение Описание
1 GND Общий вывод (земля)
2 Vcc Напряжение питания (3,3—5 В)
3 Vo Управление контрастностью
4 RS Выбор регистра
5 R/W Выбор режима записи или чтения
6 E Разрешение обращений к индикатору (а также строб данных)
7 DB0 Шина данных (8-ми битный режим)(младший бит в 8-ми битном режиме)
8 DB1 Шина данных (8-ми битный режим)
9 DB2 Шина данных (8-ми битный режим)
10 DB3 Шина данных (8-ми и 4-х битные режимы)(младший бит в 4-х битном режиме)
11 DB4 Шина данных (8-ми и 4-х битные режимы)
12 DB5 Шина данных (8-ми и 4-х битные режимы)
13 DB6 Шина данных (8-ми и 4-х битные режимы)
14 DB7 Шина данных (8-ми и 4-х битные режимы)
15 +LED + питания подсветки
16 –LED – питания подсветки
17 SDA Последовательная шина данных
18 SCL Последовательная линия тактированния

Дисплей может работать в трёх режимах:

Использовать восьмибитный и четырёхбитный режим в данном дисплее не целесообразно. Ведь главное достоинство этой модели именно возможность подключения через I²C. Если всё-таки есть необходимость использовать 4-битный или 8-битный режим, читайте документацию на текстовый экран 16×2.

В качестве примера подключим дисплей к управляющей плате Arduino Uno. Для подключения понадобится Breadboard Half и соединительные провода «папа-папа».

Вывод Обозначение Пин Arduino Uno
1 GND GND
2 Vcc 5V
3 Vo GND
4 RS
5 R/W
6 E
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4
12 DB5
13 DB6
14 DB7
15 +LED 5V
16 −LED GND
17 SDA SDA
18 SCL SCL

Аналогично можно подключить дисплей к платформе Iskra JS.

Для питания дисплея необходимо пять контактов. Но если запаять перемычки J3 и J4 на обратной стороне дисплея, количество контактов питания можно сократить до трёх, объединив цепь питания и подсветки дисплея.

Для упрощения работы с LCD-дисплеем используйте библиотеку LiquidCrystal_I2C. В ней вы найдёте и примеры кода с комментариями.

Библиотека подходит как для работы с контроллерами на AVR-платформе, так и с ARM-контроллерами.

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

Существует способ вывода кириллицы на текстовые дисплеи с помощью таблицы знакогенератора.

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

Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:

Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x , он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона 0-9 и A-F следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.

Сравните две строки кода для вывода надписи «Яeee»:

Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:

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

Дисплей не может одновременно отображать символы разных страниц.

Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Полную таблицу символов с кодами можно найти в документации к экрану.

Используя шину I²C можно подключить несколько дисплеев одновременно, при этом количество занятых пинов останется прежним.

Для общения с каждым дисплеем отдельно, необходимо установить в них разные адреса. Для смены адреса на обратной стороне дисплея установлены контактные площадки J0 , J1 и J2 .

Капнув припоем на контактные площадки, мы получим один из семи дополнительных адресов.

J2 J1 J0 Адрес
L L L 0x38
L L H 0x39
L H L 0x3A
L H H 0x3B
H L L 0x3C
H L H 0x3D
H H L 0x3E
H H H 0x3F

После физического смены адреса, подключите дополнительный дисплей параллельно к пинам I²C , а в коде программы инициализируйте работу с двумя дисплеями.

Для работы с LCD-дисплеем из среды Espruino существует библиотека HD44780.

Для вывода программы приветствия, воспользуйтесь скриптом:

Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.

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

Так букве Я соответствует код B1 в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности \x## встроить в строку код символа:

Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность \x , он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона 0–9 и A–F следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.

Сравните две строки кода для вывода надписи «Яeee»:

Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:

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

Дисплей не может одновременно отображать символы разных страниц.

Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

Полную таблицу символов с кодами можно найти в документации к экрану.

Используя шину I²C можно подключить несколько дисплеев одновременно, при этом количество занятых пинов останется прежним.

Для общения с каждым дисплеем отдельно, необходимо установить в них разные адреса. Для смены адреса на обратной стороне дисплея установлены контактные площадки J0 , J1 и J2 .

Капнув припоем на контактные площадки, мы получим один из семи дополнительных адресов.

J2 J1 J0 Адрес
L L L 0x38
L L H 0x39
L H L 0x3A
L H H 0x3B
H L L 0x3C
H L H 0x3D
H H L 0x3E
H H H 0x3F

После физического смены адреса, подключите дополнительный дисплей параллельно к пинам I²C , а в коде программы инициализируйте работу с двумя дисплеями.

Дисплей удобен для отображения показаний модулей и сенсоров. Сделаем задатки «Умного Дома», а именно «комнатный термометр».

источник

Опубликовано 27.07.2013 15:58:00

Плата улучшена. Смотрите Z-LCD I2C module (DIY).

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

Встречайте LCD I2C модуль своими руками

Данный модуль полностью совместим с заводским LCD I2C модулем для Ардуино, статья о подключении которого находится здесь.

Сразу приложу принципиальную схему.

Программный код работы с Arduino точно такой же, однако есть отличие в адресации к устройству. Микросхема PCF8574, на которой построен модуль, имеет 3 вывода (A0, A1, A2). В зависимости от того к чему подключены данные выводы (+ или -) будет изменяться и адрес устройства. В стандартном модуле нет возможности переключения, на всех выводах присутствует логическая единица и адрес устройства равен 0x27. В данном же модуле данная фишка учтена, на плате выведен джамперный блок для переключения. В зависимости от конфигурации джамперов мы можем получить до восьми различных адресов.

Далее приведу картинку зависимости адресов от состояния выводов A0, A1, A2

После разводки платы у микросхемы PCF8574 остались выводы, которые можно заюзать для программного регулирования яркости подсветки, в некоторых модулях это предусмотрено, однако программной реализации для Arduino я так и не нашел. Если вы обладаете иной информацией, то прошу поделиться. В связи с этим решение данной проблемы я решил очень топорно — связка биполярного транзистора и ШИМовка с еще одного вывода Дуньки. Сразу оговорюсь, эту опцию можно не использовать. На плате рядом с выводом подсветки (BL) находится дублирующий пин +5 вольт. Если вам не нужна регулировка, просто замкните данные выводы стандартным джампером 2.54мм и подсветка включится на полную.

BL — Black Light (подсветка)

+5V — +5V питание (дублирующее)

+5V — +5V питание

— минус питания

D — сокращение от SDA (целое название не помещалось, взяты вторые буквы из названий линий)

C — сокращение от SCL

Этот модуль станет первым девайсом в разделе DIY, который выполнен на двусторонней плате. Однако, как всегда, я постарался и сделал модуль легким в повторении: широкие дороги, смд компоненты большого типоразмера 1206. К тому же, хоть плата и двусторонняя, переходных отверстий как таковых в ней нет. В большинстве своем роли переходных отверстий выполняют ноги микросхемы и переменного резистора, однако в одном месте, все-же придется сделать подобие переходного отверстия.

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

Совет №1 — Как точно вы бы не сопоставили две стороны платы, для лучшего результата сверлить рекомендую с лицевой стороны.

Еще одной деталью, которая будет выполнять роль переходного отверстия, является гребенка выводов (A0, A1, A2). Её необходимо также запаять с двух сторон.

Совет №2 — Данную гребенку необходимо запаивать в первую очередь.

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

Все площадки на плате сделаны под типоразмер 1206, однако конденсатора нужного типоразмера под рукой не оказалось, заменил меньшим. Пусть это вас не смущает.

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

Как нужно обломать ножки показано на следующем рисунке.

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

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

Совет №3 — Во избежание замыкания модуля на дисплей, на соединительную гребенку необходимо добавить еще один слой пластиковых держателей. При одном слое модуль не встанет на дисплей.

В архиве лежит шаблон под ЛУТ и список деталей

Открываем изображение => Печать => Во всю страницу

Для облегчения распайки smd компонентов с обратной стороны платы, где нет маркировки, приведу картинку. Хочется отметить, что на smd конденсаторах нет маркировки номиналов, но для облегчения распайки на картинке я их нанес. 104 — 0,1 мкФ.

В данный момент еще реализованы не все элементы нашего сообщества. Мы активно работаем над ним и в ближайшее время возможность комментирования статей будет добавлена.

источник

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

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

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

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 градусов.

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

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

Корпус сделал у друга из оргстекла 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++, а для Ардуино даже видел какие-то библиотеки. Но я решил в своей программе написать меню самостоятельно. Во-первых, чем меньше левых библиотек в проекте, тем спокойнее. А во-вторых, это просто.

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

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

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

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

В знакогенераторе некоторых 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

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

источник