Готовимся к Новому году: простая гирлянда на Arduino

Адаптированный перевод статьи «Let’s Make Arduino LED Holiday Lighting»

К Новому Году везде начинают продавать гирлянды, но мы не ищем лёгких путей и предлагаем вам сделать гирлянду самостоятельно. Это просто, интересно и недорого, а заодно позволит вам потренироваться в работе с Arduino. Итак, начнём.

Примечание Для создания подобной гирлянды вам потребуются минимальные знания в Arduino. Однако если вы в себе не уверены — ничего страшного:

Что понадобится

  • Arduino Uno;
  • адресная светодиодная лента на WS2811;
  • источник питания для ленты.

Светодиодная лента

Светодиодная лента — это группа из светодиодов, размещённых на гибком и клейком основании. Лента может быть длиной от 30 см до 5 м.

Существует два типа лент: с синхронизированными светодиодами и адресными. Для гирлянды понадобится второй тип. В этой ленте к каждому светодиоду подключён специальный чип. Эти чипы соединены последовательно. Всего лишь по одному проводу, подключенному к первому чипу, можно управлять цветом отдельно каждого светодиода в ленте.

Традиционная адресная светодиодная лента

Традиционная адресная светодиодная лента

У таких адресных светодиодных лент множество форм-факторов. Есть традиционные формы лент или же матрицы. Есть ленты с отдельными светодиодами, которые лучше всего подойдут на роль гирлянды. Вот некоторые их них:

Для примера будет использоваться последний тип адресной ленты:

Светодиоды наподобие гирлянды

Контроллер

В гирлянде контроллером ленты будет Arduino Uno. Но для этих целей подойдёт всё, что под руку попадётся: различные платы Arduino, МК серии ESP, STM, AVR, PIC, микрокомпьютеры Raspberry Pi. Единственное, о чём ещё следует помнить, это о логическом уровне контроллера. Некоторые из них работают на 3-вольтовой логике, и нужно будет использовать конвертер уровней.

Тока, выдаваемого с Arduino Uno, не хватит на запитывание ленты. Поэтому нужно использовать внешний источник питания на 5В (обратите внимание, некоторые ленты могут запитываться от 12В). Потребляемый ток напрямую зависит от длины ленты, поэтому нужно внимательно подбирать источник питания в зависимости от ваших целей. Минусовые контакты источника питания и контроллера нужно объединить. Плюс от источника питания нужно подключить напрямую к плюсовому контакту ленты. Сигнальный же контакт ленты нужно подключить к любому порту Uno.

Схема подключения ленты к контроллера и источнику питания

Схема подключения ленты к контроллера и источнику питания

Для управления лентой понадобится специальная библиотека. В этой статье детально описывается установка библиотеки Adafruit NeoPixel.

После скачивания zip-файла, нужно установить его в Arduino IDE. Переходите в СкетчПодключить библиотекуДобавить .ZIP библиотеку и выберите нужный файл.

Зажигаем!

Вначале стоит проверить схему на работоспособность. Для этих целей подойдёт следующий код:

#include 
 
#define PIN 6 // Номер пина, к которому подключен сигнальный провод ленты
#define LED_NUM 50  // Количество светодиодов в ленте
 
Adafruit_NeoPixel ledtape = Adafruit_NeoPixel(LED_NUM, PIN, NEO_GRB + NEO_KHZ800);  // Если у ленты контроллер WS2812, то третий параметр должен быть NEO_KHZ800, а если WS2811 — NEO_KHZ400
 
void setup() {
  ledtape.begin();
  ledtape.show(); // Выключит все светодиоды
}
 
void loop() {
 uint16_t i, j;
 
 for(j=0; j <256; j++) {
   for(i=0; i < ledtape.numPixels(); i++) {
     ledtape.setPixelColor(i, rotateColor((((i) * 256 / ledtape.numPixels()) + j) & 255));
   }
   ledtape.show();
   delay(20);
 }
}
 
// Функция прохода по цветам
uint32_t rotateColor(byte WheelPos) {
  if(WheelPos < 85) {
   return ledtape.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return ledtape.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return ledtape.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

Если все компоненты исправны и схема собрана корректно, то вы увидите примерно такую картину:

Пример работы гирлянды
Если же немного изменить код, то можно заставить светодиоды загораться один за другим:

#include 
 
#define PIN 6 // Номер пина, к которому подключен сигнальный провод ленты
#define LED_NUM 50 // Количество светодиодов в ленте
 
Adafruit_NeoPixel ledtape = Adafruit_NeoPixel(LED_NUM, PIN, NEO_GRB + NEO_KHZ800);  // Если у ленты контроллер WS2812, то третий параметр должен быть NEO_KHZ800, а если WS2811 — NEO_KHZ400
 
void setup() {
  ledtape.begin();
  ledtape.show(); // Выключит все светодиоды
}
 
void loop() {
  uint16_t i, j;
 
// Тут изменяется цвет светодиодов
 for(i=0; i < ledtape.numPixels(); i++) {
   ledtape.setPixelColor(i, Wheel((((i) * 256 / ledtape.numPixels()) + j) & 255));
   ledtape.show();
   ledtape.setPixelColor(i, ledtape.Color(0,0,0));
   delay(20);
   ledtape.show();
 }
}
 
// Функция прохода по цветам
uint32_t rotateColor(byte WheelPos) {
  if(WheelPos < 85) {
   return ledtape.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return ledtape.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return ledtape.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

Такая гирлянда подойдёт как для наружного применения, так и для традиционного размещения на ёлке.

Не смешно? А здесь смешно: @ithumor