akira.keiのアイコン画像
akira.kei 2026年05月20日作成 (2026年05月20日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 21
akira.kei 2026年05月20日作成 (2026年05月20日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 21

Maker Pi RP2040をCircuitPythonで試す(その2):デモでも

<前の記事 : 次の記事>

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.GP22boars.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のアイコン画像
機械系エンジニアだが電子工作を趣味としている。週末はひとりバーベキュー。
ログインしてコメントを投稿する