#161Новичок

Смена цветов RGB-светодиода на Pico (3 канала PWM)

Один светодиод — миллионы цветов! RGB-светодиод содержит 3 светодиода: красный, зелёный и синий. Если управлять каждым своим каналом PWM Pico, цвета смешиваются: красный + зелёный = жёлтый, зелёный + синий = голубой, все три = белый. Светодиод перебирает 8 цветов. Изучи несколько каналов PWM, объявление функций (def set_color(...)), смешивание RGB, перевод 8 бит → 16 бит (x257) и общий катод и общий анод.

0.0(0)
6 собрано
Смена цветов RGB-светодиода на Pico (3 канала PWM)
Из одного светодиода выходят восемь цветов: красный, оранжевый, жёлтый, зелёный, голубой, синий, фиолетовый и белый, каждый светится полсекунды перед следующим. В RGB-светодиоде на самом деле спрятаны три крошечных огонька — красный, зелёный и синий, а Raspberry Pi Pico отдельно задаёт яркость каждого и смешивает новые цвета. Ты видишь, как экраны получают свои цвета.

Видео

Схема

Смена цветов RGB-светодиода на Pico (3 канала PWM) - Circuit

Исходный код

MicroPython
1# ─────────────────────────────────────────
2#   BlueGrays · bluegrays.com
3#   Смена цветов RGB-светодиода на Pico (3 канала PWM)
4# ─────────────────────────────────────────
5# Смешивание цветов на RGB-светодиоде тремя каналами PWM: светодиод
6# перебирает 8 цветов, по одному каждые 0,5 с. set_color() переводит
7# значения 0-255 в 16-битный PWM. Для светодиода с общим анодом задай
8# COMMON_ANODE = True.
9#
10# Пины:
11#   GP13 -> RGB-светодиод R (с резистором 220 ohm)
12#   GP12 -> RGB-светодиод G (с резистором 220 ohm)
13#   GP11 -> RGB-светодиод B (с резистором 220 ohm)
14#   Общий катод -> GND
15
16from machine import Pin, PWM
17from time import sleep_ms
18
19COMMON_ANODE = False   # True для светодиода с общим анодом
20
21# ============ КАНАЛЫ PWM ============
22r = PWM(Pin(13)); r.freq(1000)   # Красный
23g = PWM(Pin(12)); g.freq(1000)   # Зелёный
24b = PWM(Pin(11)); b.freq(1000)   # Синий
25
26# Задаёт цвет: каждый канал 0-255
27def set_color(red, green, blue):
28    # Перевести 0-255 в 16 бит (x257)
29    for channel, value in ((r, red), (g, green), (b, blue)):
30        if COMMON_ANODE:            # Инверсия для общего анода
31            value = 255 - value
32        channel.duty_u16(value * 257)
33
34# ============ СПИСОК ЦВЕТОВ ============
35COLORS = [
36    (255, 0, 0),       # Красный
37    (255, 165, 0),     # Оранжевый
38    (255, 255, 0),     # Жёлтый
39    (0, 255, 0),       # Зелёный
40    (0, 255, 255),     # Голубой
41    (0, 0, 255),       # Синий
42    (128, 0, 128),     # Фиолетовый
43    (255, 255, 255),   # Белый
44]
45
46# ============ ГЛАВНЫЙ ЦИКЛ ============
47while True:
48    # Каждый цвет держится 0,5 с
49    for k, y, m in COLORS:
50        set_color(k, y, m)
51        sleep_ms(500)
52

Частые вопросы

Почему 8-битное значение цвета умножается на 257?

Цвета обычно записывают в диапазоне 0–255, а PWM у Pico работает в диапазоне 0–65535. Поскольку 255 × 257 = 65535, умножение на 257 точно переводит 8-битное значение в 16-битный диапазон.

У меня RGB-светодиод с общим анодом. Что изменить?

Общая ножка идёт к 3,3 V, а яркость работает наоборот: записывай заполнение как 65535 - value. Иначе цвета будут перевёрнуты.

Почему цвета не выглядят идеально белыми?

Красный, зелёный и синий светодиоды светят с разной яркостью. Баланс белого можно подстроить, применив к каждому каналу свой коэффициент (например, красный на 80%).

Можно ли плавно переходить между цветами?

Да, меняй значения R, G и B маленькими шагами от одного цвета к другому, и получишь плавные радужные переходы.