Примечание редактора. Дариус присоединился к нам в качестве стажера летом 2019 года из Калифорнии в США. Среди других проектов мы попросили его помочь обновить наше расширение OLED MakeCode для micro: bit, и он проделал отличную работу - подробности читайте!

Если вы не знаете, I2C OLED - это небольшой цифровой дисплей, который полезен для проектов в области электроники. Я написал библиотеку micro: bit для использования I2C OLED, и при этом мне пришлось узнать много подробностей о том, как она работает. Для большинства проектов эти особенности не будут иметь никакого значения, и вы можете просто положиться на библиотеку, чтобы обработать детали. Однако, если вы сами пишете библиотеку или просто интересуетесь спецификациями эзотерических частей, вы, надеюсь, что-то из этого извлечете.

Как рисует OLED

Когда я впервые узнал об OLED, я предполагал, что буду рисовать на экране путем чтения и записи по адресам пикселей, аналогично тому, как рисуют на экране на компьютере. Однако основными единицами рисования с OLED-дисплеями являются не пиксели, а страницы и столбцы. Есть 8 страниц, которые идут сверху вниз, и 128 столбцов, которые идут слева направо. Один адрес столбца страницы соответствует вертикальной полосе из 8 пикселей, которые должны быть записаны сразу. OLED отслеживает адрес столбца страницы и считывает входящий байт в этот адрес. 1 соответствует включенному пикселю, а 0 соответствует выключенному пикселю. Поскольку в байте 8 бит, один байт соответствует всем пикселям в одном адресе столбца. Как только адрес будет записан, OLED автоматически перейдет к следующему адресу.

В дополнение к текущему адресу столбца страницы OLED также хранит еще две координаты, называемые Start и End. Эти два адреса столбца страницы определяют квадрат с началом в верхнем левом углу и концом в нижнем правом углу. Во время записи или чтения экрана текущий адрес будет непрерывно перемещаться вправо, пока не достигнет края прямоугольника, а затем перейдет в начало следующей строки. Это позволяет вам писать сразу на весь экран, задав для начала (0,0), а затем (7,127). Однако вам не нужно писать сразу на весь экран. Библиотека OLED, которую я написал, сохраняет память, не сохраняя сразу весь экран, а вместо этого записывает в конкретный блок 5x8 пикселей, где должен был быть нарисован персонаж. Также обратите внимание, что существует три различных «режима адресации», которые управляют перемещением адреса столбца страницы при записи или чтении. Я говорю о «горизонтальной адресации», которая является наиболее распространенной.

Как читает OLED

Все это очень хорошо и хорошо, но как вы делаете какие-либо из этих написаний и адресов? I2C OLED, как следует из названия, использует так называемый протокол I2C. Это аппаратный протокол, используемый для связи с простыми электронными периферийными устройствами. Основным преимуществом является использование системы Master-Slave, которая позволяет одному контроллеру (Master) управлять несколькими устройствами (Slave) одновременно, каждое со своим собственным адресом. Устройства I2C имеют 4 контакта: заземление (GND), питание (VCC), последовательная линия данных (SDL) и последовательная линия синхронизации (SCL).

GND и VCC поддерживаются на низком (ноль вольт) и высоком уровне (обычно +5 или +3,3 вольт) соответственно, действуя как источник питания. SDA и SCL отвечают за отправку сообщений на подключенные устройства I2C и от них. Структура сообщения I2C выглядит следующим образом: SCL и SDA начинаются с высокого уровня, а начало сообщения отмечается переходом SDA от высокого к низкому, что называется условием запуска. Оттуда SCL колеблется между High и Low, каждое колебание считывается битом из SDA. Устройства I2C интерпретируют эти биты блоками по 16. Каждые 16 битов состоят из 7-битного адреса подчиненного устройства, за которым следует 1 бит чтения / записи, за которым следуют 8 бит данных. Как интерпретируются эти данные, зависит от конкретного используемого устройства I2C. Когда все подключенные устройства были записаны или прочитаны, уровень вероятности нежелательной почты остается на высоком уровне, а SDA также устанавливается на высокий уровень. Это называется условием остановки.

Каждый тип устройства имеет свой собственный адрес, что означает, что любое количество устройств, но только по одному каждого типа, может быть подключено к одному и тому же мастеру. Адрес OLED 0x3C для записи и 0x3D для чтения. OLED интерпретирует входящие данные как байт команды, за которым следует любое количество байтов данных. Хотя это немного упрощает, 0x00 можно рассматривать как команду для записи этих данных по текущему адресу. Есть команды для изменения адреса, изменения начальной и конечной точек и многих других настроек. Полный список команд, а также дополнительную информацию об OLED можно найти здесь.

Заключительные мысли и дальнейшая работа.

При инициализации OLED в первый раз необходимо установить ряд настроек, каждая из которых связана с командой. Должен признать, что я не понимаю всего, что делают эти настройки, и возможно, что некоторые интересные вещи можно было бы сделать с более тонким контролем над этими настройками. Если вы хотите увидеть список команд, которые я использовал, вы можете заглянуть в GitHub для моей библиотеки OLED.

Одно из дополнений, которое я рассмотрел для библиотеки OLED, - это введение новых шрифтов с дополнительными наборами символов, таких как китайский или корейский. Текущий шрифт, который я использую, составляет 5x7 пикселей и хранится в виде строки блоков по 5 байтов, соответствующих строкам пикселей в символе. Этот размер был выбран таким образом, чтобы символ поместился на одной странице. Большинство растровых шрифтов для китайского не масштабируются ниже 16x16, но это все равно позволяет рисовать символы сразу на двух страницах. Мне не удалось найти шрифт, который бы подошел для этого, но похоже, что это возможно.

В любом случае, это все, что касается моего глубокого погружения в I2C OLED. Я желаю вам удачи в любом электронном проекте, над которым вы будете работать дальше!