MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/Управление светодиодами APA102

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление светодиодами APA102[1]

Светодиоды APA102 (также известные как светодиоды DotStar) – это полноцветные RGB-светодиоды, доступ к каждому из которых можно получить индивидуально. Обычно изготавливаются в виде полосы. Они отличаются от светодиодов NeoPixel тем, что им для управления требуется два контакта – для тактовой частоты и передачи данных. Кроме того, они поддерживают гораздо более высокую скорость передачи данных и частоту ШИМ, благодаря чему лучше подходят для создания визуальных эффектов, построенных на инерции зрения.

Чтобы создать объект APA102, выполните следующее:

>>> import machine, apa102
>>> strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)

Это создаст объект для 60-пиксельной APA102-полосы, у которой контакт для тактового сигнала подключен к GPIO5, а контакт для передачи данных – к GPIO4. Вы можете подредактировать значения «5» и «4», чтобы они соответствовали вашей ситуации.

Данные об RGB-цвете и яркости отправляются APA102 в определенном порядке. Обычно это (Красный, Зеленый, Синий, Яркость). Если вы используете более новую версию APA102C, то на ней зеленый и синий цвета поменялись местами, поэтому порядок будет (Красный, Синий, Зеленый, Яркость). У версии APA102 более квадратные линзы, а у APA102C – более круглые. Если у вас версия APA102C, но вы предпочитаете задавать цветовые данные в формате RGB, а не RBG, то вы можете поменять этот порядок при помощи:

>>> strip.ORDER = (0, 2, 1, 3)

Чтобы задать цвета пикселей, используйте:

>>> strip[0] = (255, 255, 255, 31) # белый, полная яркость
>>> strip[1] = (255, 0, 0, 31) # красный, полная яркость
>>> strip[2] = (0, 255, 0, 15) # зеленый, половина яркости
>>> strip[3] = (0, 0, 255, 7)  # синий, четверть яркости

Используйте метод write(), чтобы передать эти цветовые данные светодиодам:

>>> strip.write()

Демонстрация:

import time
import machine, apa102

# 1-метровая полоса с 60 светодиодами:
strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)

brightness = 1  # 0 is off, 1 is dim, 31 is max

# вспомогательная функция, которая конвертирует
# постоянно меняющуюся переменную «offset» (0-255)
# в значение, которым можно задать цвет светодиода:
def wheel(offset, brightness):
    # переход от красного к зеленому, потом к синему
    # и обратно к красному:
    offset = 255 - offset
    if offset < 85:
        return (255 - offset * 3, 0, offset * 3, brightness)
    if offset < 170:
        offset -= 85
        return (0, offset * 3, 255 - offset * 3, brightness)
    offset -= 170
    return (offset * 3, 255 - offset * 3, 0, brightness)

# демо 1, RGB RGB RGB:
red = 0xff0000
green = red >> 8
blue = red >> 16
for i in range(strip.n):
    colour = red >> (i % 3) * 8
    strip[i] = ((colour & red) >> 16, (colour & green) >> 8, (colour & blue), brightness)
strip.write()

# демо 2, показать все цвета радуги: 
for i in range(strip.n):
    strip[i] = wheel((i * 256 // strip.n) % 255, brightness)
strip.write()

# демо 3, все пиксели поочередно загораются цветами радуги,
# попутно пиксели словно «движутся» по полосе:
for r in range(5):
    for n in range(256):
        for i in range(strip.n):
            strip[i] = wheel(((i * 256 // strip.n) + n) & 255, brightness)
        strip.write()
    time.sleep_ms(25)

# демо 4, цвет один, яркости разные:
for b in range(31,-1,-1):
    strip[0] = (255, 153, 0, b)
    strip.write()
    time.sleep_ms(250)

# финал, выключить все светодиоды:
strip.fill((0, 0, 0, 0))
strip.write()

См.также

Внешние ссылки