MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/Управление светодиодами APA102: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} <syntaxhighlight lang="python" enclose="div"> =С...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
(не показана 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> | |||
=См.также= | =См.также= |
Версия от 13:47, 1 июля 2020
Управление светодиодами 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()