Найти в Дзене
Электроника и жизнь

Управление матрицей 16x16 адресных светодиодов ws2812b с помощью микроконтроллера ATtiny85

Здравствуйте, уважаемые читатели! В этой статье поговорим о том, как можно управлять различными эффектами на светодиодной матрице с помощью микроконтроллера ATtiny85. А непосредственно переключать эффекты, мы будем с помощью инкрементального энкодера EC11. Подробнее о работе с которым можно почитать в статье «Инкрементальный энкодер с кнопкой EC11. Обзор, подключение к Ардуино, скетч для работы с энкодером».

Управление матрицей 16x16 адресных светодиодов ws2812b с помощью ATtiny85
Управление матрицей 16x16 адресных светодиодов ws2812b с помощью ATtiny85

Цель статьи, показать, что возможностей ATtiny85, вполне хватает для работы со светодиодной матрицей. Не обязательно использовать Arduino или еще более продвинутые платы или микроконтроллеры.

Но в начале, по традиции, начнем разбор схемы на Arduino UNO. Соберем схему на макетной плате.

Схема подключения матрицы к энкодеру и Arduino UNO
Схема подключения матрицы к энкодеру и Arduino UNO

Светодиодную матрицу запитываем отдельно, от регулируемого блока питания. У которого выставлено напряжение в 5 В и ограничение по току в 2 А. Т.к. ток потребления светодиодной матрицей может быть достаточно большим, то матрицу всегда нужно запитывать отдельно, а не через плату с микроконтроллером.

Пин для передачи цифрового сигнала на светодиодную матрицу, я через провод, с уже припаянным резистором на 220 Ом, подключаю к 9 пину Arduino UNO.

Устанавливаю на плате энкодер и крайние его пины GND и подключаю к минусу и плюсу макетной платы соответственно. Пин S1 соединяю соединяю со 2 пином Arduino UNO, пин S2 с 6 пином, пин Key, отвечающий за нажатие кнопки с 3 пином Arduino UNO. Второй и третий пин выбраны не случайно. Именно они поддерживают аппаратное прерывание у Arduino UNO.

Перейдем к скетчу. Про установку библиотеки FastLED я уже рассказывал в одной из прошлых статей "Управление светодиодной матрицей 16x16 адресных светодиодов ws2812b с помощью энкодера". Откроем самый простейший пример библиотеки FastLED, всё назначение которого, помигать одним светодиодом.

Скетч Blink библиотеки FastLED
Скетч Blink библиотеки FastLED

Увеличим число светодиодов до 256. У нас же матрица 16х16 светодиодов. В инструментах выберем плату ATtiny85. И попробуем вначале проверить, поместится ли данный скетч в плату.

Для этого, вместо загрузки скетча, нажимаем кнопку «Проверить». Происходит компиляция скетча и выдается ошибка. Если посмотреть текст ошибки, то видно что нам не хватило оперативной памяти. Это та, которая у нас SRAM, и которой на ATtiny85 всего 512 КБ.

При попытке загрузки скетча в ATtiny85 выводится ошибка нехватки оперативной памяти
При попытке загрузки скетча в ATtiny85 выводится ошибка нехватки оперативной памяти

Если в скетче мы уменьшим число задействованных светодиодов матрицы в 2 раза, до 128, то скомпилировав скетч, видим, что объем задействованной оперативной памяти уменьшился, и скетч уже помещается в мозгах ATtiny85.

А если уменьшить число светодиодов до 128, то памяти уже хватает оперативной памяти
А если уменьшить число светодиодов до 128, то памяти уже хватает оперативной памяти

Это происходит из-за того, что для работы с каждым светодиодом, в памяти выделяется 3 байта для задания его цвета. Таким образом, для светодиодной матрицы 16х16 адресных светодиодов минимум нужно 256х3 = 768 байт оперативной памяти.

Но решение есть. Нужно заменить библиотеку FastLED на библиотеку microLED, от Алекса Гайвера. Скачать библиотеку можно у него на странице https://alexgyver.ru/microled/.

Страница сайта с библиотекой microLED
Страница сайта с библиотекой microLED

Важной особенностью библиотеки, является то, что можно изменить глубину цвета COLOR_DEBTH. Т.е. по умолчанию COLOR_DEBTH у нас равно 3, что соответствует 24 битному представлению цвета, но и занимает в памяти 3 байта. Если COLOR_DEBTH равно 2, то у нас 16 битное представление цвета и мы тратим 2 байта на каждый адресный светодиод. Этот вариант нас всё равно не устраивает, т.к. 256х2 = 512 байт, а еще нужно место в памяти и под другие переменные. А вот если установить значение COLOR_DEBTH равное 1, то каждый цвет мы будем задавать с помощью 8 бит и в случае с матрицей 16х16 адресных светодиодов, займем в памяти 256 байт. Что как раз устраивает при использовании ATtiny85.

Скачиваем библиотеку с сайта, и добавляем ее в Arduino IDE.

Добавление библиотеки microLED
Добавление библиотеки microLED

Переходим в примеры библиотеки. Тут их достаточно много. Открываем самый первый пример basicEffects.

Выбор скетча basicEffects библиотеки microLED
Выбор скетча basicEffects библиотеки microLED

В скетче, изменим пин, к которому у нас подключена светодиодная матрица, на 9. И число светодиодов матрицы на 256. Значение COLOR_DEBTH меняем с 3 на 1.

Код скетча basicEffects с внесенными измененияями
Код скетча basicEffects с внесенными измененияями

В функции loop() закомментировано еще 3 эффекта. Предполагается, что мы будем последовательно раскомментировать и смотреть каждый. Но не зря же мы подключили к схеме энкодер. Добавляем к скетчу код, который обрабатывает поворот ручки энкодера и нажатие на его кнопку.

Код скетча basicEffects в который добавлена работа с энкодером (ссылка на скетч в конце статьи)
Код скетча basicEffects в который добавлена работа с энкодером (ссылка на скетч в конце статьи)

Загружаем скетч в Ардуино. По нажатию на кнопку энкодера и переходим от 1-го эффекта к 4-му. И так по кругу.

Переключаем эффекты матрицы с помощью энкодера
Переключаем эффекты матрицы с помощью энкодера

Теперь адаптируем данный скетч для ATtiny85. Изменим номера пинов к которым мы подключаем энкодер. Его пин S1, подключим к 5 пину ATtiny, пин S2 к 6 пину ATtiny и пин, отвечающий за нажатие кнопки key к 7 пин ATtiny85. Светодиодную матрицу подключим ко 2 пину ATtiny.

Так как у ATtiny всего одно аппаратное прерывание, расположенное на 7 пину, куда мы и подкличили пин key энкодера, то в функции attachInterrupt() первым аргументом у нас будет 0, а далее следовать функция обработки события нажатия на кнопку. Хочу напомнить, что в первом аргументе данной функции указывается не номер пина, на котором работает прерывание, а номер прерывания.

Распиновка ATtiny85. Выделен 7 пин поддерживающий работу с аппаратным прерыванием
Распиновка ATtiny85. Выделен 7 пин поддерживающий работу с аппаратным прерыванием

INT0, т.е. нулевое прерывание. В этом скетче вращение регулятора энкодера у меня задействовано не будет, но соответствующий код в скетче и подключение их к микроконтроллеру, пусть остаются, пригодятся в следующих проектах.

Загружаем скетч в ATtiny85 и устанавливаем микроконтроллер на макетную плату. Все провода подключены по размещенной ниже схеме.

Схема подключения матрицы к энкодеру и ATtiny85
Схема подключения матрицы к энкодеру и ATtiny85

Подаем питание и видим, как включается первый из эффектов. Нажимаем на кнопку энкодера. Переходим ко второму эффекту, далее к третьему, к четвертому и далее по кругу.

Управление сменой эaфектов с помощью кнопки энкодера и ATtiny85
Управление сменой эaфектов с помощью кнопки энкодера и ATtiny85

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

Видео, по материалам статьи:

_________________________________________________________

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

Другие публикации по теме: