Мое небольшое знакомство с LCD модулем ST7735S
Недавно я искал себе для экспериментов маленькие недорогие дисплеи, для отображения всякой информации при работе с микроконтроллерами. Почему недорогих, так это потому что в процессе экспериментов я вполне допускаю что легко могу их как-то испортить и вполне возможно придется будет купить еще несколько экземпляров.
Раньше я уже имел дело с LCD1602 (обычный, с подсветкой, а в моем случае еще и синий) поскольку этот модуль шел в готовом наборе от Freenove, который я брал для изучения Raspberry Pico W. По мне этот модуль во многом неудобен и громоздок, хотя конечно он достаточно распространен, хорошо документирован, да и доступен по адекватной цене. Тем не менее, для экспериментов я решил себе поискать что-нибудь другое.
Сначала я захотел поэкспериментировать с энергоэффективными решениями и стал искать подходящие компактные модули рефлективных монохромных дисплеев, но к своему изумлению я столкнулся с тем, что они оказывается достаточно недешевые если рассматривать более-менее нормальные варианты. Я честно говоря раньше был уверен что они стоят недорого, но оказывается они делаются не так уж массово и от этого их себестоимость реально может быть низкой только при больших партиях, что явно не мой вариант. А уж про дисплеи на основе электронных чернил я вообще молчу. В общем работу с энергоэффективными решениями я решил оставить чуточку на потом, когда поднаберусь побольше опыта.
Тем не менее мне было с чем поэкспериментировать, ибо в процессе поисков, я обратил внимание на достаточно массовые LCD модули на базе контроллеров ST7735 (включая ST7735S, ST7735R и пр.) и ST7789 которые очень меня заинтересовали. Конечно они не являются энергоэффективными решениями, но зато эти модули вполне неплохие по качеству и характеристикам, а также, что немаловажно, они достаточно дешевые, чтобы с ними можно было смело экспериментировать.
Для первой пробы я заказал себе на Aliexpress два маленьких модуля (ST7735S и ST7789) что по сумме вышло чуть больше 200 рублей. Заказал я их еще в конце августа, пришли они ко мне в Екатеринбург в середине сентября, а попробовать удалось только в этом месяце и то только пока ST7735S, о котором дальше и пойдет речь.
ST7735S
Вообще есть несколько вариаций модулей семейства ST7735. В моем случае это был модуль ST7735S с IPS-экраном, с разрешением 80x160px и 16 битной цветностью (216 = 65536 цветов), а заявленный размер экрана составляет 0.96 дюйма. Модуль в размерах несколько больше экрана и в моем случае он был заказан с заранее припаянными пинами, чтобы не морочиться с пайкой.
Для взаимодействия с модулем используется SPI интерфейс. При этом модуль который был у меня имел следующие по порядку контакты:
- GND (Power Ground) — земля;
- VCC — Основное питание (в нашем случае 3.3 - 5 вольт);
- SCL (SPI Clock Line) -— для синхронизации;
- SDA (SPI Data Line) — для передачи данных;
- RES (RESET Interface) — для аппаратного сброса дисплея;
- DC (SPI Data/Command Interface) — для обозначения передаваемой по SDA информации в зависимости от уровня напряжения:
- при низком уровне (логический "0") — это будут команды контроллеру модуля;
- при высоком уровне (логическая "1") — это буду сами данные.
- CS (Chip Select) — используется в SPI для выбора микросхемы;
- BLK (Backlight control) — отвечает за подсветку. В моем случае это был необязательный к подключению контакт и при этом подсветка работала. При явном подключении к этому контакту, подсветка работала при высоком уровне на пине и выключалась при низком.
Вообще вначале меня очень смутили линии SCL и SDA, поскольку обычно такое наименование я встречал именно в контексте I2C протокола, а данный модуль работает только по SPI. Но оказывается некоторые производители используют эти наименования также и для использования с SPI, возможно для унификации и удешевления производства. Фактически их обозначения можно представить в виде нижеследующей таблички:
| линия ⏷ ╲ протокол ⏵ | SPI | I2C |
|---|---|---|
| SCL | SPI CLock line | Serial CLock line |
| SDA | SPI DAta Line | Serial DAta line |
В общем немного разобравшись, я начал экспериментировать с этим модулем используя Micropython. Вот тут популярность этого модуля была мне на руку и найти подходящий за основу программный "драйвер" оказалось не сложно (например поискав по ключевому слову "ST7735" в Awesome MicroPython).
В процессе экспериментов, для меня открылся интересный нюанс этих модулей. Суть в том, что модули ST7735 поставляются с разрешениями матриц 80x160, 128x128, 128x160 и т.д., но внутри этого модуля память (в которой хранится отображаемый кадр) контроллера обычно (но говорят не всегда) унифицирована и рассчитана на разрешение 132 x 162 x 18бит. Поэтому на экране отображается не вся видеопамять а только определенная область (равная разрешению экрана), а остальная часть остается за кадром. Прикол в том, что эта отображаемая область, в разных моделях модулей и у разных производителей оказывается может иметь разные координаты.
После того как я смог вывести тестовое изображение я увидел что цвета не совсем соответствуют заданным. Оказалось, что для некоторых модулей надо передавать цвета не как RGB (Red, Green, Blue), а как BGR (Blue, Green, Red), что и было в моем случае. После этого все стало отображаться более менее корректно.
Вообще мне пока что кажется что подобные модули, особенно если они от разных производителей, перед использованием не лишним будет еще раз проверить на отображение и возможно их даже специально отдельно откалибровать, задав программное смещение относительно начальной точки координат 0:0, с учетом ландшафтного или портретного использования дисплея и режима цветопередачи.
В общем после того как всё по минимуму заработало, я взял одну из фотографий из семейного архива, ужал до необходимого разрешения и в виде своеобразного битмапа попытался отобразить на экранчике.
Получилось вполне неплохо, но явно бросалось на глаза довольно медленная скорость отображения данных на экране, что скорее всего было связано с неторопливостью работы SPI. Повышение частоты SPI особо результата не дало, а вот стабильность начала падать и начали появляться шумы. Поэтому если нужно динамически обновлять данные на экранчике, лучше всего не перерисовывать весь кадр, а отправлять на перерисовку только те фрагменты, которые реально изменились, тем самым уменьшая объем передаваемых данных по SPI.
Заключение
Что касается модуля ST7735S, то за свои деньги по мне это отличные модули. Конечно касательно долговечности и общей надежности ничего не могу сказать но как минимум для экспериментов с микроконтроллерами эти модули прекрасно подходят. Да и в силу их дешевизны их не так жалко испортить. Тем не менее для расширения кругозора в дальнейшем я буду пробовать и другие, в т.ч. энергоэффективные решения, а это уже другой класс задач.
По итогу конечно мой рассказ очень поверхностно описывает работу с данными модулями. Да и вообще в работе с подобным железом я выгляжу наивным любителем. Но меня это ничуть не смущает, ибо я хоть и совсем новичок в этом деле, но мне всё больше начинает нравится этот чудесный мир разработки на микроконтроллерах.