CircuitPythonを使ってMaker Pi RP2040でWS2812bを制御する
必要なもの
Maker Pi RP2040 | 1 |
WS2812b | 1 |
ジャンパーワイヤー | 3 |
クリスマスリース | 1 |
接続の仕方
Maker Pi RP2040のコネクタを使ってグローブポートの2番を使います。GNDからWS2812bのグランド。3V3からWS2812bの+へ。GP2からWS2812bのDINへつなぎます。
コード
import board
import time
import digitalio
import simpleio
import neopixel
from adafruit_led_animation.sequence import AnimationSequence
import adafruit_led_animation.animation.comet as comet_animation
import adafruit_led_animation.animation.sparkle as sparkle_animation
import adafruit_led_animation.animation.pulse as pulse_animation
import adafruit_led_animation.animation.rainbowchase as rainbow_animation
import adafruit_led_animation.color as color
# 音階と周波数の対応表
tonemap = {
'C4': 262,
'D4': 294,
'E4': 330,
'F4': 349,
'G4': 392,
'A4': 440,
'B4': 494,
'C5': 523,
'D5': 587,
'E5': 659,
'F5': 783,
'G5': 784,
'A5': 880,
'B5': 988,
'0': 0, #休符
}
# ブザーのピンを定義
buzzer_pin = board.GP22
# 音を鳴らす関数
def play_tone(pitch, duration):
# 周波数を取得
frequency = tonemap[pitch]
# Piezo Buzzerを制御するためのPWMOutオブジェクトを作成
simpleio.tone(buzzer_pin, frequency, duration)
# メロディを演奏する関数
def play_melody(melody):
for note in melody:
pitch, duration = note
play_tone(pitch, duration)
time.sleep(0.01)
# メロディのデータを定義。音とその長さ
melody_data = [
('G4', 0.30),
('C5', 0.45),
('C5', 0.15),
('D5', 0.15),
('C5', 0.15),
('B4', 0.15),
('A4', 0.30),
('A4', 0.30),
('A4', 0.30),
('D5', 0.45),
('D5', 0.15),
('E5', 0.15),
('D5', 0.15),
('C5', 0.15),
('B4', 0.30),
('G4', 0.30),
('G4', 0.30),
('E5', 0.45),
('E5', 0.15),
('F5', 0.15),
('E5', 0.15),
('D5', 0.15),
('C5', 0.30),
('A4', 0.30),
('G4', 0.15),
('G4', 0.15),
('A4', 0.30),
('D5', 0.30),
('B4', 0.30),
('C5', 0.60)
]
# NeoPixel テープに接続されたピンの設定
pixel_pin = board.GP2
# NeoPixel テープに接続されたLEDの数
pixel_num = 30
pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.1, auto_write=False)
#アニメーションの設定(スピードや色を指定しています)
#使える色はAMBER,AQUA,BLUE,CYAN,GOLD,GREEN,JADE,MAGENTA,OLD_LACE,ORANGE,PINK,PURPLE,RED
pulse = pulse_animation.Pulse(pixels, 0.2, color.JADE)
sparkle = sparkle_animation.Sparkle(pixels, 0.05, color.GREEN)
rainbow = rainbow_animation.RainbowChase(pixels, 0.1)
animations = AnimationSequence(pulse, sparkle,rainbow)
# ボタンをイニシャライズする
btn1 = digitalio.DigitalInOut(board.GP20)
btn1.direction = digitalio.Direction.INPUT
btn1.pull = digitalio.Pull.UP
while True:
animations.animate()
if not btn1.value: # button 1 が押されたら
play_melody(melody_data)
animations.next()#次のアニメーションに移動