Raspberry Pi: работа с OLED дисплеем

OLED дисплей — отличный графический индикатор, который подойдет для многих DIY-проектов, где необходимо следить за какими-нибудь параметрами системы, наблюдать течение процессов или даже играть. Ранее мы уже подключали OLED дисплей к Arduino, и даже делали игровую консоль для игры в подобие Space Invaders.

Вот так выглядит OLED дисплей с матрицей размером 0,96 дюйма и контроллером SSD1306.

Сегодня мы будем разбираться, как работать с OLED на Raspberry Pi 4, хотя подойдет и любая другая версия, даже Zero. Для урока нам понадобится сам микрокомпьютер, блок питания с током не менее 3А и SD-карта памяти объёмом не менее 16 Гб. Разумеется, модуль OLED дисплея и немного проводов, чтобы соединить их вместе.

В корзину
В корзину
В корзину
В корзину
В корзину

Подключение OLED к Raspberry Pi

У платы Raspberry Pi 4 есть все самые популярные интерфейсы, так что для подключения OLED можно использовать как SPI, так и I2C. В этом примере мы остановимся на подключении по I2C шине. Соединяем два устройства по следующей схеме.

Raspberry Pi 4GND3.3VSDA(GPIO02)SCL(GPIO03)
OLED 0,96 ROCGND3.3SDASCL

Однако, если потребуется подключить дисплей по SPI, вот схема:

Raspberry Pi 4 GND 3.3V MOSI(GPIO10)MISO(GPIO09)CLK(GPIO11)GPIO4GPIO5
OLED 0,96 ROC GND 3.3 SDADCSCLRSTCS

Установка библиотеки Python для работы с SSD1306

Для написания программы будем использовать язык Python, следовательно, нам нужно установить библиотеку Python для работы с OLED. Причём, OLED бывают разные, с разными контроллерами. Поскольку мы работаем с SSD1306, то и библиотеку подбираем подходящую.

Все последующие действия осуществляем с помощью командной строки. Для этого можно использовать программу-терминал с рабочего стола Raspberry Pi OS, либо SSH соединение.

Устанавливаем библиотеку для работы с дисплеями на контроллере SSD1306.

pip3 install adafruit-circuitpython-ssd1306

Также установим библиотеку PIL, которая пригодится для углублённой работы с изображениями. Предварительно обновим репозиторий пактов операционной системы.

sudo apt-get update
sudo apt-get install python3-pil

И еще одна настройка. Поскольку мы подключаем OLED дисплей по I2C шине, нам нужно её включить в настройках Raspberry, а ещё увеличить скорость обмена по этой шине.

Итак, первое действие. Заходим в настройки Raspberry командой:

sudo raspi-config

Переходим а раздел 5 Interfacing options затем в подраздел P5 I2C и жмём кнопку Yes. Выходим из настроек нажатием кнопки Finish.

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

sudo nano /boot/config.txt

И дописываем в конце строку:

dtparam=i2c_baudrate=1000000

Теперь скорость обмена по I2C у нас будет 1МГц. Сохраняем файл комбинацией клавиш Ctrl+O и выходим из редактора Ctrl+X.

Готово! Теперь перезагружаем систему и переходим к написанию программы.

sudo reboot

Программа для OLED дисплея

Итак, после перезагрузки системы снова заходим в консоль и создаем Python-скрипт:

cd /home/pi
touch oled.py

Открываем его в редакторе:

nano oled.py

И пишем такой код:

import board
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306

# разрешение дисплея
WIDTH = 128
HEIGHT = 64

# ширина рамки
BORDER = 2

# инициализация шины I2C и дисплея с адресом 0x3D
i2c = board.I2C()
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3D)

# заливаем экран черным цветом
oled.fill(0)
oled.show()

# будем работать с буфером экрана из библиотеки PIL
# первый параметр - цветность дисплея, для монохромного - 1
image = Image.new("1", (oled.width, oled.height))

# draw будет нашим карандашем, которым мы будем рисовать на экране
draw = ImageDraw.Draw(image)

# рисуем прямоугольник белого цвета во весь экран
draw.rectangle((0, 0, oled.width, oled.height), outline=255, fill=255)

# рисуем прямоугольник поменьше черным цветом, так мы создаем контурную рамку
draw.rectangle(
    (BORDER, BORDER, oled.width - BORDER - 1, oled.height - BORDER - 1),
    outline=0,
    fill=0,
)

# загружаем стандартный шрифт
font = ImageFont.load_default()

# пишем текст в центре экрана
text = "RobotClass"
(font_width, font_height) = font.getsize(text)
draw.text(
    (oled.width // 2 - font_width // 2, oled.height // 2 - font_height // 2),
    text,
    font=font,
    fill=255,
)

# выводим буфер изображения на дисплей
oled.image(image)
oled.show()

Запускаем программу с помощью интерпретатора python:

python3 oled.py

Если всё было сделано правильно, получаем ожидаемый результат.


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.