Использование OLED-дисплея SSD1315 с Raspberry Pi Pico

Использование OLED SSD1315 с Raspberry Pi Pico

Несколько недель назад в продаже появился интересный новый OLED-дисплей от Waveshare — двухцветный SSD1315 с диагональю 0,96 дюйма.

Помимо оригинального двухцветного исполнения, нас немного смущало использование драйверного чипа SSD1315 вместо значительно более распространённого SSD1306, под который за эти годы накопилось множество библиотек и поддержки.

Мы думали, что это затруднит поиск подходящих библиотек, однако выяснилось, что можно использовать существующие библиотеки для SSD1306 — с небольшими правками.

Waveshare на данный момент не предоставляет примеров подключения и кода для использования этого OLED SSD1315 с Raspberry Pi Pico, поэтому мы сами разобрались с этим!

Что потребуется

Данное руководство основано на модуле 0,96» OLED Display Module — верхняя часть жёлтая / нижняя синяя (128×64), который продаётся в магазине, однако оно, скорее всего, подойдёт для любого SSD1315 OLED.

Вам также понадобится Raspberry Pi Pico и кабель Micro-USB.

Подключение можно выполнить любым удобным способом. Можно воспользоваться комплектом перемычек, входящим в комплект поставки дисплея, и подключить его напрямую к контактам Pico, либо использовать макетную плату и перемычки «папа — папа», как это сделали мы.

Компоненты для подключения SSD1315 к Pico

Настройка режима I2C

Используемый нами дисплей поддерживает как режим SPI, так и режим I2C (если вы используете другой дисплей, этот шаг может не потребоваться). Режим выбирается в зависимости от расположения миниатюрных SMT-резисторов на задней панели дисплея.

По умолчанию дисплей настроен на режим SPI. Поскольку нам никогда особо не везло с SPI при работе с такими OLED на Pico, мы переключили наш дисплей в режим I2C (обновление — Тони заставил этот дисплей работать по SPI, посмотрите его руководство!)

Чтобы перевести дисплей в режим I2C, возьмите паяльник, разогрейте резистор R1 (выделен на изображении ниже) и снимите его с помощью пинцета или аналогичного инструмента. Возможно, удастся просто откусить его точными диагональными кусачками, но правильный способ — всё же пайка.

Резистор выбора адреса SSD1315

Подключение схемы

Независимо от того, используете ли вы макетную плату или подключаетесь напрямую к контактам Pico — соединения одинаковые и требуют всего четырёх проводов. В таблице ниже показано, какой контакт дисплея к какому контакту Pico подключается:

Дисплей

Pico

VCC

Pin 40 (VBUS)

GND

Pin 38 (GND)

DIN

Pin 1 (SDA)

CLK

Pin 2 (SCL)

Ниже приведена схема подключения Fritzing для уточнения расположения контактов:

Схема подключения SSD1315 OLED к Pico (Fritzing)

Установка библиотеки MicroPython SSD1306

Мы используем MicroPython и Thonny

Для написания кода мы будем использовать MicroPython, а значит — работать в среде Thonny.

Предполагается, что вы знакомы с Thonny и всё уже настроено. Если нет — обратитесь к руководству по началу работы с Raspberry Pi Pico, где есть всё необходимое.

Установка библиотеки

Для работы дисплея необходимо установить библиотеку. Не дайте названию ввести вас в заблуждение — хотя мы используем OLED-дисплей SSD1315, библиотека SSD1306 работает с ним — нужно лишь немного настроить её после установки.

Порядок действий:

  • В Thonny в верхнем меню выберите Tools > Manage packages

  • В строке поиска введите micropython-ssd1306 и нажмите кнопку поиска

  • Выберите вариант micropython-ssd1306 (обычно в начале списка)

  • Нажмите Install

Редактирование библиотеки MicroPython SSD1306

По умолчанию библиотека SSD1306 ищет I2C-адрес 0x3C, поскольку именно его обычно используют большинство модулей SSD1306.

Наш нестандартный OLED SSD1315, с резисторами/контактными площадками на задней панели в таком исполнении, использует адрес 0x3D. Если не сообщить об этом библиотеке, она не будет работать (в противном случае вы увидите сообщение об ошибке OSError: [Errno 5] EIO).

В левой части окна Thonny должны появиться файлы библиотеки после её добавления. Откройте файл ssd1306.py, дважды щёлкнув по нему:

Редактирование библиотеки MicroPython ssd1306

Прокрутите открывшийся файл вниз и найдите раздел ниже — блок кода под названием class SSD1306_I2C.

Видите адрес 0x3C, который мы выделили стрелкой? Измените его на 0x3D, затем сохраните файл и закройте его. Это всё, что нужно изменить.

Изменение адреса в библиотеке MicroPython SSD1306

Код

Запустим очень простую демонстрационную программу, просто чтобы убедиться, что всё работает, — а затем вы можете писать код под нужды своего проекта.

Мы повторно использовали код из нашей записи блога «Maker Advent Calendar Day #11», лишь изменив размер OLED (128×64) и добавив большие отступы, чтобы текст отображался в разных цветах, которые предлагает этот дисплей.

Скопируйте код ниже в Thonny, затем нажмите зелёную кнопку для запуска:

# Imports
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time

# Set up I2C and the pins we're using for it
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

# Short delay to stop I2C falling over
time.sleep(1)

# Define the display and size (128x32)
display = SSD1306_I2C(128, 64, i2c)

# Clear the display first
display.fill(0)

# Write a line of text to the display
display.text("Hello Yellow!",0,0)
display.text("Hello Blue!",0,17)
display.text("Hello Blue!",0,27)
display.text("Hello Blue!",0,37)
display.text("Hello Blue!",0,47)
display.text("Hello Blue!",0,57)

# Update the display
display.show()

Как это работает

Сначала мы импортируем всё необходимое, включая установленную и настроенную библиотеку SSD1306:

# Imports
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import time

Эти строки настраивают I2C с небольшой задержкой после, которая необходима, чтобы он не «капризничал» и не вылетал:

# Set up I2C and the pins we're using for it
i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

# Short delay to stop I2C falling over
time.sleep(1)

Затем мы сообщаем программе, какой дисплей используем. Ну, не совсем!

Мы немного лукавим и говорим, что используем SSD1306, поскольку именно этого ожидает библиотека, но она прекрасно работает с нашим SSD1315 благодаря нашим правкам. Кроме того, здесь мы определяем размер (128×64) и тип связи (I2C):

# Define the display and size (128x32)
display = SSD1306_I2C(128, 64, i2c)

Мы всегда сначала очищаем дисплей, на случай если с предыдущего запуска что-то осталось:

# Clear the display first
display.fill(0)

Затем мы указываем дисплею, что хотим показать. В этом простом примере мы просто выводим строки текста одну за другой.

Два последних числа в каждой из этих строк определяют, где именно на дисплее отображается текст — первое число указывает отступ слева, второе — отступ сверху.

Верхняя часть нашего OLED отображается жёлтым, поэтому первая строка содержит текст, который это отражает. Остальные строки расположены ниже, что управляется последним числом в скобках.

Обратите внимание, что на дисплее пока ничего не появится. Это произойдёт на следующем шаге.

# Write a line of text to the display
display.text("Hello Yellow!",0,0)
display.text("Hello Blue!",0,17)
display.text("Hello Blue!",0,27)
display.text("Hello Blue!",0,37)
display.text("Hello Blue!",0,47)
display.text("Hello Blue!",0,57)

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

# Update the display
display.show()

Как и со многим в мире мейкеров, наверняка существуют более удачные или альтернативные способы добиться того же результата (возможно, даже через SPI, но нам не хотелось с этим возиться!). Дополнительную информацию о библиотеке SSD1306 можно найти здесь: https://docs.micropython.org/en/latest/esp8266/tutorial/ssd1306.html

Не стесняйтесь оставлять комментарии со своими методами, предложениями или даже кодом для ознакомления другим.


Для создания схем подключения на макетной плате использовался Fritzing.