В настоящее время OLED дисплеи получают все большее распространение по сравнению со стандартными ЖК дисплеями 16х2, которые имеют множество ограничений. Сейчас на рынке доступно достаточно большое количество разнообразных OLED дисплеев, которые можно использовать в своих электронных проектах, но одни из самых распространённых сейчас OLED дисплеев – это дисплеи на основе драйвера SSD1306. В данной статье мы рассмотрим подключение подобного дисплея к плате Raspberry Pi. Ранее на нашем сайте мы рассматривали подключение OLED дисплея SSD1306 к плате Arduino.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 (купить на AliExpress).
- Источник питания.
- Макетная плата.
- Соединительные провода.
Общие принципы работы OLED дисплея SSD1306
Термин OLED расшифровывается как “Organic Light emitting diode”, что переводится как "органический светоизлучающий диод". В настоящее время это один из самых распространённых типов дисплеев, применяющихся в современных телевизорах. Используемый нами OLED дисплей SSD1306 построен по тому же самому принципу, что и дисплеи современных телевизоров, только количество пикселов в нем значительно меньше (по сравнению с телевизором). Мы в данном проекте используем монохромный OLED дисплей SSD1306 с диагональю 0.96” и 4-мя контактами. Данный дисплей может работать только по протоколу I2C. Аналогичные дисплеи с 7-мя контактами кроме интерфейса I2C могут также работать по интерфейсу SPI.
Внешний вид OLED дисплея SSD1306 показан на следующем рисунке.
Схема подключения подобного дисплея по интерфейсу I2C к плате Raspberry Pi показана в следующей таблице.
Контакт OLED дисплея | Контакт Raspberry Pi |
VCC | 3.3v |
GND | GND |
SDA | SDA (Physical pin 3) |
SCL | SCL (Physical pin 5) |
С дисплеем разобрались, теперь переходим к общей схеме проекта.
Схема проекта
Схема подключения OLED дисплея SSD1306 к плате Raspberry Pi представлена на следующем рисунке.
Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.
Подключение OLED дисплея к Raspberry Pi
Сообществом Raspberry Pi в настоящее время разработано достаточно много библиотек, которые значительно упрощают подключение OLED дисплея к плате Raspberry Pi. Нам среди этих библиотек наиболее понравилась библиотека Adafruit_SSD1306 OLED, которую мы и будем использовать в нашем проекте.
Для подключения OLED дисплея к плате Raspberry Pi выполните следующую последовательность шагов.
Шаг 1. Включите интерфейс I2C в плате Raspberry Pi.
Для этого сначала зайдите в панель настроек платы:
1 |
sudo raspi-config |
В открывшемся окне настроек выберите настройки подключения периферийных устройств.
После этого выберите интерфейс I2C.
Включите его – нажмите yes, потом enter, потом ok.
Чтобы настройки вступили в силу, перезагрузите плату Raspberry Pi.
1 |
sudo reboot |
Шаг 2. Определите адрес I2C OLED дисплея и обновите его.
Для определения адреса I2C OLED дисплея выполните следующую команду, которая покажет вам этот адрес в шестнадцатеричном виде:
1 |
sudo i2cdetect –y 1 |
Установите последние обновления на плату Raspberry Pi:
1 |
sudo apt-get update |
Шаг 3. Установите python-pip и библиотеку для работы с контактами GPIO.
Установите pip с помощью следующей команды (если он у вас еще не установлен):
1 |
sudo apt-get install build-essential python-dev python-pip |
После этого установите библиотеку для работы с контактами GPIO (GPIO library):
1 |
sudo pip installs RPi.GPIO |
Шаг 4. Установите библиотеку для работы с изображениями (Python Imaging Library) и библиотеку smbus.
Установите данные библиотеки с помощью команды:
1 |
sudo apt-get install python-imaging python-smbus |
Шаг 5. Установите Adafruit SSD1306 python library (библиотеку для работы с OLED дисплеем SSD1306).
Для этого выполните следующую последовательность команд:
1 2 3 4 |
sudo apt-get install git git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git cd Adafruit_Python_SSD1306 sudo python setup.py install |
После этого вы можете приступать к написанию кода программы для вывода различной информации на экран OLED дисплея.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе мы подключим (импортируем) необходимые нам библиотеки.
1 2 3 4 5 6 7 |
import time import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image from PIL import ImageDraw from PIL import ImageFont import subprocess |
После этого инициализируем дисплей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
RST = 0 disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) disp.begin() disp.clear() disp.display() width = disp.width height = disp.height image1 = Image.new('1', (width, height)) draw = ImageDraw.Draw(image1) draw.rectangle((0,0,width,height), outline=0, fill=0) padding = -2 top = padding bottom = height-padding x = 0 font = ImageFont.load_default() |
После этого мы сможем передавать данные или изображения на OLED дисплей с помощью следующего фрагмента кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# Write two lines of text. disp.clear() disp.display() draw.text((x, top), "OLED Interfacing " , font=font, fill=255) draw.text((x, top+8), "Circuit Digest", font=font, fill=255) draw.text((x, top+16), "For more Videos", font=font, fill=255) draw.text((x, top+25), "Visit at", font=font, fill=255) draw.text((x, top+34), "www.circuitdigest.com", font=font, fill=255) # Display image. disp.image(image1) disp.display() time.sleep(2) if disp.height == 64: image = Image.open('img1.png').convert('1') else: image = Image.open('img1.png').convert('1') disp.image(image) disp.display() time.sleep(2) if disp.height == 64: image = Image.open('img3.jpg').convert('1') else: image = Image.open('img3.jpg').convert('1') |
Используемый нами OLED дисплей выпускается в двух вариантах, с разрешением 128*32 и 128*64. Необходимое разрешение вы можете выбрать при инициализации дисплея. К примеру, для инициализации дисплея с разрешением 128*64 необходимо использовать следующую команду:
1 |
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) |
Используемый далее код программы достаточно прост и, на наш взгляд, не нуждается в дополнительных пояснениях. Вы можете поэкспериментировать в нем с изменением ширины и высоты изображений и попробовать запрограммировать другие функции для вывода на экран дисплея "крутых" геометрических фигур.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
import time import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image from PIL import ImageDraw from PIL import ImageFont import subprocess RST = 0 disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST) disp.begin() disp.clear() disp.display() width = disp.width height = disp.height image1 = Image.new('1', (width, height)) draw = ImageDraw.Draw(image1) draw.rectangle((0,0,width,height), outline=0, fill=0) padding = -2 top = padding bottom = height-padding x = 0 font = ImageFont.load_default() while True: draw.rectangle((0,0,width,height), outline=0, fill=0) # выводим на экран две строчки текста disp.clear() disp.display() draw.text((x, top), "OLED Interfacing " , font=font, fill=255) draw.text((x, top+8), "Circuit Digest", font=font, fill=255) draw.text((x, top+16), "For more Videos", font=font, fill=255) draw.text((x, top+25), "Visit at", font=font, fill=255) draw.text((x, top+34), "http://www.circuitdigest.com/", font=font, fill=255) # выводим на экран изображение disp.image(image1) disp.display() time.sleep(2) if disp.height == 64: image = Image.open('img1.png').convert('1') else: image = Image.open('img1.png').convert('1') disp.image(image) disp.display() time.sleep(2) if disp.height == 64: image = Image.open('img3.jpg').convert('1') else: image = Image.open('img3.jpg').convert('1') disp.image(image) disp.display() time.sleep(2) if disp.height == 64: image = Image.open('img4.jpg').convert('1') else: image = Image.open('img4.jpg').convert('1') disp.image(image) disp.display() time.sleep(2) |