- PVSM.RU - https://www.pvsm.ru -

Для сборки этого устройства понадобится 12 электронных компонентов общей стоимостью £5, размещенных на односторонней печатной плате размером 3х7см. В качестве встраиваемого ПО задействуется 150 строк кода Си, которые займут 1,300 байтов памяти.
TinyPhoto прокручивает пять выбранных пользователем изображений, используя в общей сложности 4,900 байтов (да, байтов!) флэш-памяти. В результате на OLED-дисплее в реальном времени отображаются четкие фотографии с незаметной для человеческого глаза скоростью обновления 60Гц, что обеспечивается повышением тактовой частоты ATiny85 до 8МГц.
Кастомный драйвер устройства (размером 200 байтов) настраивает экран и делает возможным попиксельное отображение. В свою очередь, кастомный код Forth преобразует изображение с глубиной цвета 1 бит в поток байтов, которые записываются на встроенную флэш-память для быстрого показа. Все это лишний раз напоминает о том, чего можно добиться с помощью примитивных вычислительных ресурсов.
При этом вся магия, конечно же, реализуется в ПО. В данной статье я поэтапно опишу сборку TinyPhoto, а также программы, которые в нем использовал.

Tiny Photo – это инструмент просмотра фотографий, работающий на 8-битном микроконтроллере ATTiny85, который отправляет пиксельные данные изображения на OLED-дисплей размером 128 х 64px. Питание обеспечивается батареей по типу «таблетка» с напряжением 3В. Переключение происходит циклически по 5 фотоснимкам, занимающим 5Кб встроенной флэш-памяти. (Заметьте, что это в миллион раз меньше памяти, чем в среднем ПК, оборудованном 8Гб). Вся магия в ПО.
Дополнение от 24 июля 2021) – TinyPhoto V3 готов! Эта версия включает драйвер шрифтов фиксированной ширины для OLED-дисплея (размер 700 байтов), разовый экран запуска и команды SSD1306.
По приведенным мной выше наброскам схемы и макета платы видно, что электроника достаточно проста. В общей сложности используется 12 компонентов и лишь немного проводов, что позволяет уместить все это на плату размером 3х7см. Для фиксации ATiny85 я использовал 8-контактное гнездо DIL, чтобы микроконтроллер можно было снимать, перепрограммировать и подключать обратно с новым набором из 5 фотографий или измененным порядком их отображения. На зарисовку схемы и макета платы у меня ушло пол часа, на пайку и тестирование еще полтора, плюс час на подготовку изображений, включая их ретуширование.

Преобразование большого цветного изображения в матрицу 0-1 с 8к пикселей или менее для отображения на OLED-дисплее 128х64px
Первый алгоритм изменяет размер изображения, например 1.7Мп (JPG, 225Кб, 24-бита) до 128-64px (25Кб BMP, 24-бита, уменьшение на 90%, IrfanView [1]). Изображение при этом также остается цветным и четким.
Второй алгоритм преобразует уменьшенный вариант в оттенки серого (Rec 601 luma formula Y=0.2989R+0.5870G+0.1140B, т.е. 30% красного, 60% зеленого, 10% синего) и применяет выбираемый пользователем порог (скажем, 25) для создания матрицы 0-1 (двоичного изображения), где 1=черный, а 0=белый, Image Binarizer [2]).
OLED-дисплеи 128х64px созданы для удобства отображения текста. Наименьший размер шрифта составляет 8px в высоту, поэтому RAM дисплея сегментирована на 8 текстовых рядов 8px высотой и 128 столбцов. Данные изображения выводятся на экран путем отправки потока байтов, где каждый вертикальный байтовый код содержит 8 пикселей из заданного текстового столбца с младшим битом вверху.

Преобразование матрицы 0-1 в байткод OLED/LCD-дисплея. Каждый вертикальный фрагмент байткода содержит 8 пикселей из одного столбца, где младший бит является верхним, а старший нижним
Последним этапом идет постобработка этой матрицы 0-1 и извлечение вертикальных байткодов (1 байт содержит 8 пикселей из одного столбца), используемых для вывода изображения на дисплей. В качестве примера на картинке выше три вертикальных фрагмента байткода, обведенные красным, представляют 0х00, 0х03 и 0х30 соответственно.
Макрос получает текстовую матрицу 0-1 для непосредственной загрузки в Forth в виде содержащейся в памяти карты изображения, готовой для извлечения байткодов. Вычисление вертикального байткода выполняется в нескольких строках Forth (см. раздел «Код» ниже – файл 3iArt.fs).
Далее байткод записывается на встроенную флэш-память ATiny85 (4,900 байтов для 5 изображений). Для хранения параметров каждого снимка я использую 4 поля структуры данных (размер изображения, размер передаваемого по I2C пакета, количество пакетов до добавления новой строки и т.д.).
Микроконтроллер выполняет 150 строк кода Си (объемом 1,300 байтов) в непрерывном цикле, который поочередно генерирует пять изображений и отправляет их данные через I2C на OLED-дисплей 128х64 пикселя.
Для того, чтобы все это уместить на ATiny85 (512 байтов SRAM, 8Кб Flash), я написал собственный простой код (200 байтов Flash) для драйвера микросхемы дисплея SSD1306. Он удаляет все лишнее и сохраняет лишь то, что мне требуется для инициализации дисплея, настройки его контраста (высокая яркость) и ориентации, а также прямой отправки на него данных изображения.
Это избавляет от необходимости применения в 35 раз более крупных (7Кб Flash) драйверов, например от Adafruit, которые бы просто не оставили свободного места под снимки. Помимо этого, исчезает необходимость в использовании программного буфера SRAM объемом 1Кб [3], который дублирует RAM дисплея, но вдвое превышает имеющиеся у ATiny85 512 байтов. В результате получился максимально скромный графический драйвер для микросхемы дисплея SSD1306.
Поскольку ATiny85 не имеет в своем составе интерфейса I2C, я использовал драйверы TinyWireM от BroHogan, которые с помощью аппаратного модуля USI (универсальный последовательный интерфейс) от Atmel эмулируют протокол I2C. Это уменьшило максимальный размер пакета до 8 байтов (с 32 байтов, получающихся при использовании Atmega328P, оборудованного I2C), но при этом картинка на дисплее осталась плавной, а сам дисплей смог генерировать все 8к пикселей (128х64) при скорости обновления 60Гц, позволяющей человеку видеть «мгновенно» генерируемое изображение.
Примечание: для получения достаточно быстрого отображения ATiny85 должен работать на частоте 8МГц или выше. По умолчанию фьюзы микросхемы скорее всего установлены на 1Мгц, чего недостаточно для обновления экрана с частотой 60Гц. Поэтому нужно будет выбрать 8МГц (внутренне) и записать загрузчик, используя программатор ISP. Таким образом, вы настроите фьюзы микросхемы на работу при более высокой частоте.
Последним шагом будет программирование микросхемы при помощи Arduino IDE. Для этого нужно загрузить определения платы ATiny и драйвер TinyWireM I2C.
Для этого можно использовать коммерческий программатор ISP (стоит меньше £20) либо при наличии свободного Arduino Nano или Uno задействовать его (подробно об этом можно почитать в статье Programming Microcontrollers [4]).
Компоненты TinyPhoto подобраны с учетом экономии энергии. ATiny85 требуется всего 3мА. Oled-дисплей потребляет 5мА при отображении фото 64х64px и 10мА при отображении полноэкранного фото размером 128х64px. При среднем потреблении 10мА TinyPhoto способен работать 22 часа от «таблетки» CR2032, 3В, 225мАч.
Результат можно пронаблюдать на видео ниже.
Как отметил один из читателей, двухцветные желто/синий OLED-дисплей, который нашелся на тот момент у меня среди деталей, не лучший вариант, и для финальной версии лучше взять полностью белый [5]или синий [6].
Общая стоимость: £5.09 за 12 деталей (цены указаны на момент покупки и на данный момент ввиду рыночных флуктуаций могут отличаться).
Образцы изображений: бабочка и ягуар
1. butterfly_sm.bmp [16] (цветное изображение бабочки после изменения размера, 114×64px).
2. jaguar.bmp [17] (цветное изображение ягуара после изменения размера, 114×64px).
Код Forth:
Инструкции: этот код GForth загружает пиксельные данные из изображения бабочки и преобразует их в вертикальные байткоды, сохраняемые в файле TinyPhoto_data.avr, который Tiny85 отправляет на OLED-дисплей.
include 3iArt_rel.fs
include 3iArt-butterfly_rel.fs
butterfly
3. 3iArt_rel.fs [18] (GForth) (содержит код Forth для дополнительных байтовых данных из матрицы пикселей).
4. 3iArt-butterfly_rel.fs [19] (содержит входные данные матрицы пикселей для butterfly.bmp).
Код Си для микроконтроллера Tiny85 (Arduino)
Инструкции: скомпилировать TinyPhoto.avr в Arduino IDE, используя файлы платы ATtiny и драйвер BroHogan I2C TinyWireM. Загрузить на МК с помощью программатора ISP. [4]
5. TinyPhoto.avr [20] (скомпилируйте его в Arduino; измените путь, добавив *_data.avr)
6. Дополнение от 24 июля 2021 года: 3iFonts.avr [21] (содержит определения шрифтов фиксированной ширины (8 высота х 5 ширина) для отображения на дисплее).
7. TinyPhoto_data.avr [22] (содержит байткод изображения)
8. ATtiny_ArduinoBoardFiles.zip [23]
9. ATtiny_I2C_driver_BroHogan2011.zip [24]
Дополнено (июль 2021). Для программирования чипов с помощью Arduino IDE я собрал из трех микросхем простой программатор Atmel, оборудованный гнездами для подключения ATiny85 (DIP-8), ATiny84 (DIP-14) или Atmega328P (DIP-28). При этом он задействует Arduino Nano, который выполняет код ArduinoISP, позволяющий ему работать в качестве встроенного программатора (ISP) для записи скомпилированного кода на целевые схемы. Его легко собрать на скромной печатной плате размером 4х6см с применением всего десятка компонентов для планарного монтажа. Общая стоимость деталей, включая Nano, составила £5.
Автор: Дмитрий Брайт
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/366863
Ссылки в тексте:
[1] IrfanView: https://www.irfanview.com/
[2] Image Binarizer: https://www.dcode.fr/binary-image
[3] программного буфера SRAM объемом 1Кб: https://learn.adafruit.com/memories-of-an-arduino?view=all#large-memory-consumers
[4] Programming Microcontrollers: http://mathscitech.org/articles/prog-micros
[5] белый : https://www.amazon.co.uk/dp/B08LYL7QFQ/
[6] синий: https://www.amazon.co.uk/Frienda-Display-Self-Luminous-Compatible-Raspberry-Yellow-Blue-Light/dp/B08TTDW72N/
[7] Микроконтроллер ATtiny85: http://mathscitech.org/articles/electronics#tiny85
[8] OLED-дисплей 128×64px: http://mathscitech.org/articles/electronics#oled
[9] Гнездо DIL на 8 контактов: http://mathscitech.org/articles/electronics#ICsocket
[10] «Таблетка» CR2032 на 3В: http://mathscitech.org/articles/electronics#coincell
[11] Зеленый светодиод 3мм: http://mathscitech.org/articles/electronics#LED
[12] Ограничивающий резистор на 1kОм: http://mathscitech.org/articles/electronics#resistor
[13] Движковый переключатель SPDT: http://mathscitech.org/articles/electronics#slideswitch
[14] Печатная плата 3x7см: http://mathscitech.org/articles/electronics#PCB
[15] стойки платы, M2, M/F 8мм/6мм: http://mathscitech.org/articles/electronics#standoff
[16] butterfly_sm.bmp: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/butterfly_sm.bmp
[17] jaguar.bmp: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/jaguar.bmp
[18] 3iArt_rel.fs: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/3iArt_rel.fs
[19] 3iArt-butterfly_rel.fs: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/3iArt-butterfly_rel.fs
[20] TinyPhoto.avr: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/TinyPhoto.avr
[21] 3iFonts.avr: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/3iFonts.avr
[22] TinyPhoto_data.avr: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/TinyPhoto_data.avr
[23] ATtiny_ArduinoBoardFiles.zip: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/ATtiny_ArduinoBoardFiles.zip
[24] ATtiny_I2C_driver_BroHogan2011.zip: http://www.mathscitech.org/code/avr-Tiny85_84/TinyPhoto/ATtiny_I2C_driver_BroHogan2011.zip
[25] Источник: https://habr.com/ru/post/569814/?utm_source=habrahabr&utm_medium=rss&utm_campaign=569814
Нажмите здесь для печати.