Вот и добрался я до подключения ЖК-индикатора. Без индикатора делать генератор, синтезатор, частотомер да и еще много чего невозможно. Можно, конечно, начать с светодиодных семисегментных индикаторов, но у меня в коробочке лежат аж 4 жк-индикатора и я решил начать с них.
Вначале немного о самих ЖК-индикаторах. Принцип их действия основан на изменении ориентации органических молекул под действием электрического поля. При этом изменяется их коллективная способность поворачивать плоскость поляризации проходящего через них света.
Поверхности пластин, обращенные к ЖК, полируются, чтобы молекулы ЖК в слоях, прилегающих к ним, ориентировались во взаимно перпендикулярных направлениях; в промежуточных слоях осуществляется постепенный поворот направлений ориентации. В отсутствие электрического поля свет в индикаторе следует за вращением молекул и на выходе индикатора плоскость его поляризации оказывается повернутой на 90°; свет проходит через индикатор. При наличии электрического поля ориентация молекул изменяется, плоскость поляризации света, проходящего через индикатор, не вращается и свет не проходит через индикатор.
Примером семисегментного многозначного индикатора является советский четырехзначный ИЖЦ5 - 4/8. У меня есть такой, выпущенный в 1992 году. При рассматривании под определенным углом можно легко различить электроды.
Этот индикатор можно назвать пассивным, так как он не имеет подсветки, но зато потребление энергии - порядка нескольких десятков микроампер. Их использовали при изготовлении измерительных приборов или электронных часов. Вот одна из схем таких часов.
Похожие индикаторы выпускаются до сих пор из-за их экономичности.
Гораздо большую гибкость в отображении символов имеют матричные жк-индикаторы, но за эту гибкость приходится платить сложностью управления.
Изображение складывается из пикселов, которые покрывают или всю поверхность индикатора или определенные знакоместа.
Вот такой индикатор, на котором можно сформировать две строчки по 16 символов, я и собрался подключить к Ардуино. Такие индикаторы можно купить как на Али (от 70р/шт), так и наши отечественные производства МЭЛТ (от 400р/шт). Кстати, китайские индикаторы в ЧИПе стоят от 350 руб.
Эти индикаторы имеют встроенные драйверы матрицы. Мне чаще встречались в разных статьях индикаторы с китайскими чипами HD44780 или совместимые с ними, а в отечественных - Ангстрем КБ1013ВГ6. Все эти индикаторы управляются по 8-ми или 4-х проводным линиям (на самом деле проводов соответственно 12 и 8), а кроме того есть такие же индикаторы, с дополнительными платками, позволяющими управлять индикатором по интерфейсу I2C, использующего всего 4 провода, включая провода питания.
Но мне пока I2C сложновато, нужно сначала попробовать что-то попроще, благо проводов хватает :).
Вот схема подключения ЖК-индикатора.
О назначении выводов индикатора: Vss - общий провод (GND), Vdd - питание + 5 В, Vo - регулировка контрастности (сюда подключается движок подстроечного резистора R1 (рис. 9)), RS - выбор режима, RW - чтение/запись (если он не используется, то соединить с общим проводом), Е - готовность данных, D0 - D7 -линии передачи данных, А - анод подсветки (соединяется с +5 В), К - катод подсветки (через подстроечный резистор R2 подключен к общему проводу). Имейте в виду, что собственно индикатор потребляет несколько мА, а вот подсветка кушает до 100 мА, поэтому ее уровень желательно регулировать.
А можно обойтись вообще без подсветки. Можно, но при этом знаки двоятся, если смотреть на них чуть сбоку, примерно вот так:
Чтобы проверить свой индикатор, можно не подсоединять все выводы, кроме питания и регулировки контраста, а также выводы подсветки. Вы видите, что я использовал подстроечные резисторы, напаянные прямо на контакты индикатора. Установите подстроечники в среднее положение и подключите питание. Подсветка должна сразу заработать и вы можете выставить уровень ее яркости (R2), который вам нравиться. После этого поворачивайте ось подстроечника контраста (R1), пока не станут четко видны пиксели на знакоместах.
Если все получилось, то ваш индикатор скорее жив. чем мертв :). Теперь о подключении линий передачи данных. Можно подключить все восемь линий, при этом скорость работы будет максимальной. Можно подключить только четыре, при этом индикатор будет работать медленнее. Я выбрал второй вариант, так как уже никуда не спешу :).
Для того, чтобы индикатор заработал, нужна управляющая программа. Можно написать свою в машинных кодах, а можно взять готовую, так называемую библиотеку. Все как в поговорке : "Если вас сожрала акула, то у вас все равно есть два выхода" :). С кодами я не имею чести быть знакомым, а вот подключить библиотеку я постараюсь. Эта библиотека называется LiquidCrystal и она скорее всего уже есть в одной из папок Arduino IDE. Вы можете это проверить, если зайдете во вкладку Инструменты и выберете пункт Управлять библитеками.
У вас откроется окно, где перечислены все имеющиеся у вас библиотеки.
Чтобы быстро найти нужную библиотеку введите в окошко Отфильтровать результаты поиска (подчеркнута красным) первые буквы названия библиотеки.
Есть у меня такая библиотека, самая первая. Важно, что она совместима с чипом HD44780. Но у этой библиотеки есть недостаток - она выводит на дисплей только цифры и латинские буквы, зато, используя ее вы сможете сами создавать символы. Есть даже очень удобный визуальный редактор, который по вашим хотелкам формирует код элемента.
А если нужно по-русски - то есть библиотека LiquidCrystalRus, которую можно скачать здесь: http://mk90.blogspot.com/2015/03/liquidcrystalrus-161.html. После скачки архив нужно распаковать в папку, где лежат другие библиотеки. У меня этот путь такой С:/Program Files (086)/Arduino/libraries/ Следует учитывать, что подобно оригинальному LiquidCrystal, LiquidCrystalRus не умеет работать с дисплеями, подключенными как-то иначе, чем к пинам Arduino (например, по I2C), но зато и не требует для работы дополнительных библиотек: и в результате поддержка русского языка обходится дополнительно в 500 байт flash и 7 байт SRAM.
Ну а теперь к самой программе. Пример использования библиотеки LiquidCrystal есть в самой IDE. Вот как добраться до этих примеров:
Как видите, примеров целый десяток, какой выбрать для начала? Хочется, чтобы появилась какая-то надпись, поэтому выбираем HelloWorld. Открываем текст программы и в начале текста видим комментарий.
Нам интересна схема подключения индикатора к Ардуино (The circuit). Читаем: Rs - к 12 (цифровому) пину Ардуино (D12), Enable - к пину 11, контакты D4 - D7 к пинам 5 - 2 соответственно, R/W - к общему проводу (вот здесь это четко написано, а на многих наших сайтах - нет). Питание - к +5 В и GND Ардуино. Ну и регуляторы яркости подсветки и контраста - как на рис. 9.
На наших сайтах частенько спешат и неопытным пользователям вроде меня достается по полной. Вот, например здесь: https://www.joyta.ru/12467-vzaimodejstvie-lcd-1602-s-arduino-opisanie-raspinovka-podklyuchenie/.
Я поверил этому сайту и долго раскидывал мозгами, почему у меня на дисплее пусто. Потом заземлил этот вывод - и все получилось. Зато там отличная мультипликация регулировки контрастности. Только вот пояснение с ним как-то не вяжется: "Далее необходимо подключить контакт 3, который отвечает за контрастность и яркость дисплея." Но регулирует этот контакт только контрастность. Но не ошибается только тот, кто ничего не делает. Просто нам нужно информацию перепроверять.
И, конечно, у меня возник вопрос: а почему как-то не последовательно подсоединены пины? Мне пришлось перекрещивать проводники при подсоединении к Ардуино. Как оказалось, никакой тайны здесь нет, а, наоборот, полная свобода выбора. Вы можете подсоединять индикатор к любым цифровым входам Ардуино и в любой последовательности. Главное, сообщить об этом в библиотеку :). Вот мой текст программы.
Строка "#include <LiquidCrystal.h>" сообщает среде программирования. что нужно подключить нужную библиотеку. Затем определяем с какими пинами законнектятся контакты индикатора. Да, у индикатора берем именно D4 - D7, а D0-D3 оставляем висеть в воздухе.
Затем создаем объект, который сообщит библиотеке о выбранных подсоединениях: LiquidCrystal lcd(rs, enable, d4, d5, d6, d7); или, если не писать все int, можно проще LiquidCrystal lcd(7, 8, 9, 10, 11, 12);. Но в этом случае назначение пинов нужно держать в голове.
Затем устанавливаем количество знакомест в одной строке индикатора и количество строк: lcd.begin(16, 2);, т.е. две строки по 16 знакомест в каждой. Затем очищаем дисплей с помощью команды lcd.clear(); (в скобках ничего не должно быть).
Вообще, работа с этой библиотекой напомнила мне вывод текста в Бейсике - похожие правила, похожие операторы (например, очистка экрана - CLS, вывод текста PRINT и т.д.)
С помощью функции lcd.setCursor(№ знакоместа, № строки); устанавливаем курсор на нужную позицию в нужной строке, учитывая, что отсчет осуществляется с 0. Строка №0 - верхняя строка, а №1 - нижняя. Знакоместа с 0 до 15.
Вывод на дисплей индикатора с помощью функции lcd.print(" текст "); или lcd.print(переменная). Если вы будете использовать и текст и переменную, значение которой будет меняться, возможно мигание символов, поэтому я добавил задержку, которая его устраняет. Ну и в конце нужно очистить дисплей.
А вот и результат трудов:
Подробно о функциях библиотеки LiquidCrystal можно прочитать здесь: http://developer.alexanderklimov.ru/arduino/liquidcrystal.php. Там же в конце находится и визуальный редактор символов.
Раз индикатор работает, буду применять его в вольтметре постоянного тока. Об этом в следующей статье.
Всем здоровья и успехов!