понедельник, 18 января 2016 г.

Crius CO-16. Дисплей OLED 128x64 с интерфейсом IIC


Очень маленький монохромный (1 бит) дисплей, выполненный по технологии OLED. Преимущество этой технологии - малые энергопотребление и вес, есть и другие, но мне они не важны. Такие дисплеи предполагается использовать в радиоуправляемых моделях, но ничто не мешает применять их в любых других проектах со схожими требованиями.




Варианты, выбор

Есть несколько разновидностей этого дисплея. У некоторых вариантов есть сдвоенный интерфейс I2C / SPI. Цвет экрана может быть белым, желтым, голубым. Есть версии с отдельной полоской вверху другого цвета (желтая полоса вверху при большей голубой части, например), между зонами разных цветов есть разделитель, что может быть неприемлемым для конкретного проекта. Также есть варианты с разрешением 128x32, они компактнее и, вероятно, поэтому дороже. За меньшую цену можно встретить экраны без платы контроллера, но вряд ли такая экономия будет оправдана в большинстве случаев. Все варианты, что я видел, питаются от напряжения в диапазоне 3-5 В.

Среди покупателей нередки случаи, когда такой экранчик приходит неисправным, поэтому желательно его проверять до истечения срока защиты покупателя. Мне продавец отправил дисплей не просто в пакетике с пузырьками, но ещё и с пенопластовой коробочкой, что увеличило шанс на получение товара в отличном состоянии. На экране наклеена защитная (транспортировочная) плёнка, которая не сильно портит изображение, так что можно оставить её на месте, либо наклеить вместо неё что-то попрочнее, экранчик часто выпадает из рук, защита лишней не будет.

Это один из тех случаев, когда товар на странице продавца (и здесь тоже) выглядит гораздо большим, чем есть на самом деле. Экранчик очень маленький (активная область примерно 22 * 11 мм), я видел наручные часы с большим экраном.

Описание моего дисплея от продавца:
High brightness, self-emission, high contrast ratio
- monochrome 128×64 dot
- 5V I2C interface
- Used for telemetry and debug MultiWii FC.
- Dimension: 27mmX27mm
- Height: 6.5mm
- Weight:3.7g/4.9g(include cable)
Notice:
If it is displayed abnormally when using,please power off the flight contor for 15 to 20 seconds and then try again.Donnot worry.This is normal phenomenon.
Предполагаемое предназначение - телеметрия и отладка MultiWii (полётный контроллер). Здесь я не в теме, использую дисплей как универсальный, шина у него вполне универсальная и распространённая.

Первое впечатление, особенности экрана

Я видел другие дисплеи OLED в готовых устройствах, но не увидел большого сходства между ними и этим экраном. Возможно, для улучшения качества изображения необходимо применять дополнительные светофильтры, как это часто бывает с экранами и светодиодными индикаторами. Здесь нет ощущения глубокого чёрного, фон синевато-фиолетовый. Сравнивая экран со своим стареньким телефоном с обычным TFT-экраном, я также не увидел преимуществ в яркости или контрастности, причём в телефоне экран ещё и цветной, а здесь нет даже градаций серого.

Возможно, всё преимущество здесь кроется в энергопотреблении. К сожалению, у меня сейчас нет никаких других дисплеев для сравнения, поэтому не могу сказать, насколько этот дисплей лучше других со схожими характеристиками. Потребление сильно зависит от числа отображаемых пикселей, вроде бы это особенность этого типа дисплея (OLED), каждый пиксель как отдельный светодиод. При чёрном экране потребление всего около 2 мА, но при полностью заполненном экране оно возрастает до 45-50 мА. Измерял простейшим мультиметром на шунте на линии питания, поэтому цифры могут быть некорректными.

Подключение

Подключить такой экран можно даже к простейшим Arduino. Микроконтроллер ATMega328P в них имеет встроенную реализацию интерфейса I2C (IIC), что, наверное, сильно упрощает работу с этим экраном.

Контакты на плате экрана подписаны, их всего четыре. SDA (желтый) нужно подключить к выводу A4 ардуины, а SCL (зелёный) - к A5. Питание можно взять с платы Arduino (GND и VCC/5V).

Как и Arduino (по крайней мере, мои пятивольтовые на ATMega328P), этот экран может работать и от меньшего напряжения, хотя явно продавцом об этом не было заявлено. Я питаю всё вместе от одной литиевой батареи, работает стабильно.

Выводы A4 и A5 микроконтроллера имеют двойное назначение, одно из которых - работа с шиной I2C, поэтому к другим контактам подключить экран не получится. Можно попробовать запустить программный I2C на других пинах, но сомневаюсь, что под него вместе с библиотеками для этого дисплея у простейших ардуин будет хватать памяти.

Это и есть основная проблема - память. Библиотеки для работы с этим экраном в Arduino настолько велики, что места под свою программу и данные остаётся мало.


Здесь много съедает и код самого примера, но в реальных проектах картина схожая. Например, в моём простейшем измерителе ёмкости конденсаторов проценты, соответственно, 39 и 70. Для сравнения, у простого (у меня пока всё простое :-) ) измерителя ёмкости аккумуляторов, не использующего этот дисплей, используемый объём памяти уже всего 18% и 10%. Вроде бы и хватает, но расширять функционал почти некуда.

С другой стороны, такой простой дисплейчик может очень хорошо подойти к простейшим микроконтроллерам и проектам. Разрешение небольшое, один пиксел - 1 бит, всё очень экономно.

Начать работу с дисплеем можно с этого стандартного примера. Для этого нужно установить несколько библиотек.
  • Библиотеки SPI и Wire из репозитория Arduino, можно скачать весь код одним архивом и взять нужные папки библиотек из hardware\arduino\avr\libraries. Для установки их нужно скопировать в ту же папку в локальной копии Arduino IDE, либо в её папку libraries.
  • Библиотеки для работы с дисплеем: Adafruit_SSD1306 и Adafruit-GFX-Library. Папки библиотек скопировать в папку libraries локальной копии Arduino IDE.
В папке Adafruit_SSD1306\examples есть несколько примеров для разных типов дисплея и протоколов, здесь понадобится ssd1306_128x64_i2c. По какой-то причине большинство, если не все, варианты (копии?) этого дисплея имеют отличную от стандартной адресацию. Поэтому приходится изменять её вручную, но это просто, достаточно изменить одну строчку.

Вот эту строку:
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

нужно заменить на эту:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

Иногда на самой плате есть переключатель или перемычка для переключения адреса, у меня такой нет.

Сначала хотел добавить сюда пару своих примеров использования, но стандартный пример достаточно хорошо показывает возможности дисплея. Если будет что-то интересное и законченное, напишу о таком проекте отдельно.

Найти в магазинах можно по фразам типа "oled display iic" и "oled display i2c", цена на момент покупки и написания этого текста - $4-$5. Если нужна ровно такая же модель, как у меня, то нужно искать по фразе "crius co-16 v1.2", но она дороже, наверное из-за разъёмов и кабеля.

Дополнение от 20 января 2016 г.

Забыл указать один небольшой, но для многих важный недостаток. У моего варианта исполнения нет никаких приспособлений для крепежа - никаких отверстий и мест для них. Не получится также вставить плату в пазы, так как зазоры по бокам очень маленькие, а снизу мешается шлейф.

Есть более компактные (урезанные?) библиотеки для этого дисплея, для МК с маленьким объёмом памяти есть смысл поискать и выбрать подходящую.

Комментариев нет:

Отправить комментарий