112

Преобразуем изображения и GIF анимацию в код для Arduino

Посмотреть видео

Сейчас в продаже доступно много разных Ч/Б дисплеев, в том числе и OLED. Для того, чтобы получить красивое черно-белое изображение для этих дисплеев, с глубиной цвета всего 1 бит, но в тоже время с имитацией полутонов, как на представленной ниже картинке — нужно использовать преобразование по алгоритму «Floyd-Steinberg».

Я, наверное, Вам уже надоел своими конвертерами, но не спешите с оценкой. Этот конвертер, в отличие от предыдущих, может преобразовать изображение любого масштаба и с любой глубиной цвета в требуемый размер и сразу получить на выходе готовый Си код понятный Arduino IDE или другому компилятору.

Можно, конечно, использовать графический редактор со встроенной функцией дизеринга Floyd-Steinberg, но ради пары картинок, нет желания изучать функционал этого сложного ПО. Да и как правило эти редакторы в основном платные. По этому я представляю он-лайн инструмент для конвертирования изображений полного цикла, с возможностью подстраивать детализацию выходного изображения.

Для примера загружаю изображение автомобиля в онлайн конвертер. При помощи ползунков «Яркость» и «Контрастность» добиваюсь максимально детализированного изображения на предпросмотре. На выходе получаю Ч/Б картинку с заданными мною параметрами разрешения и исходный код этого изображения. Полученный код можно скопировать и вставить в свой проект.

Пошаговая инструкция для преобразования

1 — Выберите изображение на своем ПК, нажав на кнопку «Выберите фаил» и загрузите его в он-лайн конвертер. Изображение может быть цветным или ч/б с любой глубиной цвета и любого размера.

2 — Укажите требуемый размер получаемого на выходе преобразователя изображения.

3 — При помощи бегунков «Яркость» и «Контрастность добейтесь наилучшего результата на предварительном просмотре.

4 — Укажите название изображения латинскими буквами.

5 — Скопируйте полученный Си код и вставьте его в свой исходник.

6 — При необходимости сохраните преобразованное изображение, нажав на изображении правую кнопку мышки.

Преобразование GIF-анимации

Для реализации ардуино проекта, мне понадобилась черно-белая GIF-анимация. В интернете я нашел простой, пакетный способ преобразования картинок. Которым я с Вами, с удовольствием, делюсь. Ссылка на автора.
Для конвертирования GIF-ок в черно-белый формат. Потребуется приложение IrfanView. Скачиваем и устанавливаем его на свой ПК.

Запускаем приложение и загружаем в него GIF-ку. Потом жмем на кнопку меню „Сервис >> Извлечь все кадры“. После чего приложение извлечёт из ГИФ-ки все кадры изображений и сохранит их в той же папке, в которой находится сам файл анимации.

Следующим шагом нужно преобразовать все кадры анимации в черно-белые картинки, с требуемым для дисплея размером. Для этого жмём в меню „Файл >> Преобразовать“. Или кнопку „B“ на клавиатуре.

Сначала нужно указать, в какой формат нужно преобразовать, для этого нажимаем кнопку „Обработка“
И активируем все параметры, которые отмечены на скриншоте ниже.

После чего выделяем все ранее преобразованные картинки и жмем кнопку „Добавить“. И следом кликаем на кнопку „Выполнить“. После чего, в этой же папке появятся преобразованные ч/б изображения.

Для преобразования картинок в код, понятный компилятору, нужно скачать приложение OledAnimation
и положить его в папку с ч/б изображениями. В этой папке не должно быть других изображений кроме тех, которые мы конвертируем. После запуска приложения все файлы, находящиеся в папке будут проконвертированы.

В левом окне приложения мы получаем данные всех кадров анимации в формате Си.
Копируем их и вставляем в предварительно созданный заголовочный файл. Теперь осталось скопировать скетч для ардуино, который находится в правом окне. Но формат скетча, предложенного автором приложения, совершенно не оптимизирован и его дальнейшее использование совместно с другими проектами будет затруднительно. Поэтому я создаю массив указателей, в котором прописываю все имеющиеся кадры анимации, в том же порядке, как они пронумерованы.

Чтобы получилась красивая анимация, нужно подбирать исходники со сплошным однотонным фоном и контрастным изображением. Как на приложенном ниже изображении.

Подключаем дисплей к Ардуино
Для проверки анимации, понадобятся следующие компоненты:
Arduino nano
OLED SH1106
Провода соединительные

Соединяем дисплей с Arduino по следующей схеме:

Скетч для Ардуино
Скетч настолько простой, что даже комментировать в нем особо нечего.
Для воспроизведения анимации я вызываю простейшую функцию и предаю ей все требуемые параметры. Такие как: размер изображения по горизонтали и вертикали, длительность показа кадров, количество кадров в анимации, число повторов воспроизведения, имя массива указателей и цвет изображения, который в данном случае может принимать всего 2 значения: черный или белый. Учитывая не большой объем памяти программ контроллера ATmega328. Нужно учесть, что прокручивать в одном скетче несколько анимаций практически невозможно. Хотя если эти анимации будут маленького размера и с небольшим количеством кадров, то можно попробовать их запихнуть.

Для скетча так же потребуется библиотеки OLED_SH1106 и Adafruit-GFX
Так же можно скачать весь ардуино проект со всеми изображениями.

Посмотреть видео

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

Arduino & Pi

1.5K поста20.8K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

0
Автор поста оценил этот комментарий

Было бы неплохо добавить поддержку разных дисплеев. У разных контроллеров разный формат  данных.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Так с этим нет проблем. на любом дисплее будет работать. Библиотеке GFX все равно какой дисплей. Главное библиотеку-драйвер под него установить

0
Автор поста оценил этот комментарий

Придется подписаться и подождать))

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Можно и без подписки зайти через пару недель и проверить.
Подписка это дело добровольное.

0
Автор поста оценил этот комментарий

Как всегда, сохранивших пост больше чем плюсов. Не совсем понимаю как это работает. Зато всякий шлак про косплей и кошек собирает десятки тысяч.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

С кошечками я согласен. А вот радиоэлектроникой почему то мало кто интересуется. Хотя в будущем работать будут только роботы, а кто их будет проектировать, тестировать, собирать, ремонтировать, обслуживать и т.д.

показать ответы
0
Автор поста оценил этот комментарий

А как это применять на практике? В рекламе? Или где то в техн ке?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Сейчас снимаю новое видео, как раз оно и ответит на Ваш вопрос. Но придется подождать 2-3 недели

показать ответы
0
Автор поста оценил этот комментарий

Меньше чем хотелось бы. Меня больше напрягает, когда человек действительно напрягается, делает что то  полезное, а это не ценится. Зато репосты сисек в почете. А с постами/инструкциями технического характера вообще интересно. Часто людям даже плюсик лень поставить, зато сохраняют, так как информация полезная. НИПАНИМАЮ. Ну да ладно, это во мне плюсодрочер говорит.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Солидарен с Вами на все 100%!

1
Автор поста оценил этот комментарий
Но за ваши посты спасибо. Стараюсь плюсовать и сохранять =D
раскрыть ветку (1)
Автор поста оценил этот комментарий

Спасибо! Я тоже подписался на Вас, но пока у Вас нет статей

1
Автор поста оценил этот комментарий

Если уж понадобился IrfanView, то и в Floyd-Steinberg dithering он может. Ползунков под рукой нет, надо в другом диалоге (по сути вслепую) менять яркость или гамму.

Иллюстрация к комментарию
раскрыть ветку (1)
Автор поста оценил этот комментарий

Вы наверно не конца прочитали статью, я использую IrfanView и Floyd-Steinberg dithering. Вот только картинки в код он не умеет генерировать

показать ответы
2
DELETED
Автор поста оценил этот комментарий

Автор молодец. Но, к сожалению, не могу представить, куда это применить.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ответ в соседнем комментарии

показать ответы
3
Автор поста оценил этот комментарий

Не хватает простейшего сжатия, для повторяющихся байтов. Память у микроконтроллера не резиновая.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Согласен, для ардуино слишком большой объем памяти, но мой следующий проект на ESP8266, а там памяти больше чем мне требуется.