Программирование анимаций на матрицах WS2812 8×8 и 16×16 через Arduino и Excel
Компоненты и материалы
| Arduino UNO | ×1 |
| WS2812 RGB LED матрица 8×8 | ×1 |
| Перемычки (Male/Female) — чёрный GND, красный 5V, зелёный Data | ×3 |
| Батарея 9 В (стандартная кронка) | ×1 |
| Разъём 9 В на джек (barrel jack) | ×1 |
| Pin header 5 позиций, 1 ряд, длинный (0.1") | ×1 |
Необходимые инструменты
- Паяльная станция
- Припой без свинца
О проекте
Приобретя первую матрицу WS2812 8×8 RGB LED, я ожидал адресацию через традиционную XY-систему координат. Вместо этого 64 светодиода собраны в цепочку из восьми рядов по восемь. Я обнаружил, что Excel-утилита Кевина Дарра, изначально созданная для матрицы 16×16, может быть адаптирована для управления 8×8 массивом. Модифицировав и таблицу, и сопровождающий Arduino-скетч, я создал универсальный инструмент для программирования LED-анимаций без внешних библиотек.
Обновлённая книга Excel, LED_Utility.xlsm, теперь поддерживает:
- Индивидуальное назначение RGB для каждого светодиода.
- Динамическое изменение свойств через VBA-скрипты.
- XY-перемещение для симуляции движения.
- Встроенные палитры для быстрого выбора цвета.
- Двойную поддержку матриц 8×8 и 16×16.
Ниже — пошаговые инструкции по сборке железа, настройке Excel-утилиты и загрузке Arduino-скетча. Каждый проект строится на предыдущем, вводя циклы, условие и модульные функции.
Сборка железа
Подключите матрицу 8×8 к Arduino UNO через 5-пиновый хэдер:
- DIN → пин 8 Arduino
- +5V → пин 5V
- GND → пин GND
В этой настройке координата (0,0) соответствует левому верхнему углу матрицы.
Обзор Excel-утилиты
Откройте LED_Utility.xlsm — она содержит три листа:
- Eight — интерфейс матрицы 8×8.
- Sixteen — интерфейс матрицы 16×16.
- ColMap — справочник распространённых RGB-кодов.
Книга по умолчанию в режиме «только чтение» для защиты вашей работы. Используйте File → Save As после генерации кода, чтобы сохранить дизайн.
Ключевые функции на листе Eight:
- Show — отображает RGB-значения выделенных ячеек (0–255).
- Var Map — принимает числовые или переменные значения, но не показывает вывод.
- Wrap Map — добавляет функцию модуля для обработки переполнения координат и поддерживает переменные для последующего использования.
- Clear — очищает обе входные сетки.
Каждая кнопка генерирует блок C++ кода, который копируется в Arduino-скетч. Код форматирован для кастомной функции mapLEDXY(), преобразующей XY-координаты в соответствующий индекс светодиода.
Arduino-скетч
Основной скетч (LED_Arduino.ino) содержит:
// Определение пина
#define WS2812_pin 8
// Общее количество светодиодов
#define numberOfLEDs 64
// RGB-буфер (3 байта на LED)
byte RGB[192];
// Предварительные объявления
void RGB_update(int LED, byte RED, byte GREEN, byte BLUE);
void mapLEDXY(int x, int y, byte RED, byte GREEN, byte BLUE);
void clearLEDs();
Рутина mapLEDXY() отображает пару координат в линейный массив, учитывая зигзагообразную проводку, типичную для матриц WS2812.
После вставки сгенерированного кода в функцию loop() загрузите скетч. Матрица мгновенно отреагирует на инструкции.
Проект 1 — Статичный красный квадрат
Создайте красный квадрат 3×3 в координатах (2,2)–(4,4). В Excel установите соответствующие ячейки: красный=255, зелёный/синий=0. Скопируйте сгенерированный код в строку 40 скетча:
mapLEDXY(2,2,255,0,0);mapLEDXY(2,3,255,0,0);mapLEDXY(2,4,255,0,0);
mapLEDXY(3,2,255,0,0);mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);
mapLEDXY(4,2,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0);
Загрузите и наблюдайте за горящим квадратом. Экспериментируйте: очистите сетку, смените цвета, добавьте рамку.
Проект 2 — Два цветных квадрата
Дублируйте скетч как Colour_Sq.ino и модифицируйте Excel-лист для второго, более крупного квадрата. Используйте кнопку Show для генерации кода и вставьте в скетч. Добавьте простую задержку и clearLEDs() для переключения между фигурами.
Проект 3 — Растущий квадрат
В скетче Grow.ino спроектируйте меньший внутренний квадрат и обрамите его рамкой по выбору. Удалите значения внутреннего квадрата, сгенерируйте код внешней рамки, вставьте оба блока в скетч. Результат — анимированный квадрат, расширяющийся и сжимающийся.
Проект 4 — Спиральная анимация
Для сложных паттернов инкапсулируйте каждый кадр в отдельную функцию и вызывайте их из loop(). Пример Spiral.ino использует пять вспомогательных функций для построения 5-слойной спирали. Этот модульный подход сохраняет главный цикл лаконичным и упрощает будущие правки.
Проект 5 — Цикл переменной яркости
Введите for-цикл для анимации яркости:
for (int r=0; r<256; r++) {
mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);
mapLEDXY(4,3,r,0,0);mapLEDXY(4,4,r,0,0);
RGB_update(-1,0,0,0); delay(50);
}
for (int r=255; r>=0; r--) {
mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);
mapLEDXY(4,3,r,0,0);mapLEDXY(4,4,r,0,0);
RGB_update(-1,0,0,0); delay(50);
}
Квадрат плавно нарастает и затухает.
Проект 6 — Затухающая рамка
Комбинируйте for-циклы с общей переменной g для затухания окружающей рамки:
for (int g=0; g<256; g++) {
b=g;
mapLEDXY(...); // ячейки рамки
RGB_update(-1,0,0,0); delay(50);
}
for (int g=255; g>=0; g--) {
b=g;
mapLEDXY(...); // ячейки рамки
RGB_update(-1,0,0,0); delay(50);
}
Здесь синий канал отслеживает зелёный для плавного перехода.
Проект 7 — Переход цвета
Используйте if для смены средних ячеек рамки с зелёного на жёлтый при достижении порога:
for (int r=0; r<256; r++) {
g=r;
if (g>64) { g=65; l=r; }
mapLEDXY(...); // ячейки
RGB_update(-1,0,0,0); delay(50);
}
Экспериментируйте с разными порогами для различных эффектов.
Проект 8 — Движущаяся стрелка
Генерируйте движущуюся стрелку параметризацией X-координаты:
for (int x=0; x<8; x++) {
mapLEDXY((x+0)%8,3,0,255,255);
mapLEDXY((x+1)%8,1,255,128,128);
mapLEDXY((x+1)%8,3,0,255,255);
mapLEDXY((x+1)%8,5,255,128,128);
mapLEDXY((x+2)%8,2,255,128,128);
mapLEDXY((x+2)%8,3,0,255,255);
mapLEDXY((x+2)%8,4,255,128,128);
mapLEDXY((x+3)%8,3,255,128,128);
RGB_update(-1,0,0,0); delay(100);
}
Используйте функцию Wrap Map в таблице для обработки переполнения координат.
Использование матрицы 16×16
Все концепции выше напрямую переносятся на матрицу 16×16. Замените LED_Arduino.ino на LED_Arduino16.ino и переключитесь на лист Sixteen в книге. Единственное изменение — константа numberOfLEDs и расчёт RGBlocation в mapLEDXY().
Расширения и советы
Хотя руководство фокусируется на 8×8 и 16×16, та же методология применима к другим размерам (например, 8×32). Для каждого нового размера обновите константу numberOfLEDs и модифицируйте расчёт индекса под проводку вашей матрицы. Держите книгу в режиме «только чтение», чтобы избежать случайной потери кода. Рассмотрите использование меньшей платы, например Arduino Nano, если важно потребление энергии.
Производственный процесс
- Панель управления полётным симулятором 2020 на Arduino Nano: LCD и CDI-дисплеи
- Панель переключателей и LED для Microsoft Flight Simulator 2020 на Arduino
- Программирование анимаций на матрицах WS2812 8×8 и 16×16 через Arduino и Excel
- Защита глобального IoT: три обязательных шага
- Топ-3 тренда цифрового производства, формирующие 2020 год
- Топ-3 стратегии для МСБ успешной международной экспансии
- Три ключевых урока для ритейлеров в условиях годовых сбоев поставок
- Робот «Уходи!» — простой стартовый набор Arduino для детей
- Топ-3 главных совета по ТО и безопасности промышленного оборудования
- Основное руководство: 3 проверенные стратегии закупки тяжёлого промышленного оборудования