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

Видео
Схема

Исходный код
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 маленькими шагами от одного цвета к другому, и получишь плавные радужные переходы.
