Raspberry Pi Build HATでペンギン型(?)ロボットを作ってみた

スポンサーリンク

Raspberry Pi Build HATでペンギン型(?)ロボットを作ったので、その備忘録です。

作ったロボット↓


旋回後に直進や後進を指定してもなーんか真っ直ぐ進まないけど、ご愛敬。
原因は未調査。まっすぐ進むこともある。そんな問題を抱えつつ、オリジナルロボットラジコン完成 !

主な材料、環境

ハード: Raspberry Pi 3 model B、Raspberry Pi Build HAT、F710ワイヤレス ゲームパッド 、レゴ、 ラズパイを固定するメイカープレート(3Dプリンタ出力)、バッテリー、バッテリーとBuild HATをつなぐケーブル
OS: Raspberry Pi OS (32bit)

レゴ組み立て方メモ

まずはメイカープレートにラズパイを固定

次にメイカープレートの上に二種類の枠を配置。Build HATのジャックの高さが微妙なのでごまかしている

腕と車輪を作成。(二組つくる)

小物を作成

全部くっつけて、裏側を補強

完成

Build HATとモーターの接続

ポート 接続するモーター
A 左腕用 Mアンギュラーモーター
B 右腕用 Mアンギュラーモーター
C 左車輪用 Lアンギュラーモーター
D 右車輪用 Lアンギュラーモーター

ゲームパッドでの動かし方

ボタン 内容
十字キー 上で前進、下で後退、左で左旋回、右で右旋回
X 左腕を上まであげる
B 右腕を上まであげる
LB 左腕を途中まであげる
RB 右腕を途中まであげる

プログラム

robo.pyという名前でラズパイ上に保存して実行。

import os
import pygame
from buildhat import Motor, MotorPair, Hat
from pygame.locals import *


os.environ["SDL_VIDEODRIVER"] = "dummy"
pygame.init()

pygame.joystick.init()
joy = pygame.joystick.Joystick(0)
joy.init()

# 右側モーターを基準にするので、反対側モーターは回転方向を反転
rotation_correction_left = -1
rotation_correction_right = 1

hat = Hat()
print('Hat voltage = %f' % hat.get_vin())

arm_motor_left = Motor('A')
arm_motor_right = Motor('B')
wheel_motor = MotorPair('C', 'D')
arm_motor_left.run_to_position(120 * rotation_correction_left)
arm_motor_right.run_to_position(120 * rotation_correction_right)

while True:
    pygame.time.wait(30)
    for e in pygame.event.get():
        if e.type == pygame.locals.JOYAXISMOTION or e.type == pygame.locals.JOYHATMOTION:
            hat_x = joy.get_hat(0)[0]
            hat_y = joy.get_hat(0)[1]
            axes_data = {
                "HAT_X": hat_x,
                "HAT_Y": hat_y,
            }
            print(axes_data)
            if hat_y == 1:
                wheel_motor.start(100 * rotation_correction_left, 100 * rotation_correction_right)
            elif hat_y == -1:
                wheel_motor.start(-100 * rotation_correction_left, -100 * rotation_correction_right)
            elif hat_x == -1:
                wheel_motor.start(-100 * rotation_correction_left, 100 * rotation_correction_right)
            elif hat_x == 1:
                wheel_motor.start(100 * rotation_correction_left, -100 * rotation_correction_right)
            else:
                wheel_motor.stop()
        if e.type == pygame.locals.JOYBUTTONDOWN:
            print('BUTTON %d DOWN' % e.button)
            if e.button == 2:
                arm_motor_left.run_to_position(0 * rotation_correction_left)
            if e.button == 1:
                arm_motor_right.run_to_position(0 * rotation_correction_right)
            if e.button == 4:
                arm_motor_left.run_to_position(90 * rotation_correction_left)
            if e.button == 5:
                arm_motor_right.run_to_position(90 * rotation_correction_right)

        elif e.type == pygame.locals.JOYBUTTONUP:
            print('BUTTON %d UP ' % e.button)
            if e.button == 2:
                arm_motor_left.run_to_position(120 * rotation_correction_left)
            if e.button == 1:
                arm_motor_right.run_to_position(120 * rotation_correction_right)
            if e.button == 4:
                arm_motor_left.run_to_position(120 * rotation_correction_left)
            if e.button == 5:
                arm_motor_right.run_to_position(120 * rotation_correction_right)

今のBuildHatライブラリだと、モータに対して頻繁に非同期指定でrun_to_positionを呼ぶと例外が発生した。そのため、腕はデフォルトの同期指定で操作。
(GitHubのissueでも取り上げられているので、そのうち解消されるのを期待)

www.sato-susumu.com

www.sato-susumu.com

リンク

モータの遅延の問題
https://forums.raspberrypi.com/viewtopic.php?p=2012025
https://github.com/RaspberryPiFoundation/python-build-hat/issues/152