PICOでフルカラーLEDを制御します。

フルカラーLED(マイコン内蔵RGBLED 8mm PL9823-F8)をPICOで光らせます。

フルカラーLED(マイコン内蔵RGBLED 8mm PL9823-F8)をPICOでいろいろな色で光らせます。

フルカラーLED(マイコン内蔵RGBLED 8mm PL9823-F8)

 

配線図

マイコン内蔵RGBLED 8mm PL9823-F8

1 GND  38:GND
3 VDD  40:VBUS 
4 DIN    1:GPIO 0抵抗 100Ω 47Ω
コンデンサー 0.1μF

5Vの電源を使うので慎重に配線します。
間違えるとLEDが割れることがあります。

MicroPythonプログラム

import array, time
from machine import Pin
import rp2

# NeoPixel WS2812Bの指定
NUM_LEDS = 1  # NeoPixelの数
LED_PIN = 0   # NeoPixel信号接続端子

# 以下はNeoPixelを使用するための設定 ---------------------------
# NeoPixcel WS2812の制御タイミングに合わせたパルスを生成するための設定をアセンブラで指定
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812():    
  T1 = 2
  T2 = 5
  T3 = 3
  wrap_target()
  label("bitloop")
  out(x, 1) .side(0) [T3 - 1]
  jmp(not_x, "do_zero") .side(1) [T1 - 1]
  jmp("bitloop") .side(1) [T2 - 1]
  label("do_zero")
  nop() .side(0) [T2 - 1]
  wrap()
# クラスStateMachineを使用して、正確なパルスを出力するための設定を行う
sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(LED_PIN))
# 設定したクラスStateMachineを有効にして使えるようにする。
sm.active(1)
# LEDのRGBの値を指定する24bit(8bit x 3)の配列をNeoPixelの数で準備
ar = array.array("I", [0 for _ in range(NUM_LEDS)])

# NeoPixel点灯処理関数、このまま書いておく ------------------------------------
def drawpix(num, r, g, b):
  ar[num] = g << 16 | r << 8 | b  # NeoPixel制御パルス用の24bitデータを左ビットシフトとORで生成

# 点灯させる処理を記入例--------------------------------------------------
# 1個を白色点灯(複数ある場合は最初の1番目のみ点灯)
# 点灯させたいNeoPixelの番号(num)とRGB(赤緑青)の明るさを0〜255(30程でも十分明るい)で指定
#drawpix(0, 100, 100, 100) # LED点灯処理関数呼び出し(num, R, G, B)
#sm.put(ar, 8)   # 点灯実行(NeoPixel制御パルス出力)
#time.sleep_ms(100)
#色の変数を設定
red = 100
green = 100
blue = 100

# ループで色を連続的に変化させる
while True:
    # 赤から青への変化
    for blue in range(100, 256):
        drawpix(0, red, 0, blue)  # LEDの色を設定
        sm.put(ar, 8)  # LEDを点灯
        time.sleep_ms(100)  # 100ミリ秒待機

    # 青から緑への変化
    for green in range(100, 256):
        drawpix(0, 0, green, blue)  # LEDの色を設定
        sm.put(ar, 8)  # LEDを点灯
        time.sleep_ms(100)  # 100ミリ秒待機

    # 緑から赤への変化
    for red in range(100, 256):
        drawpix(0, red, green, 0)  # LEDの色を設定
        sm.put(ar, 8)  # LEDを点灯
        time.sleep_ms(100)  # 100ミリ秒待機

実行

ゆっくりと色が変化していきます。

自由研究

テンテン
テンテン

色の変化の速さを変えてみたり好きな色の番号を探してみてください。
ちなみに消灯するにはどうしたらいいでしょうか。