Как подключить дисплей st7735s к ардуино

Обновлено: 06.07.2024




Последние действия на сайте

Дисплей TFT 1.8 SPI и Arduino

1.8 SPI TFT дисплей

Подключение

На плате имеется 16 выводов, три из которых не используются. Выводы 11-14 подключены к разъему SD карты.

Программный SPI

Существует два основных варианта подключения Arduino и дисплея через SPI. В первом случае, можно использовать любые из GPIO выводов Arduino, но при этом будет использован медленный программный SPI драйвер. Пример такой схемы подключения представлен ниже.

Аппаратный SPI

Как известно, Arduino имеет встроенный аппаратный SPI. На Arduino Nano для этого используются выводы с 10 по 13.

Аппаратный SPI + SD карта

Как я уже написал, на плате дисплея есть слот для SD карт. Чтобы была возможность выводить с карты битмапы, слот, также как и сам дисплей, необходимо подключить к SPI шине.

Программа

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

Для установки этих библиотек, потребуется скачать соответствующие архивы о указанным ссылкам, распаковать их в папку с установленным Arduino IDE: . /arduino/libraries. И не забыть переименовать их, убрав из названия символ "-" (иначе либы не подключатся).

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


Скетч "graphicstest" использует первый вариант подключения - программный SPI. Второй скетч " graphicstest_highspeed " использует аппаратный SPI и выполняется гораздо быстрее первого варианта. Наконец, третья программа "spitftbitmap" выводит на дисплей картинку, заранее сохраненную на SD карточку. Картинка должна быть битмапом (.bmp) с глубиной цвета 24бит и с разрешением, ясен пень, 128х160 пикселей.

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

Плата расширения Arduino TFT

Arduino TFT - это плата расширения для Ардуино, которая содержит TFT-экран с подсветкой и разъем для карты памяти формата microSD. С помощью специальной библиотеки TFT на экран можно выводить текст, изображения или геометрические фигуры.


Расположение внешних выводов платы расширения соответствует специальным разъемам на Arduino Esplora и Arduino Robot, что облегчает подключение экрана к этим устройствам. Однако, TFT-дисплей можно использовать с любой моделью Ардуино.

Библиотека TFT включается в состав среды разработки Ардуино. начиная с версии 1.0.5.

Библиотека

Библиотека Arduino TFT разработана на основе библиотек Adafruit GFX и Adafruit ST7735, и значительно расширяет их возможности. Библиотека GFX в основном содержит процедуры отрисовки графики, в том время, как ST7735 - функции для взаимодействия с TFT-экраном. Те дополнения библиотек, которые касаются Ардуино, спроектированы таким образом, чтобы максимально соответствовать API языка Processing.

Библиотека имеет обратную совместимость, что позволяет вам использовать в программах функции Adafruit (подробнее о них см. здесь).

Методы библиотеки TFT опираются на функции библиотеки SPI, поэтому во всех программах, работающих с TFT-экраном, должна быть объявлена библиотека SPI. Соответственно, при работе с SD-картой памяти - необходимо объявить библиотеку SD.

Организация экрана

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

Систему координат дисплея лучше всего представить в виде сетки, каждая ячейка которой является отдельным пикселем. Местоположение пикселя задается парой координат. Точка в левом верхнем углу экрана будет иметь координаты 0,0. Если эта точка сместится в верхний правый угол, то ее координаты будут равны 0, 159; в левый нижний угол - 127,0; в правый нижний - 127, 159.

Дисплей можно использовать и в вертикальном положении (также известном как "портретная ориентация"). Для этого достаточно вызвать функцию setRotation(0), после чего оси x и y поменяются местами. После вызова этого метода, функции screen.width() и screen.right() станут возвращать уже другие значения.

Цвета

Аппаратный и программный интерфейс SPI - что лучше?

Организовать работу с TFT-экраном можно двумя способами. Первый способ - использовать аппаратную шину SPI Ардуино, второй - вручную объявить расположение необходимых выводов. С точки зрения функциональности экрана, нет никакой разницы между первым и вторым способом. Однако скорость работы аппаратного интерфейса SPI значительно выше.

Если на TFT-модуле планируется использование SD-карты памяти, то взаимодействовать с модулем необходимо только через аппаратный интерфейс SPI. Он используется во всех примерах к данной библиотеке.

Подключение экрана


Подключение к Arduino Esplora

На лицевой стороне Arduino Esplora есть специальный разъем для подключения экрана. Вставьте экран Ардуино в этот разъем так, чтобы синяя надпись "SD Card" была расположена возде порта USB.


Подключение к другим платам Ардуино

Чтобы узнать, как подключать экран к другим моделям Ардуино, прочтите это руководство.

Пишем первую программу

Для начала работы с TFT-экраном, сперва попробуем написать программу, которая будет отрисовывать простую линию. После этого напишем программу, формирующую 2 цветных прямоугольника, пересекающие экран по горизонтали.

В примерах вначале будут приведены листинги программ для Arduino Uno, Leonardo и др. моделей. Листинги для Arduino Esplora будут приведены ниже.

Итак, в начале программы, объявим выводы Ардуино, которые будут использоваться для взаимодействия с экраном, импортируем необходимые библиотеки и создадим экземпляры основных классов библиотеки TFT:

В блоке setup() необходимо запустить библиотеку функцией begin() и очистить экран, установив черный цвет фона с помощью функции background().

В блоке loop(), для отрисовки прямой линии на экране необходимо вызвать функцию line(). Функция line() принимает четыре аргумента: начальные координаты x и y, конечные координаты x и y. Чтобы нарисовать прямоугольник, необходимо вызвать функцию rect(), которая также принимает четыре параметра: координаты x и y левого верхнего угла, ширина и высота прямоугольника в пикселях. Между вызовами этих функций можно изменить цвет выводимой фигуры с помощью функций stroke() или fill(). Функция stroke() изменяет цвет линии или контура геометрической фигуры, а функция fill() - изменяет цвет заливки фигуры. После вызова функции noStroke() библиотека не будет отрисовывать границы выводимых фигур. Чтобы отменить действие этой функции, достаточно вызвать метод stroke().

Структура программы для Arduino Esplora практически ничем не отличается. В Arduino Esplora предусмотрен отдельный разъем для подключения TFT-экрана, поэтому выводы, взаимодействующие с ним, заданы аппаратно и не подлежат изменению. В программе в этом случае необходимо использовать специальный класс EsploraTFT для работы с экраном.

Именно поэтому в программе не нужно указывать выводы Ардуино, которые будут взаимодействовать с экраном; эта информация автоматически содержится внутри создаваемого объекта:

Перемещения по экрану

Иллюзия движения или анимация создается путем быстрого стирания и отрисовки изображения на экране. При использовании языка Processing на мощном компьютере, для очистки экрана и отрисовки картинки в новой позиции можно вызывать функцию background() перед каждым вызовом функции draw(). Однако производительность Arduino, по сравнению с настольным ПК, весьма ограничена, поэтому выполнение функции background() из библиотеки TFT занимает определенное время.

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

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

В цикле loop() мы вначале обновляем позицию точки, добавляя к переменным x и y величину направления движения. После этого проверяем, отличается ли текущее и предыдущее положение точки. Если отличается, то стираем предыдущую точку, закрашивая ее фоновым цветом, а затем рисуем новую точку в необходимой позиции. Если точка "долетает" до границы экрана - инвертируем направление движения.

Версия этой программы для Arduino Esplora приведена ниже:

Выводим текст

В библиотеке TFT содержится базовый шрифт для вывода текста на экран. По умолчанию, размер символов составляет 5х8 пикселей (5 - в ширину, 8 - в высоту). В библиотеке предусмотрена возможность изменения размера шрифта на 10x16, 15x24 или 20x32. Для получения дополнительной информации о шрифтах см. страницу Adafruit о работе с графическими примитивами.

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

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

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

Тот же самый код для Arduino Esplora:

Выводим изображение из файла, находящегося на SD-карте памяти

Библиотека TFT позволяет считывать .bmp-файлы с SD-карты памяти и выводить их содержимое на экран. Причем отображаемые картинки могут не соответствовать разрешению TFT-экрана (160x128). Следует иметь ввиду, что Ардуино не может модифицировать изображения, поэтому все необходимые манипуляции с графическими файлами (такие, как масштабирование, обрезка и т.д.) необходимо сделать до их "заливки" на SD-карту.

В следующем примере показана работа с графическим файлом "arduino.bmp", расположенном в корне SD-карты памяти, и содержащим изображение размером 160x128 пикселей. В программе осуществляется считывание файла и вывод его на экран с помощью библиотеки TFT.

Помимо уже знакомых вам библиотек, в этом примере понадобится подключить еще одну библиотеку - SD. Также необходимо объявить вывод CS, связанный с разъемом SD-карты.

Класс PImage используется для загрузки изображения (этот класс может также использоваться для проверки формата графического файла на предмет его совместимости с библиотекой TFT).

После того, как файл будет прочитан, Ардуино выведет изображение в указанных вами координатах. В данном случае картинка будет выведена, начиная с левого верхнего угла экрана.

Тот же самый код для Arduino Esplora: :

Что дальше?

Теперь, когда вы разобрались с принципами работы дисплея, загляните в справку по библиотеке TFT - там вы найдете информацию об API библиотеки, а также дополнительные примеры кода. Для получения дополнительной технической информации, см. страницу с описанием платы расширения Arduino TFT. Также не помешает посетить страницу с описанием графической библиотеки Adafruit - там можно найти дополнительную информацию о функциях, не освещенных в данном руководстве.

Недавно заказал с алиэкпресс интересный экран, достаточно маленького размера, всего 1.44 дюйма, но обладающий разрешением 240х240 пикселей на матрице IPS, и обладающий SPI контроллером ST7789, т.е. его можно подружить с библиотекой Adafruit. Появление таких качественных экранов по бросовой цене, могу объяснить только тем, что возможно их сделали огромную партию под какие-нибудь смарт-часы или похожие устройства.

К AVR подключать его не сильно хотелось, ведь его тактовая частота выводит изображения с сильной задержкой, и я решил протестировать его на ESP8266. Конечно особой информации в сети не нашлось, но вроде стандартная библиотека, судя по быстрому описанию на гитхабе, позволяла легко его подключить (хаха, не тут то было). Добавляем библиотеку в Arduino IDE


Открываем пример graphictest, который появится у нас после добавления библиотеки, и видим много ifdef, для разных чипов, и вариантов подключений. Я эти куски сразу почистил, до лаконичных выводов, которые мне нужны. Собственно, какую-то часть менять не нужно, так как она завязана на аппаратный SPI

Тут я всё понял, когда посмотрел на выводы дисплея, ведь зашитая на спех программа ничего не отобразила на дисплее. Причину нашёл быстро, ведь я никуда не подключил вывод CS. Стоп, а где он?


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


К сожалению вывод CS был припаян к земле, и я решил, что его переходной контакт будет под экраном и аккуратно ножом сдёрнул его.


Контакт этот я срезал ножом, что он не контактировал с контактом GND, это делать нужно тоже аккуратно.

Теперь запаиваем обратно шлейф матрицы, и к выводу CS припаиваем уже свой провод, который можно подключить в ESP8266.


Итоговая схема подключения дисплея на ST7789 (и ST7735) получилась такая

Смотрите также: Как сделать робота за 2 недели к Fifa


Ещё раз пройдёмся по коду из примера graphictest из библиотеки st7789 и st7735


Как я писал выше, я убрал все замены ifdef, и оставил выводы, которые точно буду использовать (выше в статье). ЗАтем закомментировал ненужный контроллер, и раскомментировал тот, что установлен в этом дисплее

Также раскомментировал строку, с разрешением, которое мне нужно. Остальные удалил

Вот теперь, при подключённом выводе CS демка сразу заработала. Значит нам доступны все функции библиотек adafruit_gfx. Скорость работы намного выше, чем у AVR.


Чтобы оценить качество экрана в полной мере, лучше вывести изображение, обычно это делается с micro-sd карты, но в самом экране её нет (хотя у adafruit вроде есть версии с флеш-слотом). Вспомнив, что у ESP8266 достаточно много собственной памяти для программ, решил попробовать записать изображение в память программы. Для этого можно воспользоваться ссылкой

Смотрите также: Как сделать корпус робота. Новый компьютер

Загружаем картинку нужного разрешения, и конвертируем в *.с файл. Далее, я чищу header этого файла, переименовываю в *.h, кладу в папку с проектом, и подключаю командой

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

Теперь простой командой из библиотеки adafruit можно вывести её на экран


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

Осваиваем работу с цветными TFT-дисплеями на базе ST7735

30 тысяч раз больше цветов.

Модули питаются от 3.3 В или 5 В, имеют подсветку (которая питается только от 3.3 В, благодаря чему ее легко случайно спалить!) и используют SPI-подобный протокол. Желающие посмотреть на конкретные единички и нолики протокола, могут воспользоваться Sigrok и соответствующим .sr файлом из репозитория sigrok-dumps. Также мной был написан простенький декодер протокола ST7735 для Sigrok, но на момент написания этих строк патч еще не был вмержен в основную ветку (UPD: как оказалось, на самом деле он уже вмержен, см раз и два).

В PulseView протокол выглядит как-то так:

Протокол ST7735 в PulseView

Для получения приведенной выше картинки я использовал Arduino Uno и библиотеку для ST7735 от Adafruit. В версиях этой библиотеки старше 1.0.8 также вкорячили поддержку ST7789, с иерархиями классов, обмазкой всего макросами, и всяким таким. Из-за этого код библиотеки стал намного труднее для восприятия. Любопытно, что ST7789 не является слишком уж распространненым контроллером. Он похож на ST7735, но в виде модуля продается только в магазине Adafruit за сравнительно большие деньги. Модуль имеет разрешение 240 x 240 при диагонали 1.54". В своих проектах я бы не стал использовать этот модуль из-за небольшой диагонали, высокой стоимости и завязки на одного производителя. А для изучения работы интересного мне ST7735 я использовал тэг 1.0.8 библиотеки.

Интерфейс библиотеки вышел следующим:

Пример вывода текста на дисплей с диагональю 1.44":

STM32 и ST7735: пример вывода текста

Интересно, что если в случае SSD1306 можно было спокойно хранить всю картинку в памяти и каждый раз передавать ее дисплею целиком, то в случае с ST7735 этого уже так просто сделать нельзя. Тут и цвет 16-и битный, а не монохромный, да и разрешение в 2-2.5 раза выше. Чтобы хранить картинку в памяти микроконтроллера, понадобится 32 Кб для дисплея 128 x 128 и 40 Кб для дисплея 128 x 160. Тем временем, какой-нибудь STM32F103C8T6, используемый в Blue Pill, имеет всего 20 Кб RAM. Конечно, используемый в Nucleo-F411RE микроконтроллер STM32F411RET6 имеет уже 128 Кб RAM. Но мне хотелось бы, чтобы библиотека работала на любом микроконтроллере, и желательно без хаков типа использования 4-х битной палитры, уменьшения разрешения или использования индексированных цветов. Поэтому, в отличие от библиотеки для SSD1306, библиотека для ST7735 сразу отправляет все данные дисплею и ничего не хранит в памяти.

А доводилось ли вам использовать подобные модули, и если да, то в каких проектах?

Читайте также: