Общие сведения
NeoPixel кольцо — это четыре модуля с 15-ю адресными RGB светодиодами в каждом, их «адресность» позволяет управлять цветом каждого светодиода на одной линии. Модули можно соединять друг с другом, используя только 1 вывод Arduino.
Характеристики
- Входное напряжение питания модуля: 5 В
- Количество светодиодов в модуле: 15
- Ток, потребляемый модулем: <675 мА
- Ток, потребляемый каждым светодиодом: < 45 мА (по 15 мА на полную яркость свечения каждого цвета светодиода)
- Уровень логической «1» на входе IN: > 0,7 Vcc
- Уровень логического «0» на входе IN: < 0,3 Vcc
- Длина световой волны: 620 ... 630 нм (для красного цвета)
- Длина световой волны: 515 ... 530 нм (для зелёного цвета)
- Длина световой волны: 465 ... 470 нм (для синего цвета)
- Рабочая температура: -25 ... 80 °C
- Температура хранения: -55 ... 150 °C
- Габариты: 111x27.5x3.3 мм
- Внутренний диаметр: 145мм
Подключение
Модули NeoPixel подключаются входом (DIN) к любому выводу Arduino. При подключении нескольких модулей их можно соединить друг с другом (выход OUT каждого модуля со входом IN следующего), а вход IN первого модуля к любому выводу Arduino. Обратите внимание, что при соединении кольцом, последний OUT и первый IN не соединяются! (см. схему подключения ниже). Нумерация (адрес) светодиодов является сквозной и начинается от ближайшего к выводу Arduino.
Для работы с адресными светодиодами предлагаем воспользоваться библиотекой iarduino_NeoPixel.
Инструкция по установке библиотеки.
Питание:
Входное напряжение 5 В постоянного тока, подаётся на выводы Vcc и GND модуля. Источник питания должен быть рассчитан на 3 А и более, поскольку максимальное потребление модулей (в случае соединения кольцом) составляет 2,7 А.
Подробнее о модуле:
Адресные светодиоды WS2812B это три светодиода RGB (Red - красный, Green - зелёный и Blue - синий) и драйвер (микросхема) для управления этими светодиодами, в одном SMD (Surface Mounted Device - прибор монтируемый поверхностно) корпусе.
Корпус каждого светодиода имеет 4 вывода: два вывода данных (IN - вход и OUT - выход) и два вывода питания (Vcc и GND). В модулях NeoPixel выходы (OUT) предыдущих светодиодов соединены со входами (IN) следующих, создавая цепочку светодиодов. Каждый модуль кольца NeoPixel имеет 6 выводов: два вывода данных (IN, OUT) и четыре вывода питания (Vcc, GND) - по два с каждой стороны. Также модули можно соединять в цепочку (например, в кольцо). Обратите внимание, что в таком случае крайние IN и OUT кольца не соединяются (см. рисунок с подключением). К одному выводу Arduino можно подключить «неограниченное» количество модулей NeoPixel.
Цвет каждого адресного светодиода задаётся 3 байтами (каждый байт указывает яркость одного цвета: 1-G, 2-R, 3-B). После того как первый адресный светодиод получил на вход (IN) первые 3 байта, он сохраняет их в своей ОЗУ, а остальные байты пропускает со входа (IN) на выход (OUT). Второй адресный светодиод сохранит в своей ОЗУ следующие 3 байта а остальные пропустит и т.д. Если в линию данных перестали поступать биты (на линии установлен уровень логического «0» дольше 50 мкс), светодиоды установят свои цвета. Каждый бит данных имеет длительность 1,25 мкс и состоит из импульса и паузы. Бит «0» отличается от бита «1» длительностью импульса: • бит «0» - импульс 350 нс, пауза 900 нс; • бит «1» - импульс 900 нс, пауза 350 нс.
Для работы с модулем предлагаем воспользоваться библиотекой iarduino_NeoPixel, которая позволяет работать с модулями NeoPixel если суммарное количество адресных светодиодов WS2812B не превышает 65534 шт.
Подробнее про установку библиотеки читайте в нашей инструкции.
Примеры:
Во всех следующих примерах модули спаяны в кольцо и подключены к 5 выводу Arduino (см. схему подключения выше). При подключении платы контроллера к компьютеру для загрузки скетча, необходимо отключать NeoPixel кольцо от платы (достаточно отключить один из проводов питания), для того, чтобы модуль не начал работать от USB порта (кольцо потребляет до 2,7 А; USB порт не рассчитан на такой ток).
Заливка кольца разными цветами:
#include <iarduino_NeoPixel.h> // подключаем библиотеку iarduino_NeoPixel для работы со светодиодами NeoPixel iarduino_NeoPixel led(5,60); // указываем, что к 5 выводу подключено 60 светодиодов uint8_t r=0; uint8_t g=1; uint8_t b=2; uint8_t w=3; // Вводим переменные - порядковые номера светодиодов void setup(){ led.begin(); // Инициируем работу с модулем NeoPixel } void loop(){ for (uint8_t i=0; i<12; i++){ // Повторяем 12 раз до зажжения всех светодиодов в конце led.setColor(r, 255,0,0); // Устанавливаем красный цвет для светодиода с номером r (r,R,G,B) led.write(); // Записываем delay(50); // Ждём led.setColor(g, 0,255,0); // Устанавливаем красный цвет для светодиода с номером g (g,R,G,B) led.write(); // Записываем delay(50); // Ждём led.setColor(b, 0,0,255); // Устанавливаем красный цвет для светодиода с номером b (b,R,G,B) led.write(); // Записываем delay(50); // Ждём led.setColor(w, 255,255,255); // Устанавливаем красный цвет для светодиода с номером w (w,R,G,B) led.write(); // Записываем delay(50); // Ждём r+=4; g+=4; b+=4; w+=4; // Увеличиваем значения, чтобы зажечь следующие светодиоды } }
Заливка кольца разными цветами радуги:
#include <iarduino_NeoPixel.h> // подключаем библиотеку iarduino_NeoPixel для работы со светодиодами NeoPixel iarduino_NeoPixel led(5,60); // указываем, что к 5 выводу подключено 60 светодиодов uint8_t j; // Объявляем переменную для хранения значения сдвига спектра цветов для всех светодиодов (от 0 до 255) uint8_t k; // Объявляем переменную для хранения положения сдвига спектра цвета для каждого светодиода на спектре j (зависит от количества светодиодов) uint8_t r, g, b; // Объявляем переменную для хранения цветов RGB для каждого светодиода const uint8_t z=5; // Определяем константу указывающую задержку в мс (чем выше значение, тем медленнее перелив цветов) void setup(){ led.begin(); // Инициируем работу с модулем NeoPixel } void loop(){ j++; // Смещаем спектр цветов для всех светодиодов for(uint16_t i=0; i<60; i++){ // Проходим по всем светодиодам k=((uint16_t)(i*256/60)+j); // Определяем положение очередного светодиода на смещённом спектре цветов if(k<85) { b=0; r=k*3; g=255-r;}else // Перелив от зелёного к красному, через жёлтый if(k<170){k-=85; g=0; b=k*3; r=255-b;}else // Перелив от красного к синему , через фиолетовый {k-=170; r=0; g=k*3; b=255-g;} // Перелив от синего к зелёному, через голубой led.setColor(i, r,g,b); // Устанавливаем выбранный цвет для очередного светодиода } led.write(); // Записываем цвета всех светодиодов delay(z); // Устанавливаем задержку }
Данный пример может работать как с большим, так и с меньшим количеством светодиодов, тогда Вам нужно указать их количество во второй строке скетча. Скорость перелива зависит от значения константы z, чем больше её значение, тем медленнее перелив.
Простой таймер:
В данном примере к 3 выводу контроллера подключена кнопка. Вторым выводом она подключена к GND.
#include <iarduino_NeoPixel.h> // подключаем библиотеку iarduino_NeoPixel для работы со светодиодами NeoPixel iarduino_NeoPixel led(5,60); // указываем, что к 5 выводу подключено 60 светодиодов #define buttonNextPin 3 // пин кнопки "Далее" bool btnNextFlag = false; // флаг нажатия кнопки uint32_t btnNextTimer = 0; // таймер нажатия кнопки bool clickFlag = false; // флаг нажатия кнопки uint8_t steps=0; // шаг заливки таймера uint8_t ledCount = 60; // число светодиодов в круге uint8_t colorRed, colorGreen; // цвета для заливки круга uint32_t stepTime = 1000; // время задержки (мс) меду шагами. Меняя это значение, можно настраивать время работы таймера void setup(){ Serial.begin(9600); // инициируем передачу данных в монитор последовательного порта if(led.begin()) {Serial.println("Ok");} // инициируем работу со светодиодами и выводим сообщение об успешной инициализации else {Serial.println("Err");} // если инициализация невозможна (не хватает памяти для хранения цветов всех светодиодов), то выводим сообщение об ошибке pinMode(buttonNextPin, INPUT_PULLUP); // пин, к которому подключена кнопка - вход, подтиягивающий резистор полюкчен програмно } void loop(){ randomSeed(analogRead(A0)); // новая опорная точка для генератора случайных чисел (на "висящем в воздухе" выводе А0 присутствует случайный сигнал) bool buttonNextState = !digitalRead(buttonNextPin); // состояние кнопки - сигнал с пина кнопки (инвертируем для удобства) if (buttonNextState && !btnNextFlag && millis() - btnNextTimer > 100) { // если кнорка нажата И до этого нажата не была И она нажата уже 100мс (задержка от дребезга контактов) btnNextTimer = millis(); // сбрасываем таймер Serial.println("press"); // выводим инфомацию о том что кнопка нажата btnNextFlag = true; // флаг нажатия кнопки - true clickFlag=true; // флаг нажатия кнопки - true } if (!buttonNextState && btnNextFlag) { // если кнопку отпустили btnNextFlag = false; // флаг нажатия кнопки false - теперь она отпущена btnNextTimer = millis(); // сбрасываем таймер } if (clickFlag){ //если был клик кнопки colorRed = round(map(steps, 0, 60, 0, 200)); //перевод числа шагов steps в диапазон цвета 0...200 colorGreen = round(map(steps, 0, 60, 100, 0)); //перевод числа шагов steps в диапазон цвета 0...100 for (uint16_t i=0; i<=steps; i++){ // зажигаем белым светодиоды от начала до текущего шага led.setColor(i, 255,255,255); } for (uint16_t i=steps+1; i<=ledCount; i++){ // зажигаем цвемтом оставщиеся светодиоды. Цвет меняется по мере приближения таймера к концу led.setColor(i, colorRed,colorGreen,0); } led.write(); // записываем delay (stepTime); // задержка (следующего шага) steps++; // увеличиваем текущиё шаг на 1 if (steps >= ledCount){ // если дошли до конца for (uint8_t i=0; i<3; i++){ // повторяем три раза: led.setColor(NeoPixelAll, 0,0,0); // гасим все светодиоды led.write(); // записываем delay (500); // ждём 500мс led.setColor(NeoPixelAll, 255,0,0); // зажигаем все светодиоды led.write(); // записываем delay (500); // ждём 500мс } delay (500); // задержка 500мс led.setColor(NeoPixelAll, 0,0,0); // гасим все светодиоды led.write(); // записываем steps = 0; clickFlag=false; //меняем флаг } } }
Описание основных функций библиотеки:
Подключение библиотеки:
#include <iarduino_NeoPixel.h> // Подключаем библиотеку iarduino_NeoPixel для работы с модулями NeoPixel iarduino_NeoPixel led( №_ВЫВОДА , КОЛИЧЕСТВО_СВЕТОДИОДОВ ); // Объявляем объект led для работы с модулями подключёнными к указанному выводу
Функция begin();
- Назначение: Инициализация работы с модулями NeoPixel.
- Синтаксис: begin();
- Параметры: Нет.
- Возвращаемые значения: bool, 1 (успешная инициализация) или 0 (отказ инициализации, не хватает памяти).
- Примечание: Вызывается 1 раз в коде setup.
- Пример:
if(led.begin()) {Serial.println("Ok" );} // Инициируем работу с модулями NeoPixel и выводим сообщение об успешной инициализации else {Serial.println("Err");} // Не хватает памяти для хранения цветов всех светодиодов, выводим сообщение об ошибке
Функция setColor();
- Назначение: Указание цвета для адресного светодиода.
- Синтаксис: setColor( №_СВЕТОДИОДА , ЦВЕТ [ , ЯРКОСТЬ ] );
- Параметры:
- №_СВЕТОДИОДА - число от 0 до 65534, или NeoPixelAll если требуется установить цвет сразу всем светодиодам.
- ЦВЕТ - можно указать одним числом (как в графических редакторах), например: 0xFF00FF - фиолетовый. А можно указать тремя параметрами (числами) через запятую, R, G, B, например: 0xFF, 0xFF, 0x00 - жёлтый.
- ЯРКОСТЬ - необязательный параметр от 0 до 255. Если указать 127 - то указанный цвет не претерпит изменений. Чем ближе число к 0, тем темнее будет указанный цвет, а чем ближе число к 255, тем светлее будет указанный цвет (вплоть до белого).
- Возвращаемые значения: Нет.
- Примечание: Функция устанавливает цвет в массиве цветов, но их запись в модули осуществляется функцией write().
- Пример:
led.setColor(0, 0xFF00FF); // Установить фиолетовый цвет для 0 светодиода led.setColor(1, 0xFF, 0x00, 0xFF); // Установить фиолетовый цвет для 1 светодиода led.setColor(2, 0xFF, 0x00, 0xFF, 200); // Установить фиолетовый цвет для 2 светодиода, но сделать его более светлым led.setColor(NeoPixelAll, 0, 255, 0); // Установить зелёный цвет для всех светодиодов
Функция write();
- Назначение: Запись (применение) всех установленных цветов в модули NeoPixel.
- Синтаксис: write();
- Параметры: Нет.
- Возвращаемые значения: Нет.
- Примечание: Если для светодиода новый цвет не установлен, то он сохранит старый цвет.
- Пример:
led.write(); // Запись всех установленных цветов в модули NeoPixel
Функция count();
- Назначение: Получение количества используемых светодиодов.
- Синтаксис: count();
- Параметры: Нет.
- Возвращаемые значения: Количество светодиодов, от 0 до 65534.
- Примечание: Функция возвращает число светодиодов, которое было указано при объявлении объекта библиотеки. Эту функцию можно использовать для создания циклов. Если Вы пожелаете изменить количество светодиодов, то Вам будет достаточно сделать это в строке объявления объекта, а не править весь скетч.
- Пример:
for(uint16_t i=0; i<led.count(); i++){ // Цикл для прохода по всем светодиодам ... }
Необязательная функция getPointer();
- Назначение: Получение указателя на массив цветов светодиодов.
- Синтаксис: getPointer();
- Параметры: Нет.
- Возвращаемые значения: uint8_t*, Указатель на массив цветов светодиодов.
- Примечание: Это необязательная функция которая возвращает указатель на массив цветов светодиодов. Используя этот массив Вы сами можете формировать цвета в обход функции setColor(). А так же можете считывать ранее установленные цвета.
- байты 0, 1, 2 массива, это цвета 0 светодиода (G-зелёный, R-красный, B-синий).
- байты 3, 4, 5 массива, это цвета 1 светодиода (G-зелёный, R-красный, B-синий) и т.д.
- размер массива зависит от количества светодиодов указанных при объявлении объекта библиотеки.
- Пример:
uint8_t *ptrLED = led.getPointer(); // Получаем указатель на массив цветов светодиодов ptrLED[0]=255; ptrLED[1]=0; ptrLED[2]=0; // Устанавливаем зелёный цвет для 0 светодиода ptrLED[3]=0; ptrLED[4]=255; ptrLED[5]=0; // Устанавливаем красный цвет для 1 светодиода ptrLED[6]=0; ptrLED[7]=0; ptrLED[8]=255; // Устанавливаем синий цвет для 2 светодиода led.write(); // Записываем установленные цвета в модули.
Применение:
- Декоративное освещение;
- Создание игр;