#1 2025-08-11 21:23:45

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 23

Arduino vs LCD Trium Mars трабл

Доброго вечора
підключив дисп SPI LCD TRIUM MARS (схема в аттаче)
до Ардуїно
SCK на D13
SDA на D11
RES на D9
DC На D10
VCC - 3.3 вольта
GND до GND

Резистивні поділювачи стоять
Пробував таке

Протокол PCD8544 та PCF8812

    lcd_send(0x40 | y, LCD_CMD);
    lcd_send(0x80 | x, LCD_CMD);

        (D/c=0) 27 (11011)

Не відображає ніц
Прошу допомоги


triumfix.jpg

Остання редакція nickjust (2025-08-12 18:07:43)

Неактивний

#2 2025-08-12 10:08:37

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 160

Re: Arduino vs LCD Trium Mars трабл

Трохи не зрозуміло навіщо резистор між gnd і gnd.
https://nicuflorica.blogspot.com/2013/10/afisaj-de-nokia-3410-comandat-de-arduino.html - наче успішний експеримент.

Неактивний

#3 2025-08-12 10:36:41

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

В першу чергу приберіть резистор між землями. Якщо дисплею 3.3 В забагато - заживіть через діод, а краще через LDO на 2.85 В чи adjustable.
Може знов SPI Mode не той?
Для експериментів з LCD з заздалегідь невідомим протоколом набагато зручніше підключити його безпосередньо до компа. Коли запрацює при керуванні з компа, тоді вже підключати до ардуіно чи ще до чогось.

Неактивний

#4 2025-08-12 11:13:49

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

безпосередньо до компа - наприклад?

#5 2025-08-12 11:48:46

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

jokeer пише:

безпосередньо до компа - наприклад?

Наприклад, через USB адаптер на CH341A в режимі SPI або на FTDI бітбенгом. Можна й по-олдскульному через LPT-порт.

Неактивний

#6 2025-08-12 12:32:57

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

ну, як на мене, з ардуїною все ж трохи простіше. виконувати оцей генгбенг через LPT адаптер (де його взяти в 2025 році?) те ще збочення wink

#7 2025-08-12 12:51:01

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

jokeer пише:

виконувати оцей генгбенг через LPT адаптер (де його взяти в 2025 році?)

LPT я згадав як запасний олдскульний варіант, якщо ніякого USB-адаптера нема.
Доречі, на деяких материнках LPT досі є у вигляді BH-10 BH-26 розʼєму. А якщо нема, то можна поставити.

jokeer пише:

те ще збочення wink

Ну, а тикатись навмання, не розуміючи, це у скетчі шось не то, чи баг в бібліотеці, чи на ардуіні пін вигорів, і по сто раз перезаливати прошивку - не збочення?

Остання редакція dimich (2025-08-12 15:03:31)

Неактивний

#8 2025-08-12 12:59:28

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

Жьізнь - боль wink
але навіть якщо вдасться зробити щось прийнятне на FTDI - як це переносити в мікроконтроллер? з другою системою команд, другими частотами.. Подвійна робота ж.

#9 2025-08-12 13:21:35

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

jokeer пише:

але навіть якщо вдасться зробити щось прийнятне на FTDI - як це переносити в мікроконтроллер? з другою системою команд, другими частотами..

Не треба нічого переносити. Треба мати reference implementation. Якщо з компа працює, а з ардуіни ні, то завжди можна порівняти, що там відбувається по-різному. І потім дивитись, чому ардуіна видає щось не так як треба.

Те ж саме можна і в зворотньому порядку. Буває, коли імплементую керування LCD на новому контролері з компа, і чомусь не працює, а на ардуіні працює, то дивлюсь, що роблю не так в порівнянні з ардуіною.

Система команд контролера якраз одна й та ж. Частоти значення не мають.

jokeer пише:

Подвійна робота ж.

Щоб виплюнути десяток команд ініціалізації та пару байтів зображення багато роботи не потрібно.

Неактивний

#10 2025-08-12 13:39:30

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

Коли є reference це спрощує, звичайно. А якщо немає - я не впевнений що запиляти десяток команд ініціалізації на компі сильно простіше ніж зразу на контроллері.

#11 2025-08-12 14:03:56

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

jokeer пише:

я не впевнений що запиляти десяток команд ініціалізації на компі сильно простіше ніж зразу на контроллері.

Як мінімум, не потрібно кожен раз перезаливати прошивку.
Якщо нема напрацювань для роботи з GPIO з компа, то можна на тій же ардуіні отримувати команди контролера дисплея по Serial та відправляти їх на SPI з відповідним DATA/COMM бітом. А самі команди писати з компа в tty хоч вручну, хоч шелл-скриптом.
Ну, моя справа - запропонувати, а там як хочете.

Неактивний

#12 2025-08-12 18:18:12

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 23

Re: Arduino vs LCD Trium Mars трабл

вибачте ...помилився...в залізі все гуд   ініціалізацію написав ,з шрифтами махаюсь

нарахунок тестів LCD , замовив FT232H High-Speed USB Multifunction Module - JTAG UART FIFO SPI I2C Interface.Буду на Phyton тестувати  ...так простіще буде...

Неактивний

#13 2025-08-13 08:31:29

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 160

Re: Arduino vs LCD Trium Mars трабл

А можна якийсь приклад, зрозумілий колгоспникам? А то те що гуглиться - в стилі "ну.. можна робити всяке.. програму там написати".. Як на мене, програму під ардуїну написати ще простіше, приклади є прямо в IDE, і вона сама собі програматор.

Неактивний

#14 2025-08-13 16:26:48

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 23

Re: Arduino vs LCD Trium Mars трабл

приїде модуль , напишу ...самому цікаво...диспів дох...а, оледи 1306 жаба дусить купляти

Неактивний

#15 2025-08-13 16:50:11

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

Цікаві досліди wink
Я подивився на приклади, як тим ft232h управляти, і мені здалось що це не сильно простіше ніж без нього.

#16 2025-08-13 16:54:47

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 23

Re: Arduino vs LCD Trium Mars трабл

ch341a ще гірший , а можна на RP2040 Bridge зробити...щляхів уеб...сь  багато smile
зараз не можу зробити нормальний вивід тексту на Trium Mars та Siemens LPH9135 (графіку виводить чотко)

Остання редакція nickjust (2025-08-13 16:59:16)

Неактивний

#17 2025-08-13 17:19:16

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

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

#18 2025-08-13 19:46:17

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

хттпс://github.com/mcufont/mcufont наприклад
правда, я не впевнений що вдасться натягнути це на ардуїну wink

#19 2025-08-14 11:53:28

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 23

Re: Arduino vs LCD Trium Mars трабл

де можна скачати толкову халявну прогу для роботи з с-массивами ,пробував на пітоні ...працює але криво

Неактивний

#20 2025-08-14 12:45:37

jokeer
Гість

Re: Arduino vs LCD Trium Mars трабл

Для роботи з С-масивами ідеально підходить С. Не зрозумів питання.

#21 2025-08-14 14:39:15

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

jokeR пише:

А можна якийсь приклад, зрозумілий колгоспникам?

Приклад чого, як працювати з spidev, як реалізувати SPI на GPIO, чи як дригати GPIO-пінами?

Якщо у вас адаптер, для якого є драйвер ядра, що реалізує SPI-контролер (наприклад, CH341A), то прибіндити його до spidev. Зʼявиться /dev/spiN.*, працювати з ним через SPI userspace API. Тільки для SPI-дисплеїв все одно доведеться задіяти GPIO, бо як мінімум ще DATA/COMM треба смикати.

Якщо для адаптера є драйвер, що реалізує GPIO-контролер, то працювати з ним через libgpiod.

Звісно, це під лінуксом. Як там під віндою - не маю жодного уявлення.

jokeR пише:

Я подивився на приклади, як тим ft232h управляти, і мені здалось що це не сильно простіше ніж без нього.

Вже нема необхідності управляти самою FT232H з userspace, gpio-mpsse більше як півроку в mainline. Прибіндити FT232H до gpio-mpsse, зʼявляється gpiochipN з 16 лініями.

Але якщо дуже хочеться, то можна і з userspace, через libftdi. Та й протокол MPSSE досить простий.
Бачив, є для пайтона всякі pyftdi та python-adafruit-blinka. Але ними користуватись не доводилось, то не знаю, в якому вони там стані.

nickjust пише:

ch341a ще гірший

З CH341A проблема в тому, що за замовчуванням три піна використовуються як CS, і для GPIO залишається два, один з яких тільки input. Якщо потрібно смикати тільки DATA/COMM, то цього достатньо. Якщо хочеться ще GPIO, наприклад, для RST, то треба поправити таблицю в коді та перезібрати драйвер. Все руки не дійдуть реалізувати цю конфігурацію у вигляді параметра.
Ну і CH341A повільний, навіть в апаратно реалізованому SPI mode 0. Програмна емуляція mode 1-3 ще повільніша. Але для тестів та експериментів достатньо.

Остання редакція dimich (2025-08-14 14:43:19)

Неактивний

#22 2025-08-14 15:02:23

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

nickjust пише:

зараз не можу зробити нормальний вивід тексту на Trium Mars та Siemens LPH9135

В якому він у вас режимі кольорів? Ви ж враховуєте, що при 12bpp непарні пікселі попадають на середину байта? Хоча, якщо пікселі виводяться правильно, то, мабуть, враховуєте. Тоді покажіть, як виглядає "ненормальний" вивід тексту. Ну і код покажіть, яким виводите.

Неактивний

#23 2025-08-14 16:57:15

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

dimich пише:

наприклад, CH341A

Доречі, у CH341A ще є режим IEEE-1284, тобто емуляція LPT-порта. Можна реалізувати SPI bitbang через parport API -> CH341A -> SPI/GPIO -> дисплей. Але з цим режимом я колись побавився, світлодіодами поблимав, і забив.

Неактивний

#24 2025-08-14 18:07:56

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 23

Re: Arduino vs LCD Trium Mars трабл

Що не до вподоби
-кирилиця не працює
-текст виводить де попало
-пробував більший шрифт ..не працює
-дзеркалить по Y

Казали що норм працює з PCF8812 (PCD8544) - не получилось





#include <Arduino.h>
#include <SPI.h>

// init disp
#define USE_HARDWARE_SPI 0
#define LCD_CONTRAST     0x15
#define LCD_CS           8
#define LCD_DC          10
#define LCD_RST          9
#define SOFT_SCK        13
#define SOFT_MOSI       11
#define SPI_DELAY        5

// ===== font 5x8: 5 col + 3 space)
// Формат: { col0, col1, col2, col3, col4, 0x00, 0x00, 0x00 }
const uint8_t fontData[][8] = {
  // A (0)
  {0x7E, 0x11, 0x11, 0x11, 0x7E, 0x00, 0x00, 0x00},
  // B (1)
  {0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00},
  // C (2)
  {0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00, 0x00},
  // D (3)
  {0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00},
  // E (4)
  {0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00, 0x00},
  // F (5)
  {0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00, 0x00},
  // G (6)
  {0x3E, 0x41, 0x49, 0x49, 0x7A, 0x00, 0x00, 0x00},
  // H (7)
  {0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00, 0x00},
  // I (8)
  {0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00},
  // J (9)
  {0x20, 0x40, 0x41, 0x7F, 0x01, 0x00, 0x00, 0x00},
  // K (10)
  {0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00},
  // L (11)
  {0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00},
  // M (12)
  {0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, 0x00, 0x00},
  // N (13)
  {0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00, 0x00},
  // O (14)
  {0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00},
  // P (15)
  {0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00},
  // Q (16)
  {0x3E, 0x41, 0x45, 0x43, 0x3E, 0x00, 0x00, 0x00},
  // R (17)
  {0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00, 0x00},  
  // S (18)
  {0x46, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00, 0x00},
  // T (19)
  {0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00, 0x00},
  // U (20)
  {0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00},
  // V (21)
  {0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00, 0x00},
  // W (22)
  {0x3F, 0x40, 0x3C, 0x40, 0x3F, 0x00, 0x00, 0x00},
  // X (23)
  {0x41, 0x22, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00},
  // Y (24)
  {0x07, 0x08, 0x70, 0x08, 0x07, 0x00, 0x00, 0x00},
  // Z (25)
  {0x41, 0x61, 0x51, 0x49, 0x47, 0x00, 0x00, 0x00},

  // num 0-9 (26..35)
  {0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x00}, // 0
  {0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00}, // 1
  {0x61, 0x49, 0x49, 0x49, 0x3F, 0x00, 0x00, 0x00}, // 2
  {0x46, 0x49, 0x49, 0x49, 0x3E, 0x00, 0x00, 0x00}, // 3
  {0x38, 0x14, 0x14, 0x14, 0x7F, 0x00, 0x00, 0x00}, // 4
  {0x4F, 0x49, 0x49, 0x49, 0x31, 0x00, 0x00, 0x00}, // 5
  {0x3E, 0x49, 0x49, 0x49, 0x3A, 0x00, 0x00, 0x00}, // 6
  {0x01, 0x01, 0x71, 0x0D, 0x03, 0x00, 0x00, 0x00}, // 7
  {0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00, 0x00}, // 8
  {0x26, 0x49, 0x49, 0x49, 0x3E, 0x00, 0x00, 0x00}  // 9
};

// char ASCII
const uint8_t* getChar(char c) {
  if (c >= 'A' && c <= 'Z') return fontData[c - 'A'];
  if (c >= '0' && c <= '9') return fontData[c - '0' + 26];
  return nullptr;
}

// out xy
void drawText(uint8_t x, uint8_t y, const char* text) {
  setPosition(x, y);
  while (*text) {
    char c = *text;
    if (c >= 'a' && c <= 'z') c -= 32; // char high
    const uint8_t* chr = getChar(c);
    if (chr) {
      for (int i = 0; i < 8; i++) {
        sendData(chr[i]);
      }
    }
    text++;
  }
}

// central char
void drawCentered(const char* text) {
  int len = strlen(text);
  int totalWidth = len * 5; // 5 px w/o space
  int x = (84 - totalWidth) / 2;
  drawText(x, 2, text);
}

// ===== SPI and base func =====
void spiInit() {
  #if USE_HARDWARE_SPI
    SPI.begin();
    SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  #else
    pinMode(SOFT_SCK, OUTPUT);
    pinMode(SOFT_MOSI, OUTPUT);
  #endif
  pinMode(LCD_CS, OUTPUT);
  pinMode(LCD_DC, OUTPUT);
  pinMode(LCD_RST, OUTPUT);
  digitalWrite(LCD_CS, HIGH);
}

void spiTransfer(uint8_t data) {
  #if USE_HARDWARE_SPI
    SPI.transfer(data);
  #else
    for (uint8_t i = 0; i < 8; i++) {
      digitalWrite(SOFT_MOSI, (data & 0x80) ? HIGH : LOW);
      digitalWrite(SOFT_SCK, HIGH);
      delayMicroseconds(SPI_DELAY);
      digitalWrite(SOFT_SCK, LOW);
      delayMicroseconds(SPI_DELAY);
      data <<= 1;
    }
  #endif
}

void sendCommand(uint8_t cmd) {
  digitalWrite(LCD_DC, LOW);
  digitalWrite(LCD_CS, LOW);
  spiTransfer(cmd);
  digitalWrite(LCD_CS, HIGH);
}

void sendData(uint8_t data) {
  digitalWrite(LCD_DC, HIGH);
  digitalWrite(LCD_CS, LOW);
  spiTransfer(data);
  digitalWrite(LCD_CS, HIGH);
}

void setPosition(uint8_t x, uint8_t y) {
  sendCommand(0x40 | y);
  sendCommand(0x80 | x);
}

void initDisplay() {
  digitalWrite(LCD_RST, LOW);
  delay(50);
  digitalWrite(LCD_RST, HIGH);
  delay(150);
  sendCommand(0x21); // on extend cmd
  sendCommand(0xCF); // U stand
  sendCommand(0x04); // Tc compens
  sendCommand(LCD_CONTRAST); // contrast
  sendCommand(0x20); // return base cmd
  sendCommand(0x0C); // on disp w/o cursor
  sendCommand(0x1B); // activate
  delay(10);
}

void fillScreen(uint8_t pattern) {
  for (uint8_t y = 0; y < 9; y++) {
    setPosition(0, y);
    for (uint8_t x = 0; x < 96; x++) {
      sendData(pattern);
    }
  }
}

// ===== main prog =====
void setup() {
  Serial.begin(9600);
  spiInit();
  initDisplay();

  // clear disp
  fillScreen(0x00);

  // output "VITAM" on central
  drawCentered("VITAM");
  delay(5000);
  fillScreen(0x00);
  drawText(0, 0, "HELLO");     // down left position
  drawText(10,20, "1234567890");      // num
  drawCentered("TEST");        // central
  

}

void loop() {
  // xz
  delay(1000);
}

Неактивний

#25 2025-08-14 19:17:50

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 627

Re: Arduino vs LCD Trium Mars трабл

nickjust пише:

-кирилиця не працює

Так у вас у шрифті тільки великі латинські літери та цифри. Навіть знаків пунктуації нема, не то що кирилиці.

nickjust пише:

-текст виводить де попало

А де попало? Я маю на увазі, як співвідносяться координати, які передаєте, з тими, де виводиться насправді?

nickjust пише:

-пробував більший шрифт ..не працює

В якому форматі той інший шрифт? Ви модифікували getChar() та drawText() відповідно до нього?

nickjust пише:

-дзеркалить по Y

Який точно у вас контролер LCD, для которого ця програма? Є на нього даташит? Бо тут уже згадувалось декілька різних контролерів, і незрозуміло, на якому з них проблема з текстом.

Наскільки бачу, ви виводите байти гліфів з шрифта "як є". Якщо це 1-бітний LCD (піксель on/off), то правильно. Якщо ж це кольоровий дисплей, то так не буде працювати. Потрібно відповідно до кожного біта в гліфі виводити піксель (байт або декілька, в залежності від режиму) кольору текста або фона.

Дзеркалить по Y - це ліво з право переплутане, чи верх з низом? Одна картинка з результатом роботи програми допомогла би розібратись.
Потрібно дивитись, які режими автоінкремента у цього контролера. А далі або змінити напрямок автоінкременту, або біти в шрифті перевертати, або бітмап виводити задом наперед, від останнього байта до першого.

Остання редакція dimich (2025-08-14 19:19:04)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму