Использование 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, либо использовать макетную плату и перемычки «папа — папа», как это сделали мы.
Настройка режима I2C
Используемый нами дисплей поддерживает как режим SPI, так и режим I2C (если вы используете другой дисплей, этот шаг может не потребоваться). Режим выбирается в зависимости от расположения миниатюрных SMT-резисторов на задней панели дисплея.
По умолчанию дисплей настроен на режим SPI. Поскольку нам никогда особо не везло с SPI при работе с такими OLED на Pico, мы переключили наш дисплей в режим I2C (обновление — Тони заставил этот дисплей работать по SPI, посмотрите его руководство!)
Чтобы перевести дисплей в режим I2C, возьмите паяльник, разогрейте резистор R1 (выделен на изображении ниже) и снимите его с помощью пинцета или аналогичного инструмента. Возможно, удастся просто откусить его точными диагональными кусачками, но правильный способ — всё же пайка.
Подключение схемы
Независимо от того, используете ли вы макетную плату или подключаетесь напрямую к контактам Pico — соединения одинаковые и требуют всего четырёх проводов. В таблице ниже показано, какой контакт дисплея к какому контакту Pico подключается:
Дисплей |
Pico |
|---|---|
VCC |
Pin 40 (VBUS) |
GND |
Pin 38 (GND) |
DIN |
Pin 1 (SDA) |
CLK |
Pin 2 (SCL) |
Ниже приведена схема подключения 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, дважды щёлкнув по нему:
Прокрутите открывшийся файл вниз и найдите раздел ниже — блок кода под названием class SSD1306_I2C.
Видите адрес 0x3C, который мы выделили стрелкой? Измените его на 0x3D, затем сохраните файл и закройте его. Это всё, что нужно изменить.
Код
Запустим очень простую демонстрационную программу, просто чтобы убедиться, что всё работает, — а затем вы можете писать код под нужды своего проекта.
Мы повторно использовали код из нашей записи блога «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.