Підключаємо RGB888 дисплей по DPI до Raspberry Pi!
Опубліковано 05.08.2025, 17:01 в категорії YouTube
В будь якої людини яка займається електронікою або ремонтами, крізь роки збирається просто купа непотрібну. В мене наприклад є ціла купа екранчиків з різних пристроїв. Викинути їх шкода, а повторно використати або дуже складно, або навіть неможливо. Але в даному відео я покажу як можна підключити ось такий 40-ка піновий дисплей прямо до Raspberry Pi.
Наявність 40-ка пінового шлейфу скоріше за все вказує на те, що цей дисплей працює в 24-х бітному паралельному RGB режимі, або ж RGB888. Це означає що окрім низки інших контактів керування, на ньому є аж 24 контакти для передачі кольору. Тобто в одиницю часу передається 24 біти інформації — по 8 біт на кожен з трьох кольорів - червоний, зелений, та синій. Такий тип керування ще називається DPI - Display Parallel Interface, і на наше щастя, Raspberry Pi вміє з ним працювати без всяких додаткових модулів або мікросхем!
Але все таки кількість пінів на шлейфі це не 100% гарантія того, що це саме DPI, тому необхідно знайти даташит на дисплейчик. Підказки що саме шукати зазвичай знаходяться прямо на шлейфі дисплея. Мені вдалось знайти ось такий ось даташит, який підтверджує наші здогадки стосовно 24-х бітного режиму. Також в цьому даташиті є і распіновка дисплея, яка допоможе нам під'єднати дисплей до Raspberry Pi, хоча зазвичай в таких дисплейчиків распіновка однакова:
PIN № | Символ | I/O | Опис |
---|---|---|---|
1 | LED- | P | Катод підсвітки |
2 | LED+ | P | Анод підсвітки |
3 | GND | P | Мінус живлення, GND |
4 | VDD | P | Плюс живлення, +3.3В |
5-12 | R0-R7 | I | Дані червоного кольору |
13-20 | G0-G7 | I | Дані зеленого кольору |
21-28 | B0-B7 | I | Дані синього кольору |
29 | GND | P | Мінус живлення, GND |
30 | DCLK | I | Pixel clock, Тактування пікселів |
31 | DISP | I | ВКЛ/ВИКЛ Дисплея |
32 | HSYNC | I | Горизонтальна синхронізація |
33 | VSYNC | I | Вертикальна синхронізація |
34 | DEN | I | Data enable, Увімкнення даних |
35 | NC | - | Не підключено |
36 | GND | P | Мінус живлення, GND |
37 | XR | - | Сенсорна панель |
38 | YD | - | Сенсорна панель |
39 | XL | - | Сенсорна панель |
40 | YU | - | Сенсорна панель |
Тож можна впевнитись в тому що це потрібний дисплей по першим двом та останнім чотирьом контактами - там повинна бути підсвітка, та місце під резистивну сенсорну панель.
А стосовно Raspberry Pi, існує дуже зручний сайт, pinout.xyz, де можна подивитись зручну розпіновку, тобто що куди підключати, для різних речей: наприклад як підключити SD карту, або щось по I2C шині, або, як раз як в нашому випадку - дисплей через Display Parallel Interface. Тобто просто відкриваємо даташит дисплея, і дивимось що куди повинно підключатись. Також підключаємо живлення дисплея, GND до GND, а VDD до +3.3В. DISP, який відповідає за вмикання та вимикання дисплея, слід також підключити до +3.3В, так як вільних GPIO під нього в нас немає. Останні 4 контакти, як я вже й казав, відповідають за резистивний сенсор, тому їх підключати не треба. А про перші два, підсвітку, поговоримо пізніше.
Тобто наразі наша задача правильно під'єднати все до Raspberry Pi. Припаюватись до шлейфа не сама краща ідея, тому раджу використати ось таку ось платку, яка перетворить SMD шлейф на звичайний DIP з кроком 2.54.
Це значно спростить роботу зі шлейфом дисплея, і можна не боятись його пошкодити. Єдине що варто зазначити, що через те що шлейф підключається догори дриґом, правильна нумерація контактів буде на зворотній стороні плати.
Щоб під'єданти потім все це до Raspberry Pi, я взяв штирьовий роз'єм, який ідеально підходить до контактної гребінки Raspberry Pi. Ну і для зручності я вирішив розмістити все це на невеличкій макетній платі розміром 4 на 6 см.
Отже, озброюємось даташитом дисплея, разпіновкою Raspberry Pi, паяльником, та паяємо все до купи. В мене вийшло якось так.
Якщо будете повторювати таке, то раджу обрати якийсь дріт з дуже тонкою ізоляцією. Я використовував AWG26, і як бачите місця тут взагалі не лишилось, бо він має доволі товсту ізоляцію. Дуже часто доводилось відпаювати вже запаяні дроти, щоб запаяти інший. Тож для таких задач мабуть краще підійшло б щось на кшталт МГТФ, або якийсь інший монтажний дріт.
Особисто я це все роблю чисто щоб протестувати екранчик, бо я не впевнений в його працездатності, тому мене влаштовує і ось такий варіант. Але для постійного використання ясна річ що потрібно щось більш якісне та надійне, тому я хотів спроєктувати плату для цих задач, але як виявилось, плати вже давно існують. Наприклад ось є від othermod. Вони продають такі плати, але не дивлячись на це, все одно виклали їх гербер файл у відкритий доступ. Тому будь хто може завантажити його, і зробити собі плати, бо як раз на сайті othermod вони зараз не в наявності. А замовити їх можна наприклад на PCBWay.
Підсвітка дисплея
Тепер коли основні з'єднання зроблені, час поговорити про доволі каверзне місце - підсвітку дисплея. Давайте знайдемо якусь інформацію про неї в даташиті:
Як бачимо, в моєму випадку це 8 послідовно з'єднаних світлодіодів. Якщо припустити що там стоять білі світлодіоди з напругою переходу 3В, то для нормального функціонування такої стрічки діодів потрібно аж 24В! Але напруга в даному випадку це найменша з проблем, для світлодіодів важливіше струм. Підсвітку треба забезпечити стабільним струмом. Для цих задач зазвичай використовують спеціалізовані драйвери підсвітки. Порившись в своїх запасах SMD деталей, я знайшов ось таку мікросхемку - LTYN. Або ж в перекладі з SMD-шної - LT1937ES5.
Це спеціалізований драйвер для живлення підсвітки напругою 36В. Він забезпечить її стабільним струмом, що позитивно вплине на довговічність світлодіодів, якість пісдвітки, і при цьому це буде доволі енергоефективно. Але так як дістати в нас цю мікросхему не дуже то й просто, було б не чесно якби я використав її просто тому що вона в мене є. Тому буде легкий і доступний, але менш ефективний та надійний спосіб - а саме живити світлодіоди підсвітки від звичайного DC DC перетворювача, і обмежувати струм резистором.
Це мабуть так собі вплине на стабільність та довговічність світлодіодів, але зато підвищувальний DC-DC перетворювач точно знайдеться в будь якого електронщика вдома. Або його можна навіть власноруч зробити, як я показував в статті про VFD індикатори.
Спочатку я виставив 24 вольти на DC-DC перетворювачі, після чого підібрав резистор, з яким струм живлення підсвітки буде максимально близький до струму зазначеного в даташиті - 7 мА. Хоча як виявилось пізніше, там йшлась мова про зовсім інший струм, і для світлодіодів підійде струм в діапазоні 20-35 мА, хоча навіть при 9 мА, яскравості підсвітки мого дисплея вистачає для використання в приміщенні. Підібравши номінал резистора, я припаяв все до нижньої сторони макетної плати.
Налаштовуємо Raspberry Pi
Тепер дисплей повністю готовий до підключення. Але, робити це поки що немає сенсу, так як нам ще треба налаштувати Raspberry Pi. Для цього треба відредагувати файл config.txt
який знаходиться в директорії /boot/
накопичувача Raspberry Pi, я використав vim:
sudo vim /boot/config.txt
Перш за все впевнюємось що в нас відключені різні шини типу I2C, SPI, і тд. Їх необхідно вимкнути, так як дисплей займає всі GPIO піни. Можна або видалити або закоментувати строки:
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on
Хоча на сайті othermod написано що можна не підключати HSYNC та VSYNC, і тим самим звільнити I2C шину, але особисто в мене дисплей при такому підключенні не працював. Можливо я щось не так зробив в налаштуваннях. Далі вимикаємо стандартний відеодрайвер, і на його місце додаємо драйвер для DPI дисплеїв:
#dtoverlay=vc4-kms-v3d
dtoverlay=vc4-kms-dpi-generic
Після цього треба всі піни налаштувати як другий альтернативний режим, a2, яким якраз і є Display Parallel Interface:
gpio=0-27=a2
Ну і тепер можна налаштувати сам DPI. Спочатку треба налаштувати розмір фреймбуфера, відповідно до роздільної здатності вашого дисплея. Далі включити сам DPI, і назначити цей дисплей як основний. Ну і найскладніше - формат виводу та тайминги:
framebuffer_width=480
framebuffer_height=272
enable_dpi_lcd=1
display_default_lcd=1
dpi_output_format=0x7f017
dpi_timings=480 0 5 0 40 272 0 8 0 8 0 0 0 60 0 9600000 3
dpi_output_format
Стосовно формату виводу - число яке ви бачили вище, 0x7f017
, це 32-х бітне число. Якщо перевести його в двійковий формат, то ми отримаємо наступне число, в якому кожен біт щось значить:
1111111000000010111
Наприклад перші 4 біти (найправіші), визначають режим роботи дисплея - 24-х бітний, або 16-ти бітний, і тд:
1111111000000010111
- 0001: 9BIT 666
- 0010: 16BIT 565 CFG1
- 0011: 16BIT 565 CFG2
- 0100: 16BIT 565 CFG3
- 0101: 18BIT 666 CFG1
- 0110: 18BIT 666 CFG2
- 0111: 24BIT 888
Наступні 4 біти - порядок кольору, тобто RGB, або BGR, або GRB, і так далі:
111111100000001
0111
- 0001: RGB
- 0010: BGR
- 0011: GRB
- 0100: BRG
А всі наступні біти, це конфігураційні біти, які вказують особливості роботи дисплея, наприклад чи інвертовані там HSYNC, VSYNC, DE, або коли саме вони активні - на фронті імпульсу чи на спаді. Це все зазвичай можна подивитись в даташиті, або визначити експериментальним шляхом - наприклад якщо у вас дивно виглядають кольори, то вочевидь треба змінити порядок кольорів, і так далі. Тобто треба скомпонувати двійкове число, і перевести його потім в шістнадцяткове або десяткове, і вказати в конфігу. Ось таблиця, в якій розписана інформація про кожний біт:
Параметр | Значення | Ширина |
---|---|---|
Формат виводу | 0b0001: 9BIT 666 | 4 біти |
0b0010: 16BIT 565 CFG1 | ||
0b0011: 16BIT 565 CFG2 | ||
0b0100: 16BIT 565 CFG3 | ||
0b0101: 18BIT 666 CFG1 | ||
0b0110: 18BIT 666 CFG2 | ||
0b0111: 24BIT 888 | ||
Кодування кольору | 0b0001: RGB | 4 біти |
0b0010: BGR | ||
0b0011: GRB | ||
0b0100: BRG | ||
Режим синхронізації | 0: DE mode /1: HVsync mode | 1bit |
Полярність Pixel Clock | 0: Idle high /1: Idle low | 1bit |
Відключити Hsync | 0: Enable/ 1: Disable | 1bit |
Відключити Vsync | 0: Enable/ 1: Disable | 1bit |
Відключити DE | 0: Enable/ 1: Disable | 1bit |
Полярність Hsync | 0: Normal/ 1: Inverted | 1bit |
Полярність Vsync | 0: Normal/ 1: Inverted | 1bit |
Полярність DE | 0: Normal/ 1: Inverted | 1bit |
Фаза Hsync | 0: Rising edge/ 1: Falling edge | 1bit |
Фаза Vsync | 0: Rising edge/ 1: Falling edge | 1bit |
Фаза DE | 0: Rising edge/ 1: Falling edge | 1bit |
Ось кілька прикладів можливих конфігурацій даного параметра:
#1111111000000010111
dpi_output_format=0x7f017
#1101111000000010111
dpi_output_format=0x6f017
#1111011000000100111
dpi_output_format=0x7b027
#1101111000000010101
dpi_output_format=0x6f015
dpi_timings
Наступний параметр - таймінги. Він має приблизно ось такий формат, і заповнюється теж виходячи з інформації з даташиту:
Назва | Опис / величина |
---|---|
Horizontal active | pixels |
Horizontal sync polarity | 0: Low active/ 1: High active |
Horizontal front porch | cycles |
Horizontal sync width | cycles |
Horizontal back porch | cycles |
Vertical active | lines |
Vertical sync polarity | 0: Low active/ 1: High active |
Vertical front porch | cycles |
Vertical sync width | cycles |
Vertical back porch | cycles |
Vertical sync offset A | - |
Vertical sync offset B | - |
Pixel repitition | - |
Frame rate | Hz |
Interleave | frames |
Pixel rate | Hz |
Aspect ratio | 1:4:3 |
2:14:9 | |
3:16:9 | |
4:5:4 | |
5:16:10 | |
6:15:9 | |
7:21:9 | |
8:64:27 |
Більшість інформації береться з розділу Timing Characteristics даташиту дисплея. Давайте розберемо використані мною таймінги:
dpi_timings=480 0 5 0 40 272 0 8 0 8 0 0 0 60 0 9600000 3
- 480 - Кількість пікселів по горизонталі
- 0 - Полярність HSYNC (0 = активний при логічному нулі)
- 5 - Горизонтальний передній інтервал (5 циклів, Thfp з даташиту дисплея)
- 0 - Тривалість горизонтального синхроімпульсу (0 циклів, не впевнений чому саме))00 )
- 40 - Горизонтальний задній інтервал (40 циклів, Thbp з даташиту дисплея)
- 272 - Кількість ліній (пікселів) по вертикалі
- 0 - Полярність VSYNC (0 = активний при логічному нулі)
- 8 - Вертикальний передній інтервал (8 циклів, Tvfp з даташиту дисплея)
- 0 - Тривалість вертикального синхроімпульсу (0 циклів, знову таки, не знаю чому))00 )
- 8 - Вертикальний задній інтервал (8 циклів, Tvbp з даташиту дисплея)
- 0 - Vertical sync offset A - Не використовується
- 0 - Vertical sync offset B - Не використовується
- 0 - Pixel repitition - Не використовується
- 60 - Частота оновлення дисплея в герцах (Frames Per Second, кадрів на секунду)
- 0 - Чергування рядків (Черезрядкова розгортка?) - не впевнений коли це потрібно, нехай буде 0
- 9600000 - частота виводу пікселів в Гц (9.6 МГц, fclk з даташиту дисплея)
- 3 - Співвідношення сторін дисплея (з таблиці, 3 = 16:9. Можна визначити з роздільної здатності: 470/272 ~= 16/9)
Тож відкриваєте даташит вашого дисплея, та заповнюєте по черзі кожний параметр. Але доволі часто таймінги співпадають між дисплеями, наприклад я взяв їх з репозиторія othermod, і в мене все працює як слід. Що output_format, що таймінги, так собі задокументовані в офіційній документації Raspberry Pi, тому додалось додатково шукати різну інформацію по форумам, і тд. Більшість інформації стосовно цих параметрів була взята з ось цього сайту.
Зберігаємо файл, вимикаємо Raspberry Pi, і нарешті можна підключати дисплей. Трішки боязно звісно підключати таке до Raspberry Pi, але сподіваюсь все буде гаразд. Подаємо живлення, і дивимось чи працює дисплей.
Чудово! Дуже приємно бачити, як після такої кропіткої пайки десятків дротів, все чудово працює. Щоправда, дисплей таки виявився трішки проблемним - присутня горизонтальна лінія з таких собі битих чи мертвих пікселів. Дуже сумно звісно, але що ж поробиш.
Головне що все інше працює без проблем. Цей дисплей до речі сприймається Raspberry Pi як звичайний повноцінний дисплей, тому в мене тут наприклад можна побачити стандартний prompt на логін в Linux, бо в мене тут встановлений Arch Linux ARM без графічного середовища. Якщо ж у вас встановлено Raspberry Pi OS, то ви мабуть побачили б її звичний Desktop Environment.
Тож тепер цим дисплеєм можна користуватись як вам тільки заманеться. Наприклад я поставив сюди Xorg, та встановив віконний менеджер i3wm, і цим всім тепер можна користуватись як і на звичайному комп'ютері.
Наприклад можна переглядати відео, або наприклад запустити Doom, та інші ігри. Ну або використовувати дисплей для відображення різного роду корисної інформації.
Доцільність такого рішення
Ну і тепер найголовніше - наскільки все це було доцільно. Якщо ви хочете прям по максимуму зекономити, то такий варіант дійсно має право на життя, адже такі дисплейчики можна купити досить задешево на AliExpress. Також, якщо у вас вже є такий дисплей, використати його теж доволі гарна ідея, адже потрібно всього лише замовити або спаяти плату перехідник. Ну і на додачу він виходить ще й більш енергоефективним, так як тут немає додаткових мікросхем між дисплеєм та одноплатним комп'ютером.
Але і в вже готових рішень також є свої переваги - вони більш охайно та надійно виглядають, часто мають кращу роздільну здатність, яскравість підсвітки та кути огляду, ну і також не займають всі GPIO піни. Тож обирайте що буде найкращим для вас.
Мені в цілому сподобалось що вийшло, і в мене вже є деякі цікаві плани на цей дисплейчик, але мабуть я таки спроєктую і замовлю для нього свою плату, з якимось більш поширеним в нас драйвером підсвітки.
Post Scriptum
Це текстова версія мого відео, доступного за ось цим посиланням.