st7735 160 на 128 подсветка барахлит

lilik
Offline
Зарегистрирован: 19.10.2017

Пришла пара дисплеев таких

С подключением разобрался, скетчи примеров работают, с подсветкой не ясно. При включении внешнего резистора 220 ом экран один тускло, другой никак не горит. Вывод информации сопровождается мерцанием и сбоями картинки у первого. Если включать без резистора всё светит ярко и чётко. Устойчиво, почти, работает при 27 омах. Очень хорошо при питании от аккумулятора всё работает. Почему так происходит? В цепях выводов информационных стоят резисторы по 1,5 кОм. Нахрена они надо?(все ставят зачем то) 

:)

Как грамотно управлять светодиодом, или может просто выбраковку прислали?

 

 

 

lilik
Offline
Зарегистрирован: 19.10.2017

Неясно почему верхние схемы преобладают над нижними?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. 220 Ом для подсветки, очевидно, слишком много. Разумный диапазон 10-47 Ом.

2. Я так и не смог установить соответствия между распиновкой  в нулевом сообщении и схемами в первом.

3. Самое главное, непонятно, куда именно Вы включаете резистор - ни на одной схеме его нет. Судя по тому, что нарушается работа дисплея, Вы ставите его неправильно.

4. Резисторы в цепях управления, очевидно, связаны с тем, что дисплей 3.3-вольтовый.

 

*. Вспомнил, что 47 Ом - это я ставил на монохромный дисплей. Для цветного, очевидно, ток должен быть втрое выше, т.е. номинал вряд ли должен превышать 20 Ом.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

andriano диод подсветки один, так что номинал резистора +- одинаковый для цветного и монохромного.

ТС ШИМ подайте туда и регулируйте яркость как хотите.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Komandir пишет:

andriano диод подсветки один, так что номинал резистора +- одинаковый для цветного и монохромного.

ТС ШИМ подайте туда и регулируйте яркость как хотите.

Дело не в светодиоде, а в матрице: монохромная матрица может пропускать до 50% падающего на нее света, а цветная - не более 16.6%. Для одинаковой яркости на выходе свет от светодиода должен быть в три раза ярче для цветной матрицы.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Убедительно.

lilik
Offline
Зарегистрирован: 19.10.2017

andriano пишет:

2. Я так и не смог установить соответствия между распиновкой  в нулевом сообщении и схемами в первом.

4. Резисторы в цепях управления, очевидно, связаны с тем, что дисплей 3.3-вольтовый.

Вот так заработал на тест-скетче нормально. Зачем тогда стабилизатор ему на плате? Почему токаограничительный резистор только 3,3 Ома? Подсветка жрёт 29 мА, сам дисплей около 0,1 мА. Зачем резисторы в схеме?, если токаограничительные почему малый номинал, не 100 кОм, а порядка одного. Если ограничивают напряжение, где делители? Как уменьшить число соединений?

Как всегда одни вопросы. А дисплей очень такой доступный, всего 130 рублей.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

Зачем тогда стабилизатор ему на плате?

Очевидно затем, что ему нужно 3.3 В.

Цитата:

Почему токаограничительный резистор только 3,3 Ома?

Очевидно, разработчик решил, что это - оптимальная величина.

Цитата:

Зачем резисторы в схеме?

Уже было отвечено (4).

Цитата:
, если токаограничительные почему малый номинал, не 100 кОм, а порядка одного.

Оптимальное значение. Если будут сотни кОм - будет реагировать на любые помехи.

Цитата:
Если ограничивают напряжение, где делители?

В качестве нижнего плеча делителей используются входные схемы контроллера (Вы же сами хотите уменьшения числа деталей)

Цитата:
Как уменьшить число соединений?
Как увеличить - легко: добавить те самые резисторы в делители.

Цитата:

Как всегда одни вопросы.

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

Цитата:
А дисплей очень такой доступный, всего 130 рублей.
Только очень мелкий. У меня вот от 1.8, 2.0, 2.2 ни разу не использовались - так и лежат в коробке. А используются в основном либо двухстрочные текстовые, либо монохромные 128х64, либо цветные в диапазоне 2.4-4.0.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я тут намедни протупил. без резисторов включил (использовал для ESP ранее), так что теперь - был у меня один дисплей )))
ЗЫ первые потери да 6 лет...

lilik
Offline
Зарегистрирован: 19.10.2017

Если экран чик один можно так сократить резисторы. Удивительно, но такой вариант схемы работает надёжно. Замерял авометром электронным, на резисторе к SDA падает 0,8-0,9В при питании от 5 В и всего 0,06 при питании от аккума (3,8В). Как то я в смущении от их пользы, но убирать не стану :)

lilik
Offline
Зарегистрирован: 19.10.2017

Ну в целом ни так и не сяк. Отрисовка медленней чем на SSD1306. Но цвета красивые. Как узоры будут смотреться неизвестно.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Офф: lilik, не в службу, скинь ссылку на свою тему, где ты шары на адресных светодиодах делал ))

lilik
Offline
Зарегистрирован: 19.10.2017

v258 пишет:
Офф: lilik, не в службу, скинь ссылку на свою тему, где ты шары на адресных светодиодах делал ))

https://arduino.ru/forum/proekty/zalivaem-shary-k-prazdniku

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Спасибо))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

 

 

Отрисовка медленней чем на SSD1306.

Кто бы мог подумать, что 16 бит на пиксель окажется больше, чем 1 бит на пиксель!

lilik
Offline
Зарегистрирован: 19.10.2017

А скорость передачи ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

И там, и там передача последовательная. Так что даже 4 Мбит/с SPI против 400 кбит/ I2C не могут изменить соотношение на обратное. 

И, кстати, 1306 вполне способен работать по I2C на 2 Мбит/с. Да и с интерфейсом SPI они бывают. Так что в принципе возможности разгона у 1306 выше.

lilik
Offline
Зарегистрирован: 19.10.2017

Да, в целом не шустро, но если смотреть в прищур, то даже пламя похоже на пламя.

Argus19
Offline
Зарегистрирован: 08.05.2022

 lilik, Сколько памяти кушают скетчи?

 

lilik
Offline
Зарегистрирован: 19.10.2017

Argus19 пишет:

 lilik, Сколько памяти кушают скетчи?

 

Секундомер 38% памяти и 6% динамической, узоры 25 и 5 соответственно. 

Argus19
Offline
Зарегистрирован: 08.05.2022

 Спасибо.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Это у 328й?

lilik
Offline
Зарегистрирован: 19.10.2017

Да.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

lilik пишет:

Argus19 пишет:

 lilik, Сколько памяти кушают скетчи?

Секундомер 38% памяти и 6% динамической, узоры 25 и 5 соответственно. 

а можешь код секундомера выложить?

lilik
Offline
Зарегистрирован: 19.10.2017

Секундомер.

 

lilik
Offline
Зарегистрирован: 19.10.2017

С ч\б картинками разобрался, осталось научится их раскрашивать в разные цвета, имея одноцветный массив. Наверное из библиотеки функцию изымать и выдумывать зависимости цвета от счётчиков пикселей - i, j :)

секундомера стрелку (некстати) сделал накладывающейся - как настоящая.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Код секундомера для RP2040, русских шрифтов нет, увы...

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А почему такая медленная перерисовка?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

А почему такая медленная перерисовка?

пока не знаю, скорость на SPI выставлена по максимуму

lilik
Offline
Зарегистрирован: 19.10.2017

ua6em пишет:

Код секундомера для RP2040, русских шрифтов нет, увы...

А картинка?

Я по ходу забыл, в файлы библиотеки "...GFX" надо добавить

 

lilik
Offline
Зарегистрирован: 19.10.2017

glcdfont.c файл называется.

Новая версия, ещё более тормознутая отрисовка стрелки.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

andriano пишет:

А почему такая медленная перерисовка?

пока не знаю, скорость на SPI выставлена по максимуму

Максимум - это сколько? 4MHz?

Давай считать: Для одного пикселя нужно записать 16 бит, что при 4МГц будет 4 мкс, что соответствует 64 тактам при 16 МГц. Ну еще преобразование 1 бита 16 - это 8-10 инструкций, пусть будет еще 16 тактов. Итого 80 тактов или 5 мкс.

На экране 160*128=20к пикселей, по 5 мкс на каждый - 100 мс. Т.е. должно быть порядка 10 fps. Мы видим явно меньше, вопрос - почему?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

andriano он же через библиотеку выводит ... - дели скорость на 100 :-)

Не 10 кадров в секунду, а 10 секунда на кадр ...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Komandir пишет:

andriano он же через библиотеку выводит ... - дели скорость на 100 :-)

Не 10 кадров в секунду, а 10 секунда на кадр ...

Ну да...

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

lilik, покажи тот фрагмент, который выводит на экран первый рисунок из сообщения №25.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

lilik На какой частоте работает плата ? Если на 16, то fosc/2 - это 8, а не 4 ...

Жаль что нет буфера как на UART - ожидание окончания вывода даёт паузы между байтами ...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Спасибо! Вторая половина кодовой таблицы с выбором языка оказывается только ручками  )))
Что-то я на этом тормознулся, хотя с DOS был жеж более чем в теме... Осень...
Да, я добавил в ваш код установку скорости SPI, отрабатывает ли должным образом
надо разбираться, но если ставить скорость 60000000 то дисплей не АЛЛЁ )))
 

1tft.setSPISpeed(50000000);

 

lilik
Offline
Зарегистрирован: 19.10.2017

andriano пишет:

lilik, покажи тот фрагмент, который выводит на экран первый рисунок из сообщения №25.

01// РИСУНОК
02#include <Adafruit_GFX.h>    // Core graphics library
03#include <Adafruit_ST7735.h> // Hardware-specific library
04#include <SPI.h>
05#define TFT_CS     10
06#define TFT_RST    9 
07#define TFT_DC     8
08Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
09extern const unsigned char ris_1[];
10extern const unsigned char ris_2[];
11 
12void setup(void) {
13// Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
14  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
15 tft.fillScreen(ST7735_BLACK);
16 tft.setRotation(0);//ориентация экрана
17 }
18void loop() {
19 tft.drawBitmap(0,0,ris_1, 128,160,tft.Color565(255,255,255),0);
20 tft.drawBitmap(0,0,ris_2, 128,160,tft.Color565(255,255,255),0);
21 }

 

lilik
Offline
Зарегистрирован: 19.10.2017

ua6em пишет:

Да, я добавил в ваш код установку скорости SPI, отрабатывает ли должным образом...

 

1tft.setSPISpeed(50000000);

 

Скетч не компилируется.

lilik
Offline
Зарегистрирован: 19.10.2017

Komandir пишет:

lilik На какой частоте работает плата ? Если на 16, то fosc/2 - это 8, а не 4 ...

Жаль что нет буфера как на UART - ожидание окончания вывода даёт паузы между байтами ...

Плата UNO китайская с CH340.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

50 МГц ??? У вас Uno, а не RP2040 !!!

lilik
Offline
Зарегистрирован: 19.10.2017

Komandir пишет:

50 МГц ??? У вас Uno, а не RP2040 !!!

Да!, но не компилируется не из-за чисел :)

Вот так компилируется и работает, но число 16000000 (и любые другие) ни на что не влияют.

01// РИСУНОК
02#include <Adafruit_GFX.h>    // Core graphics library
03#include <Adafruit_ST7735.h> // Hardware-specific library
04#include <SPI.h>
05#define TFT_CS     10
06#define TFT_RST    9 
07#define TFT_DC     8
08Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
09extern const unsigned char ris_1[];
10extern const unsigned char ris_2[];
11 
12void setup(void) {
13  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
14  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
15 tft.fillScreen(ST7735_BLACK);
16 tft.setRotation(0);//ориентация экрана
17 SPI.begin();
18 SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0));
19 }
20void loop() {
21 tft.drawBitmap(0,0,ris_1, 128,160,tft.Color565(255,255,255),0);
22 tft.drawBitmap(0,0,ris_2, 128,160,tft.Color565(255,255,255),0);
23 }

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

lilik пишет:

andriano пишет:

lilik, покажи тот фрагмент, который выводит на экран первый рисунок из сообщения №25.

1tft.drawBitmap(0,0,ris_1, 128,160,tft.Color565(255,255,255),0);
2tft.drawBitmap(0,0,ris_2, 128,160,tft.Color565(255,255,255),0);
3}

 

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

Ну а раз так - сообщения №32-33.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

На UNO 16 МНц частота SPI не может быть выше 8 МНц

SPI.setClockDivider(SPI_CLOCK_DIV2);

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну и кроме того, по моим наблюдениям, 8МГц на AVR практически не отличается от 4МГц.

Да и вообще, с реализацией SPI на Arduino нужно как следует разбираться: если для AVR я установил лишь факт, описанный выше (т.е. относительное значение), то для stm32 получил абсолютное: на практике скорость передачи 1/7 от теоретического значения.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Ну и кроме того, по моим наблюдениям, 8МГц на AVR практически не отличается от 4МГц.

Да и вообще, с реализацией SPI на Arduino нужно как следует разбираться: если для AVR я установил лишь факт, описанный выше (т.е. относительное значение), то для stm32 получил абсолютное: на практике скорость передачи 1/7 от теоретического значения.

  а как померить реальную скорость?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Есть такая функция - millis().

Ну и, кроме того, у "железячников" должен быть осциллограф (или логический анализатор).

lilik
Offline
Зарегистрирован: 19.10.2017

Komandir пишет:

На UNO 16 МНц частота SPI не может быть выше 8 МНц

SPI.setClockDivider(SPI_CLOCK_DIV2);

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

  Она переделывает одну картинку в другую.

Может дело в попиксельном выводе данных?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Да, выводить попиксельно - это неправильно.

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

Т.е. на вывод 160 точек в примере выше мы сначала задаем команду 6-16 байт, а потом цвета всех 160 точек, т.е. еще 320 байт. Т.е. из примерно 330 байт 320 передают информацию о цвете точек.

При попиксельном выводе все то же самое, только на 3-16 байт служебной информации (задающей координаты точки) приходится только 2 байта на цвет (единственной точки).

В случае картинки и невозможности уместить ее в памяти целиком, целесообразно выводить построчно: т.е. задали строку 128*1 пискель, посчитали в буфер (256 байт) и вывели на экран. Потом - следующую.

lilik
Offline
Зарегистрирован: 19.10.2017

andycat пишет:

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

В примерах, что я опытничаю, внутри библиотек две функции рисования точки. Какая работает мне не ясно.

01void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color)
02{
03 
04  if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
05 
06  setAddrWindow(x,y,x+1,y+1);
07 
08#if defined (SPI_HAS_TRANSACTION)
09  if (hwSPI)     SPI.beginTransaction(mySPISettings);
10#endif
11 
12  DC_HIGH();
13  CS_LOW();
14  spiwrite(color >> 8);
15  spiwrite(color);
16  CS_HIGH();
17 
18#if defined (SPI_HAS_TRANSACTION)
19  if (hwSPI)     SPI.endTransaction();
20#endif
21}

 

01void GFXcanvas1::drawPixel(int16_t x, int16_t y, uint16_t color) {
02  // Bitmask tables of 0x80>>X and ~(0x80>>X), because X>>Y is slow on AVR
03  static const uint8_t PROGMEM
04    GFXsetBit[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 },
05    GFXclrBit[] = { 0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE };
06 
07  if(buffer) {
08    if((x < 0) || (y < 0) || (x >= _width) || (y >= _height)) return;
09 
10    int16_t t;
11    switch(rotation) {
12     case 1:
13      t = x;
14      x = WIDTH  - 1 - y;
15      y = t;
16      break;
17     case 2:
18      x = WIDTH  - 1 - x;
19      y = HEIGHT - 1 - y;
20      break;
21     case 3:
22      t = x;
23      x = y;
24      y = HEIGHT - 1 - t;
25      break;
26    }

Кстати такой блок нашёл, он на скорость влиет?

01inline void Adafruit_ST7735::CS_HIGH(void)
02{
03#if defined(USE_FAST_IO)
04  *csport |= cspinmask;
05#else
06  digitalWrite(_cs, HIGH);
07#endif
08}
09 
10inline void Adafruit_ST7735::CS_LOW(void)
11{
12#if defined(USE_FAST_IO)
13  *csport &= ~cspinmask;
14#else
15  digitalWrite(_cs, LOW);
16#endif
17}
18 
19inline void Adafruit_ST7735::DC_HIGH(void)
20{
21#if defined(USE_FAST_IO)
22  *dcport |= dcpinmask;
23#else
24  digitalWrite(_dc, HIGH);
25#endif
26}
27 
28inline void Adafruit_ST7735::DC_LOW(void)
29{
30#if defined(USE_FAST_IO)
31  *dcport &= ~dcpinmask;
32#else
33  digitalWrite(_dc, LOW);
34#endif
35}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

lilik пишет:

andycat пишет:

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

В примерах, что я опытничаю, внутри библиотек две функции рисования точки. Какая работает мне не ясно.

01void Adafruit_ST7735::drawPixel(int16_t x, int16_t y, uint16_t color)
02{
03 
04  if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return;
05 
06  setAddrWindow(x,y,x+1,y+1);
07 
08#if defined (SPI_HAS_TRANSACTION)
09  if (hwSPI)     SPI.beginTransaction(mySPISettings);
10#endif
11 
12  DC_HIGH();
13  CS_LOW();
14  spiwrite(color >> 8);
15  spiwrite(color);
16  CS_HIGH();
17 
18#if defined (SPI_HAS_TRANSACTION)
19  if (hwSPI)     SPI.endTransaction();
20#endif
21}

 

 

ну вот же она, задается координаты вывода, как выше писали. Формируете буфер данных для вывода, и по SPI шлете все это дисплею.

вот из проекта для ili9341, суть та же. (только это для STM + DMA)