Адресные светодиоды (также пиксель) — гениальное инженерное решение, которое сильно упрощает работу с массивами цветных светодиодов. Мы уже подробно изучали устройство этих светодиодов на примере WS2812B (урок про адресные светодиоды).
Кроме самых популярных в DIY-среде WS2812B существуют и другие. Например, WS2811 — вообще, представляет собой отдельную микросхему, которую ещё нужно соединить с обычным RGB светодиодом для получения полноценного пикселя. А есть WS2813 — они знамениты тем, что сгоревший светодиод не блокирует прохождение сигнала дальше по цепочке.
Мы в RobotClass очень любим светодиоды, поэтому специально для DIY-энтузиастов разработали несколько модулей на базе ещё одного варианта — APC102-2020. Самое главное его отличие — он очень компактный. Размер этого светодиода — 2 x 2 x 0,75 мм. Благодаря таким размерам можно создавать матрицы и ленты с огромной плотностью пикселей.
Один из наших модулей называется светодиодный циферблат. Это плата с восемью APC102-2020, расположенными по кругу.
Напряжение питания модуля составляет от 3,3 до 5 В.
На этом уроке мы разберёмся с тем, как подключать светодиодный циферблат к Ардуино-совместимым платам и напишем пару демонстрационных программ.
Список необходимых компонентов
Для выполнения всех экспериментов в данном уроке, кроме самого светодиодного модуля от RobotClass, потребуются: Ардуино-совместимый контроллер, макетная плата и немного проводов вилка-вилка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.
Подключение
В отличие от WS2812B, адресные светодиоды APA102 управляются по двум сигнальным линиям: Data — данные и Clock — синхроимпульс. Их тоже можно соединять в цепочку, создавая ленты и матрицы. Для этого, каждый светодиод, кроме входных контактов Data In, Clock In имеет также выходные: Data Out, Clock Out.
На модуле светодиодный циферблат размещена цепочка из восьми светодиодов APA102-2020. С одной стороны платы имеется группа из четырёх входных контактов: 5V, CI, DI, Gnd. А а другой, четыре выходных контакта: 5V, CO, DO, Gnd.
Подключаем модуль к Ардуино по схеме:
Arduino | Gnd | 5V | 12 | 13 |
Циферблат | Gnd | 5V | DI | CI |
Программа
Для работы с модулем используем библиотеку Adafruit_DotStar, которую можно установить через менеджер библиотек в Arduino IDE или скачать по ссылке в конце урока.
Первая программа будет последовательно менять цвета каждого светодиода. Сначала один загорится зелёным, затем красным, потом синим. Показав все три цвета, программа полностью погасит пиксель и возьмется за следующий.
#include <Adafruit_DotStar.h>
#include <SPI.h>
#define NUMPIXELS 8
#define DATAPIN 12
#define CLOCKPIN 13
Adafruit_DotStar strip(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
void setup() {
strip.begin();
strip.show();
}
void loop() {
for(byte i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, 64,0,0);
strip.show();
delay(200);
strip.setPixelColor(i, 0,64,0);
strip.show();
delay(200);
strip.setPixelColor(i, 0,0,64);
strip.show();
delay(200);
strip.setPixelColor(i, 0,0,0);
strip.show();
delay(200);
}
}
В самом начале программы определена константа NUMPIXELS, которая хранит количество светодиодов в нашей цепочке.
Функция numPixels возвращает количество светодиодов в цепочке. По сути, мы можем заменить вызов этой функции на константу NUMPIXELS или просто на число 8.
Функция setPixelColor устанавливает цвет конкретного светодиода в цепочке. Она имеет четыре аргумента:
setPixelColor(индекс, зелёный,красный,синий);
Первый аргумент — индекс нужного светодиода (индексы нумеруются с нуля), а три остальных — компоненты цвета. Каждый компонент может принимать значение от 0 до 255, где 0 — полностью выключенный компонент. Таким образом, setPixelColor(4, 0,0,0) — выключит светодиод с индексом 4.
Загружаем программу и проверяем работу.
Индикатор уровня
А теперь более практическое использование. Сделаем индикатор чего угодно: уровня заряда аккумулятора, позиции потенциометра, расстояния и пр.
Пусть при уменьшении уровня, индикатор меняет цвет. От 6 до 8 — зелёный. От 3 до 4 — жёлтый, уже немного тревожно. От 1 до 2 — ахтунг, бежим!
#include <Adafruit_DotStar.h>
#include <SPI.h>
#define NUMPIXELS 8
#define DATAPIN 12
#define CLOCKPIN 13
Adafruit_DotStar strip(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
void setup() {
strip.begin();
strip.show();
Serial.begin(9600);
}
void loop(){
uint32_t color;
for( byte level=NUMPIXELS; level>0; level-- ){
if( level>4 )
color = strip.Color(64, 0, 0);
else if( level>2 )
color = strip.Color(64, 64, 0);
else
color = strip.Color(0, 64, 0);
for(byte i=0; i<NUMPIXELS; i++){
if( i<level )
strip.setPixelColor(i, color);
else
strip.setPixelColor(i, 0,0,0);
}
strip.show();
Serial.println(level);
delay(1000);
}
}
Из нового — функция Color, которая возвращает код цвета в виде 4-байтного целого числа (uint32_t). Мы используем её для удобства хранения цвета, чтобы не хранить его в трех отдельных переменных.
В данном примере сам уровень мы брали не из датчика, а задавали явно с помощью цикла. В случае использования показаний потенциометра, вместо цикла используем analogRead с нормированным значением (можно использовать функцию map):
byte level = analogRead(A0)*8/1023;
Радуга на APA102
А теперь развлекательная программа. Отобразим цветовое колесо и будем постепенно его вращать. Цветовое колесо — это спектр видимого света (цвета радуги), оформленный в виде круга.
#include <Adafruit_DotStar.h>
#include <SPI.h>
#define NUMPIXELS 8
#define DATAPIN 12
#define CLOCKPIN 13
Adafruit_DotStar strip(NUMPIXELS, DATAPIN, CLOCKPIN, DOTSTAR_BRG);
void setup() {
strip.begin();
strip.show();
}
void loop() {
uint16_t i, j;
for(j=0; j<256; j++) {
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(1);
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if(WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Самое сложное в этой программе — функция Wheel. Эта функция вычисляет цвет текущей позиции WheelPos в цветовом колесе.
Загружаем программу на контроллер и наблюдаем крошечное цветовое колесо.