Raspberry Pi: TFT дисплей с SPI интерфейсом

У Raspberry Pi есть встроенное графическое ядро, которое позволяет без проблем подключать к этому микрокомпьютеру самые обычные мониторы и телевизоры по HDMI интерфейсу. Но к RPi можно подключить множество более дешевых и миниатюрных дисплеев, которые могут быть более уместными для небольшого DIY-проекта.

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

TFT-дисплей 2.4" SPI с контроллером ILI9341 — вид спереди

На обратной стороне виден разъём для SD-карты и драйвер сенсорной резистивной плёнки. Дисплеи с разрешениями более 2,2 дюйма как правило попадаются в двух исполнениях: с сенсорной панелью и без.

TFT-дисплей 2.4" SPI — вид сзади, разъём SD-карты и драйвер сенсорной плёнки

Примечание

Диагональ дисплея составляет 2,4 дюйма при разрешении 320×240 пикселей. Контроллер, как уже говорилось, ILI9341.

Чтобы повторить всё, что делается в данной статье понадобится:

Совет

Подключение

Дисплей подключается по SPI интерфейсу. Схема подключения:

Raspberry Pi

GND

3.3V

MOSI(GPIO10)

MISO(GPIO09)

CLK(GPIO11)

GPIO2

GPIO3

GPIO4

Дисплей

GND

VCC

SDI(MOSI)

SDO(MISO)

SCK

DC

RESET

LED

Важно

Контакты DC, RESET и LED можно подключить к любым свободным GPIO контактам Raspberry Pi, а вот SDI, SDO и SCK только к указанным.

Установка драйвера для работы с TFT

Драйвер, который мы используем в данной статье, существует в виде исходного кода в репозитории github. Чтобы им воспользоваться, нам предстоит его скомпилировать в исполняемый файл.

Установим утилиту cmake, которая поможет подготовить необходимые для компиляции файлы:

sudo apt-get install cmake

Затем загрузим из репозитория исходные коды драйвера. Лучше это делать в домашней папке пользователя pi.

cd ~
git clone https://github.com/juj/fbcp-ili9341.git

Зайдем в загруженную папку и создадим в ней подпапку build:

cd fbcp-ili9341
mkdir build
cd build

Теперь самое главное. Нам нужно запустить cmake, указав кучу параметров для нашего TFT-дисплея. Готовая строка для запуска может выглядеть так:

cmake -DILI9341=ON -DGPIO_TFT_DATA_CONTROL=2 -DGPIO_TFT_RESET_PIN=3 -DGPIO_TFT_BACKLIGHT=4 -DSPI_BUS_CLOCK_DIVISOR=30 -DSTATISTICS=0

Поясню параметры.

Примечание

-DILI9341=ON — собирает версию драйвера именно для ili9341. Но данный пакет поддерживает и другие модели дисплеев: DILI9340, HX8357D, SSD1351, ST7735R. ST7789, ST7789VW, ST7735S, ILI9486, ILI9486L, MPI3501. То есть можно работать практически с каждым популярным дисплеем.

Следующие три параметра определяют контакты Raspberry Pi, к которым подключены служебные сигналы дисплея:

Подсказка

  • -DGPIO_TFT_DATA_CONTROL=2 — это пин DC, который мы подключили к GPIO2;

  • -DGPIO_TFT_RESET_PIN=3 — сброс RESET (к GPIO3);

  • -DGPIO_TFT_BACKLIGHT=4 — подсветка LED (к GPIO4).

Последний параметр по сути задаёт скорость работы шины SPI, определяя делитель частоты:

Совет

-DSPI_BUS_CLOCK_DIVISOR=30

Для первого запуска можно уставить делитель 30. Затем, стоит попробовать уменьшать это число вплоть до 6, или до значения при котором дисплей начнёт глючить.

Примечание

-DSTATISTICS=0 — убираем отладочную информацию сверху дисплея.

Запустим команду cmake с указанными параметры. После завершения работы cmake запустим компилятор, который и соберет нам всё вместе в бинарный файл:

make -j

единственный параметр -j позволит ускорить сборку исполняемого файла за счёт распараллеливания процесса по ядрам процессора.

После завершения работы make, в папке build должен появиться файл fbcp-ili9341. Запускаем его:

sudo ./fbcp-ili9341

Вот и всё. Дисплей в деле!

Raspberry Pi с подключённым TFT-дисплеем 2.4" по SPI — рабочий стол на дисплее

Мелкий шрифт на дисплее

Без дополнительных телодвижений текст на дисплее будет не очень чётким. Почему так? Все дело в том, что Raspberry Pi формирует картинку в разрешении, отличном от разрешения такого мелкого tft-дисплея. Драйвер сам производит масштабирование (очень быстро, с использованием GPU), и шрифты при этом немного портятся.

Чтобы избежать масштабирования драйвером, нужно настроить RPi таким образом, чтобы картинка изначально формировалась в нужном разрешении. В таком случае и шрифт будут выглядеть читабельнее.

Открываем в редакторе файл настроек:

sudo nano /boot/config.txt

Находим там строку:

#uncomment to force a specific HDMI mode (this will force VGA)

Сразу после неё добавляем:

hdmi_group=2
hdmi_mode=87
hdmi_cvt=320 240 60 1 0 0 0
hdmi_force_hotplug=1

Сохраняем и перезагружаем Raspberry Pi. Теперь при запуске утилиты fbcp-ili9341 мы получим примерно такое:

TFT-дисплей с чётким шрифтом после настройки hdmi_cvt в /boot/config.txt

Совет

Ну вот, гораздо лучше!

Полезные ссылки

Подробное описание драйвера на github: