Микроконтроллеры STM32: работа с OLED-экранчиками на базе SSD1306 по I2C и SPI
26 марта 2018
Ранее в заметке Микроконтроллеры STM32: работа с экранчиком 1602 по I2C мы научились выводить текст на HD44780-совместимый ЖК-индикатор с I2C-адаптером на базе чипа PCF8574. Эти индикаторы хороши тем, что они не дороги, имеют подсветку и позволяют выводить крупный текст. Но при этом они не могут похвастаться большой скоростью перерисовки, широким углом обзора, или возможностью выводить графическую информацию. Плюс к этому, они довольно громоздки, что в определенных задачах может быть неудобно. Поэтому сегодня мы поговорим о популярных OLED-дисплеях на базе чипа SSD1306, лишенных названных недостатков.
Fun fact! В этом блоге OLED-экранчик с I2C-интерфейсом на базе SSD1306 ранее уже упоминался в статье Используем джойстик от Sega Genesis в проектах на Arduino.
Такие дисплеи бывают разных размеров. Дисплей с диагональю 0.96 дюймов стоит на eBay около 3$, а аналогичный дисплей с диагональю 1.3 дюйма — около 7$. Еще есть совместимые дисплеи на базе чипа SSD1309 с диагональю 1.54 (ценой ~13.5$) и 2.42 дюйма (от 20$). Как правило, дисплеи отображают картинку 128×64 пикселей, но также встречаются и «полоски» 128×32 пикселя, и другие форматы. Пиксели могут быть белыми или синими. Еще встречаются дисплеи, у которых верхние 1/4 пикселей желтые, а нижние 3/4 — синие. Дисплеи на базе SSD1309 бывают белыми, синими, зелеными и желтыми.
Есть также аналогичные дисплеи на базе чипа SH1106. Они лишь частично совместимы с SSD1306, поскольку поддерживают только страничную адресацию пикселей. В связи с этим некоторые библиотеки, написанные для SSD1306, могут с ними не работать. При этом внешне дисплеи на базе SH1106 неотличимы от дисплеев на базе SSD1306. Стоит ли говорить, что в сети можно найти много сообщений о «сломанных библиотеках» и «бракованных дисплеях».
SSD1306 умеет работать по нескольким протоколам, в том числе по SPI и I2C. I2C удобнее использовать, когда хочется поменьше проводов и скорость передачи данных не критична. SPI требует больше проводов, но позволяет передавать данные намного быстрее. Притом, с точки зрения FPS нет большой разницы, что использовать. Например, STM32F103C8T6 легко показывает по I2C более 25 FPS, чего на практике должно быть более, чем достаточно. Для сравнения, по SPI на том же микроконтроллере можно получить до 54 FPS. Но не ясно, зачем это может быть нужно. Субъективно, куда важнее FPS’ов тот факт, что SPI позволяет больше времени тратить не на передачу данных, а какие-то полезные вычисления.
Fun fact! На самом деле, SSD1306 поддерживает два протокола SPI, так называемые 3-wire SPI и 4-wire SPI. Команды и данные у этого чипа передаются в виде байт, и еще один бит, так называемый D/C, нужен для того, чтобы отличить команды от данных. Так вот, отличие протоколов состоит в том, что в 3-wire SPI данные передаются блоками по 9 бит — бит D/C плюс один байт, а 4-wire SPI использует обычный 8-и битный SPI, плюс дополнительный провод для передачи бита D/C. Далее под SPI я буду понимать исключительно 4-wire SPI, так как чаще всего почему-то пользуются именно им.
Соответственно, дисплеи обычно продаются в виде I2C- или SPI-модулей, имеющих пины с шагом 2.54 мм. Но также продаются и дисплеи без какой-либо обвязки, имеющие только шлейф, идущий непосредственно к чипу. Интересно, что SPI-модули обычно имеют шелкографию, объясняющую, как перепаять их в I2C-модуль или модуль, работающий по 3-wire SPI. Например, я вполне успешно перепаял вот такой SPI-модуль от WaveShare, чтобы он работал по I2C. Увы, чтобы переделанный модуль работал корректно, ему приходится подавать на пин Reset сначала низкое напряжение, а затем высокое, что не требуется в обычных I2C-модулях. Но в остальном он работает без нареканий.
На приведенном фото слева изображен экранчик с диагональю 1.3″, белыми пикселями и работающий по I2C. Справа от него — похожий экранчик, но с диагональю 0.96″ и работающий по SPI. На фото не очень хорошо видно, но у этого экранчика 3/4 пикселей, находящихся ближе к пинам, выводятся через строчку. Я не уверен, то ли это брак, то ли экранчик таким и задуман, например, для снижения энергопотребления. По крайней мере, смотрится вполне симпатично. Заметьте также, что изображение у него выведено перевернутым на 180 градусов. Это уже было сделано намерено в коде прошивки, протокол SSD1306 такое позволяет. Оба экранчика подключены к отладочной плате Nucleo-F411RE.
Следующие два экранчика подключены к плате Blue Pill на базе микроконтроллера STM32F103C8T6. Первый экранчик 0.96″ — этот тот самый модуль от WaveShare, который я перепаял обратно, чтобы он снова работал по SPI. Верхние 1/4 писелей у этого дисплея желтые, а нижние 3/4 — синие. За ним идет экранчик, также имеющий диагональ 0.96″, но с белыми пикселями и работающий по I2C. Кстати, все четыре дисплея могут питаться как от 3.3 В, так и от 5 В.
Было протестировано несколько библиотек для работы с такими экранчиками. В итоге, больше всего мне понравилась 4ilo/ssd1306-stm32HAL. Позже я выяснил, что ее Google и выдает первой по запросу «stm32 ssd1306 library». Библиотека отличная, заводится с пол-оборота, содержит всего 150 строк кода, работает без нареканий. К сожалению, она умеет работать только по I2C. Поэтому поддержку SPI мне пришлось дописать самостоятельно, ну и заодно отрефачить кое-что по мелочи. Ссылку на получившуюся в итоге библиотеку ищите в конце поста.
В ходе работы над библиотекой я узнал, что дисплей 1.3″ почему-то немного иначе адресует пиксели, чем дисплей 0.96″. Чтобы на нем все отображалось корректно, мне пришлось переопределить ширину экрана:
# C defines C_DEFS = —DUSE_HAL_DRIVER —DSTM32F411xE —DSSD1306_USE_I2C —DSSD1306_WIDTH=130 —DSTM32F4 # for ssd1306 library
Основной же код был написан так, чтобы он ничего не выводил в первом и втором столбце пикселей, потому что этот экранчик их не отображает. В результате получилось следующее:
#include «ssd1306.h»#include void ssd1306_TestFonts(){ ssd1306_Fill(Black); ssd1306_SetCursor(2,); ssd1306_WriteString(«Font 16×26», Font_16x26, White); ssd1306_SetCursor(2,26); ssd1306_WriteString(«Font 11×18», Font_11x18, White); ssd1306_SetCursor(2,26+18); ssd1306_WriteString(«Font 7×10», Font_7x10, White); ssd1306_UpdateScreen();}void ssd1306_TestFPS(){ ssd1306_Fill(White); uint32_t start = HAL_GetTick(); uint32_t end = start; int fps =; char message[]=«ABCDEFGHIJK»; ssd1306_SetCursor(2,); ssd1306_WriteString(«Testing…», Font_11x18, Black); do{ ssd1306_SetCursor(2,18); ssd1306_WriteString(message, Font_11x18, Black); ssd1306_UpdateScreen(); char ch = message[]; memmove(message, message+1,sizeof(message)—2); message[sizeof(message)—2]= ch; fps++; end = HAL_GetTick(); }while((end — start)<5000); HAL_Delay(1000); char buff[64]; fps =(float)fps /((end — start)/1000.0); snprintf(buff,sizeof(buff),«~%d FPS», fps); ssd1306_Fill(White); ssd1306_SetCursor(2,18); ssd1306_WriteString(buff, Font_11x18, Black); ssd1306_UpdateScreen();}void ssd1306_TestAll(){ ssd1306_Init(); ssd1306_TestFPS(); HAL_Delay(3000); ssd1306_TestFonts();}
Полную версию кода вы найдете на GitHub. Узнать больше о чипе SSD1306 можно из его даташита [PDF].
Библиотека была протестирована только на микроконтроллерах семейства STM32F1 и STM32F4, так как других у меня под рукой попросту нет. Если вас не затруднит проверить ее на других микроконтроллерах и сообщить о результатах в комментариях, я был бы крайне признателен. Также прямо сейчас у меня нет возможности проверить, работает ли библиотека с экранчиками на базе SH1106 и SSD1309. Если вы можете протестировать это, мне также крайне хотелось бы узнать о результатах. Наконец, отмечу, что я с радостью приму патчи, добавляющие в библиотеку, скажем, вывод геометрических фигур, русские шрифты или поддержку 3-wire SPI.
А что вы думаете о подобных OLED-экранчиках? Доводилось ли вам с ними работать? Если да, то какую библиотеку вы использовали, и по какому протоколу она говорила с дисплеем?
Дополнение: Проверил, библиотека работает с SSD1309 и SH1106.
Дополнение: Также вас могут заинтересовать посты Работа с цветными OLED-экранчиками на базе SSD1351 и Превращаем VGA-монитор в «большой OLED-экранчик» с помощью iCEstick.
Метки: STM32, Электроника.
Понравился пост? Узнайте, как можно поддержать развитие этого блога.
Также подпишитесь на RSS, ВКонтакте, Twitter или Telegram.
Arduino и OLED дисплей SSD1306
Автор: Mike(admin) от 15-12-2018, 00:55
Многие из любителей Arduino знакомы с матричным ЖК-дисплеем с разрешением 16 Г— 2 точек, который используется в большинстве проектов для отображения некоторой информации для пользователя. Но эти ЖК-дисплеи имеют много ограничений в плане того, что они могут делать.
В этом уроке мы узнаем о OLED дисплеях и о том, как их использовать с Arduino. Есть много типов OLED дисплеев, доступных на рынке, и есть много способов заставить их работать. В данном материале мы будем работать с SSD1306.
Термин OLED обозначает «органический светоизлучающий диод». Дисплеи вроде SSD1306 применяют эту технологию, которая также используется в большинстве наших телевизоров, но дисплей имеет меньше пикселей по сравнению с ними. Очень хорошо, что эти классно выглядящие дисплейные модули очень просто взаимодействуют с Arduino, что позволит усовершенствовать визуальную составляющую многих проектов.
Дисплей SSD1306 является небольшим (0.96 дюймов) и монохромным с 7-ю выводами. Причина выбора этого дисплея заключается в том, что он может работать с тремя различными протоколами связи, такими как режим 3-проводного SPI, четырехпроводный режим SPI и режим I2C. В этом проекте будет показано, как использовать модуль в 4-проводном режиме SPI, так как это самый быстрый и стандартный режим связи. Выводы и их функции описаны в таблице ниже.
Сообщество Arduino уже предоставило нам много библиотек, которые можно напрямую использовать, чтобы намного проще работать с SSD1306. Опробовав несколько библиотек, можно обнаруть, что библиотека Adafruit_SSD1306 очень проста в использовании и имеет несколько графических опций, поэтому мы будем использовать ее в этом руководстве. Но если у вашего проекта есть ограничение по памяти или скорости, попробуйте использовать библиотеку U8g, так как она работает быстрее и занимает меньше памяти программ.
Принципиальная схема подключения OLED SSD1306 с Arduino очень проста и показана ниже.
Мы просто установили связь SPI между модулем OLED и Arduino. Поскольку OLED работает с напряжением от 3В до 5В и потребляет очень мало энергии, ему не требуется внешний источник питания. Вы можете просто использовать провода, чтобы установить соединение, или использовать макетную плату, чтобы было легко экспериментировать. В таблице ниже указано соединение выводов Arduino и SSD1306.
Как только подключение будет завершено, вы можете начать программировать Arduino. Как было сказано ранее, мы будем использовать библиотеку Adafruit и библиотеку GFX для работы с этим модулем OLED. Сначала с Github загрузите библиотеку Adafruit (https://github.com/adafruit/Adafruit_SSD1306) и библиотеку GFX (https://github.com/adafruit/Adafruit-GFX-Library).
Вы должны были загрузить два файла Zip. Теперь добавьте их в Arduino IDE, выполнив Sketch — Include Library — Add Zip library, как показано ниже. Затем выберите библиотеку, которую мы только что скачали. Вы можете выбрать только одну библиотеку за раз, поэтому вы должны повторить этот шаг снова.
Запустите пример программы, выбрав File – Examples — Adafruit SSD1306 — SSD1306_128*64_SPI.ino, как показано на изображении ниже.
Внутри примера программы выше строки 64 добавьте строку «#define SSD1306_LCDHEIGHT 64», как показано на изображении ниже.
Теперь загрузите программу, и вы увидите, что OLED-дисплей включается с примером Adafruit по умолчанию. В этом примере программы показаны все возможные графические элементы, которые могут отображаться на экране OLED. Этого кода должно быть достаточно для создания растровых изображений, рисования линий / кругов / прямоугольников, игры с пикселями, отображения символов и строк с различными шрифтами, размерами и т.д.
Это может показаться сложным, но с помощью веб-инструмента (http://javl.github.io/image2cpp/) очень легко преобразовать изображение в битовые значения и загрузить их в массив кода. Просто загрузите изображение и отрегулируйте настройки, чтобы получить предпочтительный предварительный просмотр изображения. Затем нажмите «Generate Code», скопируйте код и вставьте его в свой массив. Загрузите программу, и все готово. Ниже показан логотип Бэтмена на SSD1306, и как это получилось.
В© digitrode.ru
Версия для печати    Благодарим Вас за интерес к информационному проекту digitrode.ru.    Если Вы хотите, чтобы интересные и полезные материалы выходили чаще, и было меньше рекламы,    Вы можее поддержать наш проект, пожертвовав любую сумму на его развитие.Вернуться2517—> В
Категория: Микроконтроллеры и микропроцессоры, Статьи
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Комментарии:
Оставить комментарий21 ноября 201713:30
Подключение OLED дисплея I2C к NANO и вывод Русского шрифта:
А теперь более подробно, что мы делали.
Мы использовали:
1. Arduino NANO V 3.0
2. OLED display 0.96″ I2C (IIC)
3. Макетная плата для монтажа без пайки
4. Библиотека с поддержкой русского и украинского языка OLED I2C
Дисплей подключаем к ARDUINO NANO по следующей схеме:
OLED Display I2C |
ARDUINO NANO V 3.0 |
GND |
GND |
VDD |
Pin D2 |
SCK |
Pin D3 |
SDA |
Pin D4 |
Вход питания дисплея VDD можно было бы подключить к 3,3V или 5V ARDUINO, но у нас задача обойтись без проводов. Поэтому мы установим цифровому порту ARDUINO «D2» значение HIGHT, это значит, что на pin «D2» ARDUINO подаст 5 вольт. Для сборки используем макетную плату:
Наш Скетч:
Устанавливаем библиотеку OLED_I2C (если не была установлена) и компилируем. Каждая строка в скетче подробно описана:
СКАЧАТЬ
Таблица соответствия символов:
Русский символ |
Символ, заглавной буквы |
Символ, прописной буквы |
А, а |
F |
f |
Б, б |
< |
, |
В, в |
D |
d |
Г, г |
U |
u |
Д, д |
L |
l |
Е, е |
T |
t |
Ж, ж |
: |
; |
З, з |
P |
p |
И, и |
B |
b |
Й, й |
Q |
q |
К, к |
R |
r |
Л, л |
K |
k |
М, м |
V |
v |
Н, н |
Y |
y |
О, о |
J |
j |
П, п |
G |
g |
Р, р |
H |
h |
С, с |
C |
c |
Т, т |
N |
n |
У, у |
E |
e |
Ф, ф |
A |
a |
Х, х |
{ |
[ |
Ц, ц |
W |
w |
Ч, ч |
X |
x |
Ш, ш |
I |
i |
Щ, щ |
O |
o |
Ъ, ъ |
} |
] |
Ы, ы |
S |
s |
Ь, ь |
M |
m |
Э, э |
~ |
` |
Ю, ю |
> |
. |
Я, я |
Z |
z |
Для простоты написания, переключаемся на английскую раскладку и набираем текст Русскими буквами!
Используемые источники:
- https://eax.me/stm32-ssd1306/
- http://digitrode.ru/computing-devices/mcu_cpu/1706-arduino-i-oled-displey-ssd1306.html
- https://hcomp.ru/blog/ooo-kik/2017/11/po/