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

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

(Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} <syntaxhighlight lang="python" enclose="div"> =С...»)
 
 
(не показана 1 промежуточная версия этого же участника)
Строка 2: Строка 2:
 
{{Перевод от Сubewriter}}
 
{{Перевод от Сubewriter}}
 
{{Myagkij-редактор}}
 
{{Myagkij-редактор}}
 +
 +
=Управление светодиодами APA102<ref>[http://docs.micropython.org/en/latest/esp8266/tutorial/apa102.html docs.micropython.org - Controlling APA102 LEDs]</ref>=
 +
 +
Светодиоды [[APA102]] (также известные как светодиоды [[DotStar]]) – это полноцветные [[RGB-светодиод]]ы, доступ к каждому из которых можно получить индивидуально. Обычно изготавливаются в виде полосы. Они отличаются от светодиодов [[NeoPixel]] тем, что им для управления требуется два контакта – для тактовой частоты и передачи данных. Кроме того, они поддерживают гораздо более высокую скорость передачи данных и частоту [[ШИМ]], благодаря чему лучше подходят для создания визуальных эффектов, построенных на инерции зрения.
 +
 +
Чтобы создать объект [[APA102]], выполните следующее:
  
 
<syntaxhighlight lang="python" enclose="div">
 
<syntaxhighlight lang="python" enclose="div">
 +
>>> import machine, apa102
 +
>>> strip = apa102.APA102(machine.Pin(5), machine.Pin(4), 60)
 +
</syntaxhighlight>
 +
 +
Это создаст объект для 60-пиксельной APA102-полосы, у которой контакт для тактового сигнала подключен к GPIO5, а контакт для передачи данных – к ''GPIO4''. Вы можете подредактировать значения ''«5»'' и ''«4»'', чтобы они соответствовали вашей ситуации.
 +
 +
Данные об [[RGB-цвет]]е и яркости отправляются [[APA102]] в определенном порядке. Обычно это (Красный, Зеленый, Синий, Яркость). Если вы используете более новую версию [[APA102C]], то на ней зеленый и синий цвета поменялись местами, поэтому порядок будет (Красный, Синий, Зеленый, Яркость). У версии [[APA102]] более квадратные линзы, а у APA102C – более круглые. Если у вас версия [[APA102C]], но вы предпочитаете задавать цветовые данные в формате [[RGB]], а не [[RBG]], то вы можете поменять этот порядок при помощи:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> strip.ORDER = (0, 2, 1, 3)
 +
</syntaxhighlight>
 +
 +
Чтобы задать цвета пикселей, используйте:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> strip[0] = (255, 255, 255, 31) # белый, полная яркость
 +
>>> strip[1] = (255, 0, 0, 31) # красный, полная яркость
 +
>>> strip[2] = (0, 255, 0, 15) # зеленый, половина яркости
 +
>>> strip[3] = (0, 0, 255, 7)  # синий, четверть яркости
 +
</syntaxhighlight>
 +
 +
Используйте метод write(), чтобы передать эти цветовые данные светодиодам:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> strip.write()
 +
</syntaxhighlight>
 +
 +
Демонстрация:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
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()
 +
</syntaxhighlight>
  
 
=См.также=
 
=См.также=

Текущая версия на 12:47, 1 июля 2020

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Управление светодиодами 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()

См.также

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