У Raspberry Pi есть встроенное графическое ядро, которое позволяет без проблем подключать к этому микрокомпьютеру самые обычные мониторы и телевизоры по HDMI интерфейсу. Но к RPi можно подключить множество более дешевых и миниатюрных дисплеев, которые могут быть более уместными для небольшого DIY-проекта.
В этой статье мы подробно разберем подключение популярного TFT-дисплея с контроллером ILI9341. Существует несколько вариантов модулей с таким дисплеем, отличающихся внешним видом и разрешением. Мы будем работать с таким экземпляром:
На обратной стороне виден разъём для SD-карты и драйвер сенсорной резистивной плёнки. Дисплеи с разрешениями более 2,2 дюйма как правило попадаются в двух исполнениях: с сенсорной панелью и без.
Диагональ дисплея составляет 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-дисплея. Драйвер сам производит масштабирование (очень быстро, с использованием 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 мы получим примерно такое:

Полезные ссылки
Подробное описание драйвера на github: