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

Открываем пример graphictest, который появится у нас после добавления библиотеки, и видим много ifdef, для разных чипов, и вариантов подключений. Я эти куски сразу почистил, до лаконичных выводов, которые мне нужны. Собственно, какую-то часть менять не нужно, так как она завязана на аппаратный SPI
#define TFT_CS D2 #define TFT_RST D3 #define TFT_DC D4 // // define not needed for all pins; reference for ESP32 physical pins connections to VSPI: // SDA GPIO23 aka VSPI MOSI // SCLK GPIO18 aka SCK aka VSPI SCK // D/C GPIO21 aka A0 (also I2C SDA) // RST GPIO22 aka RESET (also I2C SCL) // CS GPIO5 aka chip select // LED 3.3V // VCC 5V // GND - GND
Тут я всё понял, когда посмотрел на выводы дисплея, ведь зашитая на спех программа ничего не отобразила на дисплее. Причину нашёл быстро, ведь я никуда не подключил вывод CS. Стоп, а где он?

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

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

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

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

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

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

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

Как я писал выше, я убрал все замены ifdef, и оставил выводы, которые точно буду использовать (выше в статье). ЗАтем закомментировал ненужный контроллер, и раскомментировал тот, что установлен в этом дисплее
// For 1.54" TFT with ST7789: Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
Также раскомментировал строку, с разрешением, которое мне нужно. Остальные удалил
// OR use this initializer (uncomment) if using a 1.54" 240x240 TFT: tft.init(240, 240); // Init ST7789 240x240
Вот теперь, при подключённом выводе CS демка сразу заработала. Значит нам доступны все функции библиотек adafruit_gfx. Скорость работы намного выше, чем у AVR.

Чтобы оценить качество экрана в полной мере, лучше вывести изображение, обычно это делается с micro-sd карты, но в самом экране её нет (хотя у adafruit вроде есть версии с флеш-слотом). Вспомнив, что у ESP8266 достаточно много собственной памяти для программ, решил попробовать записать изображение в память программы. Для этого можно воспользоваться ссылкой
Загружаем картинку нужного разрешения, и конвертируем в *.с файл. Далее, я чищу header этого файла, переименовываю в *.h, кладу в папку с проектом, и подключаю командой
#import "*.h"
Файл очень большой, и когда он лежит в проекте занимает много места. Каждый пиксель описывается в 16 битной цветовой гамме, и это конечно избыточно, замедляет вывод изображения. В самом файле картинки нас интересует переменная памяти программ, я назвал её DogBitmap
const unsigned short DogBitmap[57600] PROGMEM={ код картинки }
Теперь простой командой из библиотеки adafruit можно вывести её на экран
tft.drawRGBBitmap(0, 0, DogBitmap, 240, 240);
Где, первые два аргумента (0,0) – это стартовая позиция отрисовки, потом имя нашей переменной, и затем размеры изображения по ширине и высоте (240х240). Смотрим результат. Картинку я взял из известных стикеров Вконтакте.

Как я уже писал, у этого экрана потрясающие углы обзора, и большое разрешение на 1.4 дюйма размера, так что для отображения картинок в маленьких устройствах он подходит великолепно. Как обычно, код по ссылке
Ничего паять не надо.
// ST7735 TFT module connections
#define TFT_DC D3 // TFT DC pin is connected
#define TFT_RST D4 // TFT RST pin is connected
#define TFT_CS -1 // TFT CS pin is NOT connected
// initialize ST7789 TFT library with hardware SPI module
// SCK (SCL) —> NodeMCU pin D5 (GPIO14)
// MOSI(SDA) —> NodeMCU pin D7 (GPIO13)
// initialize ST77XX TFT library
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
void setup(){
tft.init(240, 240, SPI_MODE2); // initialize a ST7789 chip, black tab
}
Спасибо за информацию!
Вместо “-1” в #define TFT_CS -1 можно поставить любое число, например, 10, 11, 12, 13. Работает. Паять и в самом деле не надо.
Спасибо!!!
Вопрос – вы документацию на эти экраны нигде не видели? datasheet в смысле. хочется уверенности при разводке платы.
У китайцев на алиэкспресс была небольшая картинка с назначением контактов, но полного даташита не видел. Думаю лучше прозвонить этот модуль, а экран заказать отдельно со шлейфом.
Hei ! Thanks a lot, this help me a lot to do some surgery on my Display!
I have these info in hand about the pinout but not sure about that CS pin yet because only have 1 board and no replacement if I open it later.
So I am using the library with CS Pin disable for so long but I need that CS Pin enable because want to connect SD Card as well (so the image stored in SD Card), sharing SPI, so yes … Your info now can be use to make this display have CS Pin and I can share it with SD Card pin later !
Will do some surgery after reaching home, thanks again for the effort, I like it!
PS: I hope my comment get translated well since I reply it with translated page from chrome :)
Очень колхозно.
Выкладывайте ваше фото.
NIKOLAHA53RUS Спасибо, я старался
Эти экранчики нужно постоянно регенерировать из внутренней памяти МК на частоте 25 Гц, или у них встроенная память есть, чтобы вывести в неё изображение и оно будет с частой 25 Гц выводится на экран без МК?
Для преобразования исходного изображения в *.с (*.h) файл можно воспользоваться программой LCD Image Converter, в которой можно преобразовать изображение в какое-либо цветное, серое или монохромное. Последний формат особенно подойдет, если памяти мало, например, всего 32 кБ, как в некоторых Ардуино.
Здравствуйте! STM32(обычный blue-pill) + GMT130-v1.0(ST7789) работает только в режиме debug, а точнее только после первой прошивки. При повторной перезагрузки STM32 экран не работает. Но при этом STM32 перезапускается корректно (RES, DС, BLK и аппаратный SPI отрабатывает – смотрел осциллографом, но биты пока не сверял). Перекидывал все на другие выводы (и другой SPI), прошивал другой программой, включал pull-up/pull_down, CS вывод не трогал (заземлен не плате экрана). Вариант с тем, что в debug-режиме скорости меньше отпадает, потому что пробовал и в STM32 ST-LINK Utility прошивать (изначально в CubeIDE). Скорость SPI – 8Mbit. Библиотеку использую ST7789-STM32-master. Из идей осталось – отрезать CS от земли и отдать на управление библиотеке. Вопрос: сталкивался ли кто-то с подобной проблемой и как решили?
Отвечаю на собственный вопрос. Проблема была устранена добавлением подтягивающих к 3,3V резисторов на ноги аппаратного SPI. Как настроить подтяжку на аппаратном SPI в CubeIDE я не нашел (другие ноги можешь подтягивать, а на аппаратные выбора просто нет). Возможная альтернатива – использование программного SPI.