Приобретая один-два метра светодиодной ленты, вы, вероятно, захотите попробовать ее на практике. Подключить ее к Arduino довольно просто (см. рисунок), но для подключения ленты к Raspberry Pi потребуется немного усилий.
- Светодиодная лента, подключенная к Arduino
Комплектующие
Для проведения этого эксперимента с Arduino потребуются следующие компоненты:
Адресуемая светодиодная лента WS2812
Три перемычки "папа-папа"
Поскольку логический вход светодиодов NeoPixels не совместим с логическими сигналами уровня 3 В, для эксперимента с Raspberry Pi потребуются дополнительные компоненты. Однако перед тем как предпринимать дополнительные усилия, стоит попробовать обойтись без преобразователя логического уровня, так как ваша светодиодная лента может работать нормально с логическими сигналами 3 В.
Тем не менее, для эксперимента с Raspberry Pi могут потребоваться следующие дополнительные компоненты:
400-точечная беспаечная макетная плата
R1, R2 Два резистора 470 Ом 0,25 Вт
Q1 МОП-транзистор 27000
01 Перемычки "мама-папа"
Обратите внимание, что для данного эксперимента использован маломощный МОП-транзистор 27000, так как он лучше справляется с высокочастотными последовательными данными по сравнению с 2N3904. Вы также можете использовать транзистор типа FQP30N06L, но его мощность будет избыточной для данного эксперимента.
Подключение Arduino
С одной стороны светодиодной ленты обычно имеется кабель с трехконтактным разъемом, подсоединенным к контактам GND, 5V и D0. Если такой разъем сохраняется, то для подключения его к макетной плате или Arduino можно использовать перемычки "мама-папа". Если разъема нет, вы можете аккуратно припаять провода к контактам GND, 5V и D0 на левом краю ленты.
Я использовал три перемычки "папа-папа", отрезав контакты с одной стороны и припаяв их к пяти светодиодам NeoPixel на ленте. Затем эти три контакта можно подключить непосредственно к Arduino, как показано на рисунке, причем контакт D0 светодиодной ленты должен быть подключен к контакту 19 на Arduino.
- Удобный NeoPixel-дисплей
Потребление энергии адресуемых светодиодов
При увеличении яркости светодиодов NeoPixels до максимальной мощности они потребляют значительный ток (приблизительно 60 мА на каждый светодиод). Если у вас подключено пять светодиодов NeoPixels, это может привести к потреблению 300 мА, что может быть слишком большой нагрузкой для Arduino или Raspberry Pi. В таком случае вам, возможно, потребуется подключить внешний источник питания с напряжением 5 В к светодиодной ленте.
Программа для Arduino
Уважаемые сотрудники Adafruit разработали библиотеку для Arduino, которая значительно упрощает управление длинными цепочками адресуемых светодиодов. Вы можете загрузить эту библиотеку по следующей ссылке: [
https://github.com/adafruit/Adafruit_NeoPixel](
https://github.com/adafruit/Adafruit_NeoPixel) и установить ее в вашу среду Arduino.
Для проведения эксперимента с Arduino вам потребуется использовать скетч.
Код: Выделить всё
#include <Adafruit_NeoPixel.h> // 1
const int pixelPin = 9; // 2
const int numPixels = 5; // 3
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(numPixels, pixelPin, NEO_GRB + NEO_KHZ800); // 4
void setup() {
pixels.begin(); // 5
}
void loop() {
for (int i = 0; i < numPixels; i++) { // 6
int red = random(255);
int green = random(255);
int blue = random(255);
pixels.setPixelColor(i, pixels.Color(red, green, blue)); // 7
pixels.show(); // 8
}
delay(100L);
}
Давайте рассмотрим этот скетч подробнее, разбив его на пункты, которые описаны в комментариях:
1. Импортируйте библиотеку
Adafruit NeoPixel.
2. Если вам нужно использовать другой контакт для управления светодиодами NeoPixel, отредактируйте эту часть кода.
3. Если у вас больше или меньше светодиодов в вашей цепочке
NeoPixel, внесите изменения здесь. Обратите внимание, что вы должны учитывать энергопотребление, как описано ранее.
4. Инициализируйте библиотеку
NeoPixel в соответствии с вашими настройками.
5. Начните отправку данных на дисплей.
6. Установите произвольный цвет для каждого пикселя, обновите дисплей и добавьте задержку в 1/10 секунды перед сменой цвета всех светодиодов. Теперь время для танцев в стиле диско!
7. Функция `
setPixelColor` принимает два параметра: индекс пикселя, который нужно установить, и цвет, который представлен тремя значениями в диапазоне от 0 до 255 для каждого из трех цветовых каналов.
Эксперимент с Raspberry Pi:
Для подключения вашего Raspberry Pi к светодиодной ленте NeoPixel сначала попробуйте выполнить подключение без преобразователя уровня. Вот как это можно сделать:
1. С помощью перемычек "мама-мама" создайте следующие соединения:
- GND (светодиодной ленты NeoPixel) -> GND (Raspberry Pi)
- 5V (светодиодной ленты NeoPixel) -> 5V (Raspberry Pi)
- D0 (светодиодной ленты NeoPixel) -> GPIO 18 (Raspberry Pi)
На рисунке ниже показано подключение светодиодной ленты непосредственно к Raspberry Pi.
- Лента светодиодов NeoPixel, подключенная непосредственно к Raspberry Pi.
Перейдите к следующему разделу "Программа для Raspberry Pi" и попробуйте выполнить программу. Если светодиодная лента не светится и не отображает красочный многоцветный дисплей, вам, возможно, потребуется добавить преобразователь уровня, чтобы увеличить уровень сигнала с 3 В до 5 В.
Поднятие уровня сигнала с 3 В до 5 В:
Уровень сигнала 3 В на Raspberry Pi ниже ожидаемого уровня (high) для адресуемых светодиодов WS2812, который составляет 4 В. Схема, показанная на рисунке ниже, демонстрирует, как можно использовать МОП-транзистор для поднятия уровня сигнала до 5 В.
Побочным эффектом от такого смещения уровня является инвертирование выходного сигнала. То есть, когда на GPIO-контакте Raspberry Pi выставлен логически низкий уровень (low, 0 В), то на выходе для светодиодной ленты появится сигнал напряжением 5 В, а когда на GPIO-контакте Raspberry Pi выставлен высокий уровень (high, 3,3 В), то на выходе для светодиодной ленты появится сигнал напряжением 0 В.
К счастью, эта особенность может быть легко скорректирована в управляющей программе.
На рисунке показано преобразование уровня с 3 до 5 В.
- Преобразование уровня с 3 до 5 В
На рисунке ниже показано подключение светодиодной ленты к Raspberry Pi с использованием преобразователя уровня.
- Подключение светодиодной ленты к Raspberry Pi с использованием преобразователя
Программа для Raspberry Pi
Программа для Raspberry Pi основана на предоставленном компанией Adafruit руководстве (см.
https://learn.adafruit.com/neopixels-on-raspberry-pi). Однако библиотека языка С, на которую опирается руководство Adafruit, на момент подготовки книги была несовместима с Raspberry Pi 2.
К счастью для владельцев Raspberry Pi 2, Ричард Херст (Richard Hurst) создал версию программы, работающую с Raspberry Pi 2. Эта версия также совместима и с более ранними версиями Raspberry Pi. Для установки указанной библиотеки и необходимых программных пакетов воспользуйтесь командой:
$ sudo apt-get install build-essential python-dev git scons swig
Следующий этап нашей работы расходится с направлением, заданным в руководстве Adafruit, потому что вам нужно получить версию программы, исправленную для работы с Raspberry Pi 2. Извлеките измененный код NeoPixel из GitHub, используя следующую команду:
$ git clone https://github.com/richardghirst/rpi_ws281x.git
Измените в извлеченной из GitHub программе каталог, а затем произведите сборку кода на языке С, воспользовавшись следующей командой:
$ scons
По завершении компиляции кода на языке С вам нужно установить библиотеку Python, взаимодействующую с быстрым кодом на языке С, воспользовавшись следующей командой:
$ cd python
$ sudo python setup.py install
Загружаем и выполняем программу
Далее представлена версия программы, предназначенная для использования с инвертирующим преобразователем уровня. Давайте разберем некоторые ключевые моменты программы, обозначенные комментариями:
Код: Выделить всё
#!/usr/bin/env python
import time, random
from neopixel import * //1
# LED strip
LED_COUNT = 30 # Number of LED pixels. //2
LED_PIN = 18 # GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5 # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
# Initialize the display
strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
strip.begin()
while True: //3
for i in range(strip.numPixels()):
red = random.randint(0, 255)
green = random.randint(0, 255)
blue = random.randint(0, 255)
strip.setPixelColor(i, Color(red, green, blue))
strip.show()
time.sleep(0.1)
1. Импорт библиотеки
NeoPixel.
2. Эти параметры установки не требуют изменений, если только вам необходимо использовать другой контакт для
LED_PIN.
3. Основной цикл программы выполняет практически те же действия, что и его аналог для Arduino. Он генерирует произвольный цвет и применяет его к пикселю.