Библиотека Adafruit NeoPixel

25.02.2018 14:01

genaonyx



Описание

Библиотека Adafruit NeoPixel, разрабатывается компанией Adafruit Industries. Библиотека предназначена для работы с различными светодиодными лентами и неопиксельными кольцами (NeoPixel Ring), продаваемыми в фирменном интернет магазине компании Adafruit. Популярность библиотека получила благодаря открытому исходному коду, простотой реализации и поддержки всех микроконтроллеров Arduino и некоторых других популярных платформ.

Библиотека написана на C++, поддерживает светодиодные ленты и неопиксельные кольца, основанные на светодиодах WS2812 и WS2811.

Подробнее о светодиодных лентах на пикселях WS2812B вы можете посмотреть здесь.


Установка

Добавить библиотеку Adafruit NeoPixel в Arduino IDE можно двумя способами:

1. Через «Менеджер библиотек»

Открываем «Менеджер библиотек» перейдя по следующим вкладкам меню: «Скетч»«Подключить библиотеку»«Управлять библиотеками…»


В открывшемся окне «Менеджер библиотек» в поле «Отфильтровать результаты поиска…» вписать название библиотеки «NeoPixel». В получившемся списке выбрать «Adafruit NeoPixel by Adafruit» и нажать на кнопку «Установка».


2. Самостоятельная установка

Для самостоятельной установки библиотеки, необходимо перейти на страницу библиотеки в GitHub.

В правом углу нажать на кнопку «Clone or download» - «Download ZIP».

После скачивания библиотеки, запустить Arduino IDE и перейти по следующим меню: «Скетч»«Подключить библиотеку» - «Добавить .ZIP библиотеку…», выбрать скачанный архив и нажать на кнопку «Открыть».


Подключение

Для того чтобы подключить библиотеку к своему скетчу необходимо в самом его начале прописать следующее:

#include "Adafruit_NeoPixel.h"

Эта строчка подключит заголовочный файл библиотеки и даст возможность использовать ее в своем проекте.


Далее необходимо создать основной объект библиотеки с которым мы и будем работать.

// Параметр 1 - Количество пикселей в ленте.
// Параметр 2 - Порт, к которому подключена лента.
// Параметр 3 - Дополнительные флаги (по мере необходимости):
//  - NEO_KHZ800 – Передача данных на частоте 800 кГц (для продуктов и лент на светодиодах WS2812).
//  - NEO_KHZ400 – Передача данных на частоте 400 кГц (для продуктов и лент на светодиодах WS2811)
//  - NEO_GRB – Последовательность цветов при передаче данных (Зеленый, Красный, Синий).
//  - NEO_RGB – Последовательность цветов при передаче данных (Красный, Зеленый, Синий).
//  - и т.д.
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_GRB + NEO_KHZ800);

Здесь мы создаем объект strip для управления светодиодной лентой состоящей из 60 пикселей типа WS2812B. И указываем, что вход управления лентой подключен к 6 порту Arduino.

1. По умолчанию библиотека настраивается на светодиоды WS2812, то есть выставляет флаги NEO_GRB + NEO_KHZ800, по этому, если вы используете ленту WS2812 или WS2812B данный параметр можно игнорировать и указать только порт и количество пикселей в ленте.
2. Если вы подключаете светодиодную ленту к 6 порту, то и порт можно не указывать, таким образом обязательным параметром является только количество пикселей в ленте.


Инициализация

Для инициализации нашей ленты и дальнейшей работы с ней, необходимо в секции setup() вызвать две команды ранее созданного объекта ленты.

void setup() 
{ 
  strip.begin(); // Функция begin() настроит порт Arduino и выставит значения по умолчанию. 
  strip.show();  // Функция show() передаст команду на выключение всем пикселям. 
} 

Функция show() в секции setup() не обязательная. Так как после инициализации все данные сброшены по умолчанию, функция по сути просто передает команды на выключение ленты.


Управление

1. setPixelColor()

Для того чтобы задать любому пикселю ленты определенный цвет, существует переопределяемая функция setPixelColor(), переопределяемая потому, что имеет аж три варианта входящих параметров.

Первый вариант это:

strip.setPixelColor(n, red, green, blue);

Где параметр:

  • n - Номер пикселя в ленте (отсчет идет с нуля, то есть если в вашей ленте 60 пикселей, то первый из них будет 0, а последний 59).
  • red - Число от 0 до 255 определяющее яркость красного светодиода в пикселе.
  • green - Число от 0 до 255 определяющее яркость зеленого светодиода в пикселе.
  • blue - Число от 0 до 255 определяющее яркость синего светодиода в пикселе.

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

Следующий вариант функции аналогичен первому, с тем лишь исключением, что имеет дополнительный пятый параметр "white".

strip.setPixelColor(n, red, green, blue, white);

Данный параметр используется в лентах, в которых помимо трехцветных пикселей, установлены еще и белые светодиоды, и данным параметром устанавливается их яркость.
Для того, чтобы использовать данную функцию, необходима как сама RGBW лента, так и при создании объекта «strip» в параметре №3 необходимо указать NEO_GRBW или NEO_RGBW.

strip.setPixelColor(n, color);

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


2. Color()

Функция Color() объединяет цвета в одно 32-битное число.

uint32_t magenta = strip.Color(255, 0, 255); // Пурпурный.
uint32_t greenishwhite = strip.Color(0, 64, 0, 64); // Светло зеленый.


3. show()

Функция show() передает данные в ленту. Данную функцию необходимо вызывать каждый раз после того, как вы изменили цвета пикселей или настройки ленты.

void loop()
{
  strip.setPixelColor(0, random(255), random(255), random(255)); // Случайный цвет и оттенок.
  strip.show(); // Передаем в ленту.
  delay(1000); // Ждем одну секунду. 
}


4. getPixelColor()

Функция getPixelColor() возвращает цвет пикселя в виде 32-битного числа. В параметре n задается номер пикселя, цвет которого необходимо вернуть. 

uint32_t color = strip.getPixelColor(n);


5. numPixels()

Функция возвращает количество пикселей в ленте. Используется как правило в циклах или при работе с несколькими светодиодными лентами.

uint16_t n = strip.numPixels();


6. setBrightness()

Функция задает общую яркость светодиодной ленты. Например в примере ниже задается 1/4 яркость ленты.
Как и в случае с setPixelColor(), изменения вступают в силу, только после вызова функции show().

strip.setBrightness(64);

Авторы библиотеки не рекомендуют использовать данную функцию при создании световых эффектов, и рекомендуют вызывать ее разово в секции setup(). 


Вопросы / Ответы

Я задаю цвета пикселям но ничего не происходит!

 1. Убедитесь, что вы вызвали функцию strip.begin() в секции setup().
 2. Убедитесь, что вы вызываете функцию strip.show() после того как изменяете цвета пикселей.


Могу ли я использовать несколько объектов для лент подключенных к разным портам?

Конечно, для этого необходимо создать второй объект со своим уникальным наименованием.

Adafruit_NeoPixel strip_a = Adafruit_NeoPixel(16, 5); 
Adafruit_NeoPixel strip_b = Adafruit_NeoPixel(16, 6);

В данном примере создается два объекта (strip_a и strip_b) для двух лент подключенных к портам 5 и 6.


Могу ли я подключить несколько лент к одному порту Arduino?

Да можете, для этого необходимо соединить выход одной ленты со входом другой, а при создании объекта указать сумму пикселей обоих лент.


Неправильно отображаются цвета, вместо красного горит синий!

Скорее всего вы перепутали ключ, указывающий последовательность цветов при передаче данных. Попробуйте поменять ключ NEO_RGB на NEO_GRB и наоборот.


Цвета расплываются когда я использую setBrightness().

Как я уже писал ранее, функцию setBrightness() надо использовать разово, в секции setup(). Она не предназначена для использовании при создании спецэффектов.


Выделяемая память

Библиотека NeoPixel резервирует 3 байта оперативной памяти на каждый пиксель. Учитывая, что в Arduino UNO всего два килобайта оперативной памяти, плюс она нужна для реализации ваших спецэффектов и скетча, ее может не хватить для подключения больших лент (от 200 пикселей и больше). По этому если вы хотите использовать ленты с несколькими сотнями пикселей, посмотри в сторону Arduino Mega или Arduino Duo.


Пример

// Подключаем библиотеку Adafruit NeoPixel. 
#include "Adafruit_NeoPixel.h" 

// Указываем, какое количество пикселей у нашей ленты. 
#define LED_COUNT 30 

// Указываем, к какому порту подключен вход ленты DIN. 
#define LED_PIN 6 

// Создаем переменную strip для управления нашей лентой. 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800); 

void setup() 
{ 
  // Инициализируем ленту. 
  strip.begin(); 
} 

void loop() 
{ 
  // Включаем все светодиоды. 
  for (int i = 0; i < LED_COUNT; i++) 
  { 
    strip.setPixelColor(i, strip.Color(255, 0, 0)); // Красный цвет. 
  } 
  // Передаем цвета ленте. 
  strip.show(); 
  // Ждем 500 мс. 
  delay(500); 
  // Выключаем все светодиоды. 
  for (int i = 0; i < LED_COUNT; i++) 
  { 
    strip.setPixelColor(i, strip.Color(0, 0, 0)); // Черный цвет, т.е. выключено. 
  } 
  // Передаем цвета ленте. 
  strip.show(); 
  // Ждем 500 мс. 
  delay(500); 
}


Расскажи о нас

Сообщение

Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.