Ви не увійшли.
Доброго вечора
підключив дисп 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)
Не відображає ніц
Прошу допомоги
Остання редакція nickjust (2025-08-12 18:07:43)
Неактивний
В першу чергу приберіть резистор між землями. Якщо дисплею 3.3 В забагато - заживіть через діод, а краще через LDO на 2.85 В чи adjustable.
Може знов SPI Mode не той?
Для експериментів з LCD з заздалегідь невідомим протоколом набагато зручніше підключити його безпосередньо до компа. Коли запрацює при керуванні з компа, тоді вже підключати до ардуіно чи ще до чогось.
Неактивний
безпосередньо до компа - наприклад?
ну, як на мене, з ардуїною все ж трохи простіше. виконувати оцей генгбенг через LPT адаптер (де його взяти в 2025 році?) те ще збочення
виконувати оцей генгбенг через LPT адаптер (де його взяти в 2025 році?)
LPT я згадав як запасний олдскульний варіант, якщо ніякого USB-адаптера нема.
Доречі, на деяких материнках LPT досі є у вигляді BH-10 BH-26 розʼєму. А якщо нема, то можна поставити.
те ще збочення
Ну, а тикатись навмання, не розуміючи, це у скетчі шось не то, чи баг в бібліотеці, чи на ардуіні пін вигорів, і по сто раз перезаливати прошивку - не збочення?
Остання редакція dimich (2025-08-12 15:03:31)
Неактивний
Жьізнь - боль
але навіть якщо вдасться зробити щось прийнятне на FTDI - як це переносити в мікроконтроллер? з другою системою команд, другими частотами.. Подвійна робота ж.
але навіть якщо вдасться зробити щось прийнятне на FTDI - як це переносити в мікроконтроллер? з другою системою команд, другими частотами..
Не треба нічого переносити. Треба мати reference implementation. Якщо з компа працює, а з ардуіни ні, то завжди можна порівняти, що там відбувається по-різному. І потім дивитись, чому ардуіна видає щось не так як треба.
Те ж саме можна і в зворотньому порядку. Буває, коли імплементую керування LCD на новому контролері з компа, і чомусь не працює, а на ардуіні працює, то дивлюсь, що роблю не так в порівнянні з ардуіною.
Система команд контролера якраз одна й та ж. Частоти значення не мають.
Подвійна робота ж.
Щоб виплюнути десяток команд ініціалізації та пару байтів зображення багато роботи не потрібно.
Неактивний
Коли є reference це спрощує, звичайно. А якщо немає - я не впевнений що запиляти десяток команд ініціалізації на компі сильно простіше ніж зразу на контроллері.
я не впевнений що запиляти десяток команд ініціалізації на компі сильно простіше ніж зразу на контроллері.
Як мінімум, не потрібно кожен раз перезаливати прошивку.
Якщо нема напрацювань для роботи з GPIO з компа, то можна на тій же ардуіні отримувати команди контролера дисплея по Serial та відправляти їх на SPI з відповідним DATA/COMM бітом. А самі команди писати з компа в tty хоч вручну, хоч шелл-скриптом.
Ну, моя справа - запропонувати, а там як хочете.
Неактивний
вибачте ...помилився...в залізі все гуд ініціалізацію написав ,з шрифтами махаюсь
нарахунок тестів LCD , замовив FT232H High-Speed USB Multifunction Module - JTAG UART FIFO SPI I2C Interface.Буду на Phyton тестувати ...так простіще буде...
Неактивний
А можна якийсь приклад, зрозумілий колгоспникам? А то те що гуглиться - в стилі "ну.. можна робити всяке.. програму там написати".. Як на мене, програму під ардуїну написати ще простіше, приклади є прямо в IDE, і вона сама собі програматор.
Неактивний
Цікаві досліди
Я подивився на приклади, як тим ft232h управляти, і мені здалось що це не сильно простіше ніж без нього.
ch341a ще гірший , а можна на RP2040 Bridge зробити...щляхів уеб...сь багато
зараз не можу зробити нормальний вивід тексту на Trium Mars та Siemens LPH9135 (графіку виводить чотко)
Остання редакція nickjust (2025-08-13 16:59:16)
Неактивний
ну раз точки виводить - текст тоже можна мабуть. Взяти будь який шрифт і намалювати по точках. Якщо не упарюватись в аліасінг, це не повинно бути дуже складно
хттпс://github.com/mcufont/mcufont наприклад
правда, я не впевнений що вдасться натягнути це на ардуїну
Для роботи з С-масивами ідеально підходить С. Не зрозумів питання.
А можна якийсь приклад, зрозумілий колгоспникам?
Приклад чого, як працювати з spidev, як реалізувати SPI на GPIO, чи як дригати GPIO-пінами?
Якщо у вас адаптер, для якого є драйвер ядра, що реалізує SPI-контролер (наприклад, CH341A), то прибіндити його до spidev. Зʼявиться /dev/spiN.*, працювати з ним через SPI userspace API. Тільки для SPI-дисплеїв все одно доведеться задіяти GPIO, бо як мінімум ще DATA/COMM треба смикати.
Якщо для адаптера є драйвер, що реалізує GPIO-контролер, то працювати з ним через libgpiod.
Звісно, це під лінуксом. Як там під віндою - не маю жодного уявлення.
Я подивився на приклади, як тим ft232h управляти, і мені здалось що це не сильно простіше ніж без нього.
Вже нема необхідності управляти самою FT232H з userspace, gpio-mpsse більше як півроку в mainline. Прибіндити FT232H до gpio-mpsse, зʼявляється gpiochipN з 16 лініями.
Але якщо дуже хочеться, то можна і з userspace, через libftdi. Та й протокол MPSSE досить простий.
Бачив, є для пайтона всякі pyftdi та python-adafruit-blinka. Але ними користуватись не доводилось, то не знаю, в якому вони там стані.
ch341a ще гірший
З CH341A проблема в тому, що за замовчуванням три піна використовуються як CS, і для GPIO залишається два, один з яких тільки input. Якщо потрібно смикати тільки DATA/COMM, то цього достатньо. Якщо хочеться ще GPIO, наприклад, для RST, то треба поправити таблицю в коді та перезібрати драйвер. Все руки не дійдуть реалізувати цю конфігурацію у вигляді параметра.
Ну і CH341A повільний, навіть в апаратно реалізованому SPI mode 0. Програмна емуляція mode 1-3 ще повільніша. Але для тестів та експериментів достатньо.
Остання редакція dimich (2025-08-14 14:43:19)
Неактивний
зараз не можу зробити нормальний вивід тексту на Trium Mars та Siemens LPH9135
В якому він у вас режимі кольорів? Ви ж враховуєте, що при 12bpp непарні пікселі попадають на середину байта? Хоча, якщо пікселі виводяться правильно, то, мабуть, враховуєте. Тоді покажіть, як виглядає "ненормальний" вивід тексту. Ну і код покажіть, яким виводите.
Неактивний
наприклад, CH341A
Доречі, у CH341A ще є режим IEEE-1284, тобто емуляція LPT-порта. Можна реалізувати SPI bitbang через parport API -> CH341A -> SPI/GPIO -> дисплей. Але з цим режимом я колись побавився, світлодіодами поблимав, і забив.
Неактивний
Що не до вподоби
-кирилиця не працює
-текст виводить де попало
-пробував більший шрифт ..не працює
-дзеркалить по 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);
}
Неактивний
-кирилиця не працює
Так у вас у шрифті тільки великі латинські літери та цифри. Навіть знаків пунктуації нема, не то що кирилиці.
-текст виводить де попало
А де попало? Я маю на увазі, як співвідносяться координати, які передаєте, з тими, де виводиться насправді?
-пробував більший шрифт ..не працює
В якому форматі той інший шрифт? Ви модифікували getChar() та drawText() відповідно до нього?
-дзеркалить по Y
Який точно у вас контролер LCD, для которого ця програма? Є на нього даташит? Бо тут уже згадувалось декілька різних контролерів, і незрозуміло, на якому з них проблема з текстом.
Наскільки бачу, ви виводите байти гліфів з шрифта "як є". Якщо це 1-бітний LCD (піксель on/off), то правильно. Якщо ж це кольоровий дисплей, то так не буде працювати. Потрібно відповідно до кожного біта в гліфі виводити піксель (байт або декілька, в залежності від режиму) кольору текста або фона.
Дзеркалить по Y - це ліво з право переплутане, чи верх з низом? Одна картинка з результатом роботи програми допомогла би розібратись.
Потрібно дивитись, які режими автоінкремента у цього контролера. А далі або змінити напрямок автоінкременту, або біти в шрифті перевертати, або бітмап виводити задом наперед, від останнього байта до першого.
Остання редакція dimich (2025-08-14 19:19:04)
Неактивний