Данная конструкция светодиодного драйвера позволяет управлять цветом и яркостью адресной светодиодной лентой WS2812B с помощью четырех потенциометров.
В основе схемы лежит микроконтроллер Atmega328 (Ардуино), который с помощью АЦП преобразует напряжение с потенциометров в конкретные цифровые значения, отправляемые далее на адресные светодиоды WS2812B.
Каждый из потенциометров подключен к одному из четырех аналоговых входов A0 — A3 (A0 — красный, A1 — зеленый, A2 — синий, A3 — яркость). Управляющие сигналы для светодиодов поступают на вывод D6 микроконтроллера.
Вся конструкция запитана напряжением 12 В, которое понижается до 5 В интегральным стабилизатором 7805. В схему также включены фильтрующие конденсаторы питания и постоянный резистор, подключенный к входу RESET микроконтроллера. Кварцевый резонатор в схеме не использован, т.к. ATmega328 работает от внутреннего генератора на частоте 8МГц.
Скетч
#include <Adafruit_NeoPixel.h> #define PIN 6 #define NUMPIXELS 30 Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int v_red; int v_green; int v_blue; int v_bri; void setup() { pinMode(A0,INPUT); pinMode(A1,INPUT); pinMode(A2,INPUT); pinMode(A3,INPUT); pixels.begin(); } void loop() { v_red=map(analogRead(A0),0,1023,0,255); v_green=map(analogRead(A1),0,1023,0,255); v_blue=map(analogRead(A2),0,1023,0,255); v_bri=map(analogRead(A3),0,1023,0,255); pixels.setBrightness(v_bri); for(int i=0; i<NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(v_red,v_green,v_blue)); pixels.show(); } }
В самом начале кода мы подключаем библиотеку Adafruit NeoPixel для работы со светодиодами. Далее объявляем цифровой вывод (6) для подключения светодиодов и количество светодиодов (30).
Стоит отметить, что заявленное количество светодиодов может быть больше, чем фактически подключенное. Поэтому мы указали 30, хотя на самом деле подключим всего с десяток.
Следующие инструкции инициализируют WS2812B и генерируют четыре переменные типа int, в которых будут храниться числовые значения цветов и яркости.
Цикл setup() содержит только описание входов потенциометров и функцию, активирующую светодиоды. Все управление происходит в цикле loop(). На самом деле мы можем разделить работу на две части. В первой части благодаря функции map() мы присваиваем переменной значение, считанное с аналогового входа и преобразованное так, чтобы оно было сопоставимо для WS2812B.
Проще говоря, АЦП микроконтроллера переводит напряжение с потенциометра в значение от 0 до 1023, а функция map() преобразует его в диапазон от 0 до 255.
Поскольку цветом каждого светодиода нужно управлять отдельно, то для управления цветами использован цикл for, связанный с переменной NUMPIXELS.
не жирно ли — ATmega328 для 20 строк кода?