Подключение OLED дисплея SSD1306 к Raspberry Pi Pico с помощью Micropython


В данной статье мы рассмотрим подключение OLED дисплея SSD1306 к плате Raspberry Pi Pico по интерфейсу I2C. Программирование платы Raspberry Pi Pico будет осуществляться на языке Micropython. Настройку данной платы для работы с языком Micropython мы рассматривали в этой статье на нашем сайте. Также можете посмотреть статью про подключение OLED дисплея SSD1306 к плате Arduino и к плате Raspberry Pi – в них рассмотрены основные принципы работы с данным дисплеем.

Внешний вид проекта подключения OLED дисплея SSD1306 к Raspberry Pi Pico

Необходимые компоненты

  1. Плата Raspberry Pi Pico (купить на AliExpress).
  2. Модуль OLED дисплея SSD1306 128×64 с диагональю 1.3 дюйма и интерфейсом I2C (купить на AliExpress).
  3. Макетная плата.
  4. Соединительные провода.

Схема проекта

Схема подключения OLED дисплея SSD1306 к плате Raspberry Pi Pico представлена на следующем рисунке.

Схема подключения OLED дисплея SSD1306 к плате Raspberry Pi Pico

Контакт SDA модуля OLED дисплея подключен к контакту GPIO16 (Pin21) платы, а контакт SCL модуля OLED дисплея – к контакту GPIO17 (Pin22) платы. Контакт Vcc модуля OLED дисплея подключен к контакту 3.3v (Pin36) платы Raspberry Pi Pico. Контакт земли (Ground pin) дисплея подключен к контакту земли (Pin38) платы.

Библиотека для работы с OLED дисплеем на MicroPython

Для начала вам необходимо создать новую папку, в которую вы будете сохранять файлы программы. Далее необходимо скачать папку с программами с GitHub, в которой содержатся файлы программ для платы Raspberry Pi Pico на языке MicroPython. В этой скачанной папке с программами откройте папку с названием “T3_Interfacing_An_OLED”. Из этой папки вам необходимо скопировать файлы “main.py” и “ssd1306.py” в папку, которую вы создали. Файл “main.py” содержит код программы для отображения текста и изображений. Файл “ssd1306.py” – это библиотека для работы с модулем OLED дисплея. Но прежде чем приступать к рассмотрению кода программы вам необходимо выполнить преобразование изображения, которое вы хотите отобразить на экране OLED дисплея, в формат bmp. С этой целью в указанной папке “T3_Interfacing_An_OLED” вы можете найти файл “img_to_bmp.py”. Для запуска этой программы на выполнение вам необходимо окружение для работы с языком python. Автор данного проекта (ссылка на оригинал приведена в конце статьи) использовал для этого Python 3.6.

Объяснение программы для Raspberry Pi Pico

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Мы рассмотрим код программы, содержащийся в файле “img_to_bmp.py”.

Сначала вам необходимо установить библиотеку “PIL” с помощью установщика пакетов “pip”. Параметр input_filename_with_path содержит путь к файлу без указания его расширения. В нашем случае файл с изображением и файл с программой img_to_bmp.py находятся в одной и той же папке. Поэтому мы будем упоминать только имя файла с изображением. Команда “Image.open(file_in)” будет открывать указанный файл с изображением, после чего мы сможем выполнять другие операции над данным изображением – сжимать, конвертировать и т.д.

Функция save() используется для сохранения конвертированного изображения в виде выходного файла с сохранением “.bmp”. После этого функция Image.open(file_out,mode='r') используется для открытия “bmp” файла, а функция io.BytesIO() используется считывания битового массива (bitmaparray) изображения. Массив img_bytes используется для хранения этого массива. С помощью функции print(img_bytes) производится печать массива нашего изображения. Нам необходимо скопировать этот байтовый массив для его последующего использования в файле “main.py”. Функция print('Image Resolution: ({0},{1})'.format(img.width,img.height)) выводит на печать разрешение изображения. Нам это разрешение будет необходимо в файле “main.py”. Убедитесь в том, что разрешение изображения не очень большое. Для уменьшения разрешения изображения вы можете использовать любой удобный вам графический редактор.

Вам необходимо будет скопировать следующий массив:

Массив, который необходимо будет скопировать

На представленном рисунке показан результат работы программы из файла img_to_bmp.py. В нашем случае мы использовали изображение, конвертированное в разрешение 32x32.

Итак, у нас есть байтовый массив (byte array) изображения. Теперь рассмотрим код файла “main.py”. В этом файле мы используем библиотеку “machine” для выполнения основных операций с аппаратным обеспечением ("железом") с помощью языка MicroPython. Также мы используем библиотеку “ssd1306”, которую мы ранее добавили в плату Raspberry Pi Pico. Библиотека “utime” используется для доступа к встроенным функциям времени платы Raspberry Pi Pico, а библиотека framebuf,sys – для выполнения операций с массивами.

В массиве с именем image_byte_arr содержится байтовый массив (byte array) изображения, которое мы будем отображать на экране дисплея. В него необходимо вставить массив, который мы получили в результате исполнения программы из файла img_to_bmp.py. Его размерность точно такая же, как и выходного массива, сформированного в результате выполнения программы img_to_bmp.py.

Далее в программе функция I2C() используется для инициализации связи по интерфейсу I2C. В функцию необходимо передать номер используемого канала I2C поскольку в плате Raspberry Pi Pico таких каналов 2. В нашем случае мы используем канал I2C0. Если вы будете использовать канал I2C1, то тогда вам необходимо изменить первый параметр в данной функции с 0 на 1. Следующие два параметра при вызове данной функции используются для указания контактов SCL и SDL, используемых для осуществления связи по интерфейсу I2C. В нашем случае для этих целей мы используем контакты 17 и 16. Следующий параметр функции I2C используется для указания рабочей частоты, используемой для связи по интерфейсу I2C. Функция i2c.scan() используется для определения адреса устройства.

Функция SSD1306_I2C() используется для инициализации OLED дисплея и формирования “oled” объекта. В качестве входных параметров в данной функции используются ширина и высота экрана дисплея, а также режим его работы. Затем мы используем функции из библиотеки ssd1306, вызывая их при помощи созданного нами “oled” объекта. Например, функция oled.fill(0) используется для очистки экрана дисплея.

Функция displayText() используется для отображения текста на экране OLED дисплея. В качестве параметров данной функции необходимо указать выводимый текст, позицию вывода, параметры clear_oled и the show_text. Позиция для вывода текста по умолчанию равна (0,0). Но вы можете изменить ее по своему желанию – ее необходимо указывать в формате (x,y). По умолчанию значение параметров clear_oled и show_text установлено в True.

Функция displayImage() используется для отображения изображения на экране OLED дисплея. В качестве входных параметров в данную функцию передаются параметры image_byte_array, image_resolution, position, clear_oled и show_img. Параметр image_resolution содержит ширину и высоту изображения. Позиция для вывода изображения указывается в формате (x,y), по умолчанию она равна (0,0). В нашем случае параметры clear_oled и show_img устанавливаются в False и True соответственно. Функция bytearray() используется для получения растра изображения. Далее функция framebuf.FrameBuffer() используется для сохранения каждого бита этого растрового изображения. Буфер кадров (frame buffer) может работать в нескольких различных режимах, мы будем использовать режим MONO_HMSB. После этого мы используем функцию oled.blit() для отображения кадра изображения на экране OLED дисплея.

Следующий фрагмент кода используется для отображения текста на экране OLED и его скроллинга. Мы вызываем функцию displayText() два раза в цикле loop и передаем в нее в качестве параметров строки text1 и text2. Мы установили clear_oled в False и show_text в True для отображения строки text1. Для отображения строки text2 мы установили clear_oled в True и show_text в True. Это позволит нам отображать строки текста на экране дисплея при каждой итерации. Когда значение переменной “x” достигнет конца текущей итерации (это будет соответствовать значению ширины дисплея), будет происходить прерывание работы цикла (break).

Далее в цикле while мы будем использовать анимацию текста и изображения. Для отображения изображения будет использоваться функция displayImage, в которую будут передаваться параметры image_byte_arr, (image_width, image_height), (x,y), и clear_oled. (x,y) – это позиция для вывода изображения, image_width – ширина изображения, image_height – высота изображения. clear_oled устанавливаем в False. Значение переменной show_img мы не устанавливаем – оно по умолчанию установлено в True. Таким образом, вы можете использовать функции displayImage() и displayText() для отображения изображения и текста на экране OLED дисплея соответственно.

Теперь откройте файлы “main.py” и “ssd1306.py” в Thonny IDE. Сначала вам необходимо сохранить файл “ssd1306.py” в плате Raspberry Pi Pico при помощи нажатия комбинации клавиш “ctrl+shift+s” на клавиатуре. Убедитесь в том, что ваша плата подключена к компьютеру в то время, когда вы производите эти операции. Когда вы начнете процесс сохранения файла вы увидите всплывающее окно, показанное на следующем рисунке. В этом окне вам необходимо выбрать плату Raspberry Pi Pico, ввести имя файла и нажать на кнопку save. Далее аналогичную процедуру необходимо проделать для файла “main.py”. Эта процедура позволит вам запускать программу в то время, когда на плату подано питание.

Выбор места сохранения программы

Исходный код программы на MicroPython

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
2 043 просмотров

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

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