Pybricksを使って、キーボードで操作できるレゴロボットを作ってみた

スポンサーリンク


Pybricksは、レゴの各種スマートハブのためのオープンソース開発環境。これを使うと、PythonやScratchのようなビジュアルプログラミング言語を使用して、レゴのモーターを動かしたり、Bluetoothを介して通信したりすることが簡単にできる。ただし、Pybricksは非公式のツールで、使用するためにはスマートハブのファームウェアを書き換える必要がある。書き換えるのは簡単だけど、気分的なハードルは高め。書き換えたファームウェアは、いつでも元の状態に戻すことができるし、その方法もサポートされてる。

そんなPybricksを使って、適当にロボットを作り、PCから動かした記録です。

主な材料、環境

LEGO SPIKEかLEGO マインドストーム(51515)のスマートハブ
レゴ Mモーター4つ
レゴ Lモーター1つ
適当なレゴパーツ
Windows 11
Pybricks v3.3.0 (Pybricks Beta v2.3.0-beta.6)

レゴ組み立て方メモ

胴体の組み立て



次に腕


次に頭



全部組み合わせて完成。



プログラム

from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Stop
from pybricks.tools import wait
from usys import stdin
from uselect import poll

keyboard = poll()
keyboard.register(stdin)

angles = [0, 0, 0, 0, 0]
previous_angles = angles.copy()

HEAD_INDEX = 0
LEFT_SHOULDER_INDEX = 1
RIGHT_SHOULDER_INDEX = 2
LEFT_ARM_INDEX = 3
RIGHT_ARM_INDEX = 4

motors = [
    Motor(Port.B), Motor(Port.C), Motor(Port.D), Motor(Port.E), Motor(Port.F)
]
for i, motor in enumerate(motors):
    motor.run_target(200, angles[i], wait=False, then=Stop.COAST)

while True:
    if keyboard.poll(0):
        key = stdin.read(1)
        print("You pressed:", key)

        if key in ('q'):
            angles[LEFT_ARM_INDEX] += 10
        elif key in ('a'):
            angles[LEFT_ARM_INDEX] -= 10
        elif key in ('w'):
            angles[LEFT_SHOULDER_INDEX] -= 10
        elif key in ('s'):
            angles[LEFT_SHOULDER_INDEX] += 10
        elif key in ('e'):
            angles[RIGHT_SHOULDER_INDEX] += 10
        elif key in ('d'):
            angles[RIGHT_SHOULDER_INDEX] -= 10
        elif key in ('r'):
            angles[RIGHT_ARM_INDEX] -= 10
        elif key in ('f'):
            angles[RIGHT_ARM_INDEX] += 10
        elif key in ('z'):
            angles[HEAD_INDEX] += 10 
        elif key in ('x'):
            angles[HEAD_INDEX] -= 10

        for i, motor in enumerate(motors):
            if angles[i] != previous_angles[i]:
                motor.run_target(200, angles[i], wait=False, then=Stop.COAST)

        previous_angles = angles.copy()

        current_angles = [motor.angle() for motor in motors]
        print("Current angles:", current_angles)
    
        # この2行を有効にすると動きはカクカクするが、キーへの反応は良くなる
        # while keyboard.poll(0):
        #    stdin.read(1)

使わなかった腰部分のメモ