Светодиодный циферблат на APA102-2020

Адресные светодиоды (также пиксель) — гениальное инженерное решение, которое сильно упрощает работу с массивами цветных светодиодов. Мы уже подробно изучали устройство этих светодиодов на примере WS2812B (урок про адресные светодиоды).

Кроме самых популярных в DIY-среде WS2812B существуют и другие. Например, WS2811 — вообще, представляет собой отдельную микросхему, которую ещё нужно соединить с обычным RGB светодиодом для получения полноценного пикселя. А есть WS2813 — они знамениты тем, что сгоревший светодиод не блокирует прохождение сигнала дальше по цепочке.

Мы в RobotClass очень любим светодиоды, поэтому специально для DIY-энтузиастов разработали несколько модулей на базе ещё одного варианта — APC102-2020. Самое главное его отличие — он очень компактный. Размер этого светодиода — 2 x 2 x 0,75 мм. Благодаря таким размерам можно создавать матрицы и ленты с огромной плотностью пикселей.

Один из наших модулей называется светодиодный циферблат. Это плата с восемью APC102-2020, расположенными по кругу.

Светодиодный циферблат APA102C RobotClass ROC

Напряжение питания модуля составляет от 3,3 до 5 В.

На этом уроке мы разберёмся с тем, как подключать светодиодный циферблат к Ардуино-совместимым платам и напишем пару демонстрационных программ.

Всё для этого урока можно приобрести у нас в интернет-магазине:

В корзину
В корзину
В корзину
В корзину

Подключение

В отличие от WS2812B, адресные светодиоды APA102 управляются по двум сигнальным линиям: Data — данные и Clock — синхроимпульс. Их тоже можно соединять в цепочку, создавая ленты и матрицы. Для этого, каждый светодиод, кроме входных контактов Data In, Clock In имеет также выходные: Data Out, Clock Out.

На модуле светодиодный циферблат размещена цепочка из восьми светодиодов APA102-2020. С одной стороны платы имеется группа из четырёх входных контактов: 5V, CI, DI, Gnd. А а другой, четыре выходных контакта: 5V, CO, DO, Gnd.

Подключаем модуль к Ардуино по схеме:

ArduinoGnd5V1213
ЦиферблатGnd5VDICI

Программа

Для работы с модулем используем библиотеку 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). Мы используем её для удобства хранения цвета, чтобы не хранить его в трех отдельных переменных.

Светодиодный циферблат APA102C RobotClass ROC

В данном примере сам уровень мы брали не из датчика, а задавали явно с помощью цикла. В случае использования показаний потенциометра, вместо цикла используем 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 в цветовом колесе.

Загружаем программу на контроллер и наблюдаем крошечное цветовое колесо.

Полезные ссылки

Библиотека Adafruit_DotStar


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.