編集履歴一覧に戻る
akira.keiのアイコン画像

akira.kei が 2026年05月20日15時27分09秒 に編集

初版

タイトルの変更

+

Maker Pi RP2040をCircuitPythonで試す(その2)

タグの変更

+

CircuitPyton

+

rp2040

記事種類の変更

+

セットアップや使用方法

本文の変更

+

[<前の記事](https://elchika.com/article/c9299969-719b-4c35-947c-ee6a16fc7080/) : 次の記事> ## Out-of-the-box Demo Code Cypress Maker Pi RP2040には[デフォルトでデモ](https://github.com/CytronTechnologies/MAKER-PI-RP2040/blob/main/Examples/CircuitPython/Out-of-the-box%20Demo%20Code/code.py)が入っていて、一通りの機能が網羅されている。ここではちょっと中身を覗いてみる。 ```Python: import board import digitalio import neopixel import simpleio import time import pwmio from adafruit_motor import servo, motor ``` MicroPythonで最初にインポートするのは`machine`だが、CircuitPythonでは`board`であり、これにはボード特有の機能が網羅されている。`board`に何が定義されてるのか見てみると以下のようになる。 ```Python: 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`って長過ぎないかっていつもおもうんだよね。。。 ```Python: # 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が接続されていることを設定するだけで使えるようになる。 ```Python: # Initialize Neopixel RGB LEDs pixels = neopixel.NeoPixel(board.GP18, 2) pixels.fill(0) ``` ## ぱらっぱっぱらっぱ! ボードの電源をいれるとブザーで「ぱぱっぱっぱらっぱ」て鳴るのだが、それを設定するのがこの部分。 ```Python: # 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というラベルが付いているボタンの設定がこちら。どのピンか、入力か、プルアップかを設定する。 ```Python: # 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を毎行計算させるというのもなんだかなぁと思ったり) ```Python: # 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モーターに関する設定はこちら。たぶん、回転を逆転させたりできるはず。 ```Python: # 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がパラパラと点灯する。 ```Python: # ------------------------------------------------- # 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%で回転 - ぶぶりん↑とブザーが鳴る ```Python: 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モータ停止 - びろりん↓とブザーが鳴る ```Python: # 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の色を順次変えていくような処理が書かれている。 ```Python: # 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`というライブラリがあって、こんな風にも書けるらしい。 ```Python: 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コネクタでしか外部ペリフェラルに接続できないからな。。。