<前の記事 : 次の記事>
Out-of-the-box Demo Code
Cypress Maker Pi RP2040にはデフォルトでデモが入っていて、一通りの機能が網羅されている。ここではちょっと中身を覗いてみる。
import board
import digitalio
import neopixel
import simpleio
import time
import pwmio
from adafruit_motor import servo, motor
MicroPythonで最初にインポートするのはmachineだが、CircuitPythonではboardであり、これにはボード特有の機能が網羅されている。boardに何が定義されてるのか見てみると以下のようになる。
Adafruit CircuitPython 10.2.0 on 2026-04-22; Cytron Maker Pi RP2040 with rp2040
>>> import board
>>> dir(board)
['__class__', '__name__', 'A0', 'A1', 'A2', 'A3', 'BUZZER', 'GP0', 'GP1', 'GP10', 'GP11', 'GP12', 'GP13', 'GP14', 'GP15', 'GP16', 'GP17', 'GP18', 'GP19', 'GP2', 'GP20', 'GP21', 'GP22', 'GP26', 'GP26_A0', 'GP27', 'GP27_A1', 'GP28', 'GP28_A2', 'GP29', 'GP29_A3', 'GP3', 'GP4', 'GP5', 'GP6', 'GP7', 'GP8', 'GP9', 'LED', 'M1A', 'M1B', 'M2A', 'M2B', 'NEOPIXEL', 'RGB', 'VBATT', 'VOLTAGE_MONITOR', '__dict__', 'board_id']
>>>
例えばGP18にはneopixel(rgb-led)が接続されているが、micropythonでアクセスする場合はGP18を指定する。一方のcircuitpythonではNEOPIXELとかRGBとかGP18とかを指定できる。
次のインポートであるdigitalioはcircuitpython特有のライブラリである。一見するとデジタル入出力にかんしては'simpleio'を使った方が楽ちんだと思われるが、どうやらこいつは遅いらしい。simpleioの真価はどうやら別(rangeとかにあるらしい。
中央の青いLED
Lチカによく使われるLEDの設定だが、ボード上にはたくさんのLEDが載っている。これらはLEDSというリストに登録される。しかしdigitalio.DigitalInOutって長過ぎないかっていつもおもうんだよね。。。
# Initialize LEDs
# LEDs placement on Maker Pi RP2040
LED_PINS = [board.GP0,
board.GP1,
board.GP2,
board.GP3,
board.GP4,
board.GP5,
board.GP6,
board.GP7,
board.GP16,
board.GP17,
board.GP26,
board.GP27,
board.GP28]
LEDS = []
for pin in LED_PINS:
# Set pins as digital output
digout = digitalio.DigitalInOut(pin)
digout.direction = digitalio.Direction.OUTPUT
LEDS.append(digout)
NeoPixel
ws2812bなどの制御icと3色LEDを組み合わせたneopixelはたった3線で数珠繋ぎに接続できるフルカラーLEDで、あっという間にゲーミングPCっぽく飾れる優れものだ。ただし、通信速度は結構厳しいのでマイコンの負荷も大きい。デモではGP18に2個のneopixelが接続されていることを設定するだけで使えるようになる。
# Initialize Neopixel RGB LEDs
pixels = neopixel.NeoPixel(board.GP18, 2)
pixels.fill(0)
ぱらっぱっぱらっぱ!
ボードの電源をいれるとブザーで「ぱぱっぱっぱらっぱ」て鳴るのだが、それを設定するのがこの部分。
# Melody
MELODY_NOTE = [659, 659, 0, 659, 0, 523, 659, 0, 784]
MELODY_DURATION = [0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.15, 0.2]
# Define pin connected to piezo buzzer
PIEZO_PIN = board.GP22
board.GP22とboars.BUZZERは同じなので、そっちの方が良さそうだね。
ボタン
ボード上にはけっこういろいろボタンがあるが、GP20とGP21というラベルが付いているボタンの設定がこちら。どのピンか、入力か、プルアップかを設定する。
# Initialize buttons
btn1 = digitalio.DigitalInOut(board.GP20)
btn2 = digitalio.DigitalInOut(board.GP21)
btn1.direction = digitalio.Direction.INPUT
btn2.direction = digitalio.Direction.INPUT
btn1.pull = digitalio.Pull.UP
btn2.pull = digitalio.Pull.UP
サーボとモーター
ボードの上の方にはDCモーターの端子と、サーボが繋げられる。まだつないがことが無いのでどうなるのかわからないが、サーボに関する設定がこちら。(2^15を毎行計算させるというのもなんだかなぁと思ったり)
# Initialize servos
# 50% duty cycle: 2**15 = 32768 = 1/2 of 65536 (16-bit)
servo_motors = [] # create an array and add servo objects.
servo_motors.append(servo.Servo(pwmio.PWMOut(board.GP12, duty_cycle=2**15, frequency=50)))
servo_motors.append(servo.Servo(pwmio.PWMOut(board.GP13, duty_cycle=2**15, frequency=50)))
servo_motors.append(servo.Servo(pwmio.PWMOut(board.GP14, duty_cycle=2**15, frequency=50)))
servo_motors.append(servo.Servo(pwmio.PWMOut(board.GP15, duty_cycle=2**15, frequency=50)))
DCモーターに関する設定はこちら。たぶん、回転を逆転させたりできるはず。
# Initialize DC motors
m1a = pwmio.PWMOut(board.GP8, frequency=10000)
m1b = pwmio.PWMOut(board.GP9, frequency=10000)
motor1 = motor.DCMotor(m1a, m1b)
m2a = pwmio.PWMOut(board.GP10, frequency=10000)
m2b = pwmio.PWMOut(board.GP11, frequency=10000)
motor2 = motor.DCMotor(m2a, m2b)
スタートアップ
ここで「ぱぱっぱっぱらっぱ」と鳴ってLEDがパラパラと点灯する。
# -------------------------------------------------
# ON START: Show running light and play melody
# -------------------------------------------------
for i in range(len(LEDS)):
LEDS[i].value = True
if i < len(MELODY_NOTE):
# Play melody tones
simpleio.tone(PIEZO_PIN, MELODY_NOTE[i], duration=MELODY_DURATION[i])
else:
# Light up the remainding LEDs
time.sleep(0.15)
# Turn off LEDs one-by-one very quickly
for i in range(len(LEDS)):
LEDS[i].value = False
time.sleep(0.02)
メインループ
ここから先はメインループ(無限ループ)になっていて、GP20ボタンが押されたら、
- LEDが順に点灯
- サーボが0位置に移動
- DCモータが50%で回転
- ぶぶりん↑とブザーが鳴る
color = 0
state = 0
# -------------------------------------------------
# FOREVER LOOP: Check buttons & animate RGB LEDs
# -------------------------------------------------
while True:
# Check button 1 (GP20)
if not btn1.value: # button 1 pressed
# Light up all LEDs
for i in range(len(LEDS)):
LEDS[i].value = True
# Move servos to 0 degree
for i in range(len(servo_motors)):
servo_motors[i].angle = 0
# Move motors at 50% speed
motor1.throttle = 0.5 # motor1.throttle = 1 or -1 for full speed
motor2.throttle = -0.5
# Play tones
simpleio.tone(PIEZO_PIN, 262, duration=0.1)
simpleio.tone(PIEZO_PIN, 659, duration=0.15)
simpleio.tone(PIEZO_PIN, 784, duration=0.2)
このすぐ後ろでGP21ボタンが押された場合の動作が書いてある。
- LEDを順に消灯
- サーボを180°の位置へ
- DCモータ停止
- びろりん↓とブザーが鳴る
# Check button 2 (GP21)
elif not btn2.value: # button 2 pressed
# Turn off all LEDs
for i in range(len(LEDS)):
LEDS[i].value = False
# Move servos to 180 degree
for i in range(len(servo_motors)):
servo_motors[i].angle = 180
# Brake motors
motor1.throttle = 0 # motor1.throttle = None to spin freely
motor2.throttle = 0
# Play tones
simpleio.tone(PIEZO_PIN, 784, duration=0.1)
simpleio.tone(PIEZO_PIN, 659, duration=0.15)
simpleio.tone(PIEZO_PIN, 262, duration=0.2)
最後の部分は、RGBフルカラーLEDの色を順次変えていくような処理が書かれている。
# Animate RGB LEDs
if state == 0:
if color < 0x101010:
color += 0x010101 # increase rgb colors to 0x10 each
else:
state += 1
elif state == 1:
if (color & 0x00FF00) > 0:
color -= 0x000100 # decrease green to zero
else:
state += 1
elif state == 2:
if (color & 0xFF0000) > 0:
color -= 0x010000 # decrease red to zero
else:
state += 1
elif state == 3:
if (color & 0x00FF00) < 0x1000:
color += 0x000100 # increase green to 0x10
else:
state += 1
elif state == 4:
if (color & 0x0000FF) > 0:
color -= 1 # decrease blue to zero
else:
state += 1
elif state == 5:
if (color & 0xFF0000) < 0x100000:
color += 0x010000 # increase red to 0x10
else:
state += 1
elif state == 6:
if (color & 0x00FF00) > 0:
color -= 0x000100 # decrease green to zero
else:
state += 1
elif state == 7:
if (color & 0x00FFFF) < 0x001010:
color += 0x000101 # increase gb to 0x10
else:
state = 1
pixels.fill(color) # fill the color on both RGB LEDs
世の中にはAdafruit LED Animationというライブラリがあって、こんな風にも書けるらしい。
import board
import neopixel
from adafruit_led_animation.animation.rainbow import Rainbow
# LEDの初期設定(ピンや個数)
pixels = neopixel.NeoPixel(board.D18, 30, brightness=0.5, auto_write=False)
# レインボーアニメーションの設定(スピード 0.1秒)
rainbow = Rainbow(pixels, speed=0.1, period=2)
while True:
rainbow.animate() # これを呼ぶだけで順次色が変わる
結論
このボードには機能がてんこ盛りになっているので、それが余すところなくデモに盛り込まれている。このボード、なかなか楽しいのではないか。でもGROOVEコネクタでしか外部ペリフェラルに接続できないからな。。。
投稿者の人気記事

-
akira.kei
さんが
前の水曜日の15:27
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の水曜日の22:35
に
編集
をしました。
ログインしてコメントを投稿する