※これはCAMPHOR- Advent Calendar 2023の3日目の記事です
CAMPHOR- Advent Calendar 2023についてはこちら:https://advent.camph.net
記事の内容
鴨川ハッカソンで制作した二脚ロボットの設計やその動かし方について書いています.
環境・システム
- Windows 11
- VSCode 1.84.2
- CubeMX 6.9.2
- PlatformIO IDE v3.3.1
- STM32F446RE
- サーボモータ8つ(FT5330M×2,FT1117M×4,FS90MG×2)
- 3Dプリンタ Ender3 V2
ロボットの概観
配線丸出しやないかいとか,脚が左右非対称やろがいとかいろいろと突っ込みどころはありますが,ハッカソンの中であわてて作ったので妥協点満載です.それでも期限内にちゃんと動くものができたという点に価値があると思います.
ロボットの筐体
ロボットの筐体については,自宅の3Dプリンタで印刷したものを使っています.パーツについてはノギスでの採寸等をした後に3DCADで1から設計しています.
部品を印刷するときのポイントとして,単純な板パーツだと少し強度が心もとないので,板の面がジグザグするようにしています.これは,「かける工房」さんのこちらの動画を参考にさせていただきました.
ロボットの動作
ロボットの動作を設計するにあたり,VSCodeとCubeMXで構成した環境でコーディングしました.CubeMXでSTM32F446RE用のプロジェクトファイルを生成し,生成されたファイルのmain.cを編集するという形で開発をしていました.STM32用の開発環境としてSTM32CubeIDEというものがありますが,こちらは予測変換が出てきません.VSCodeでは予測変換が出てくるので,そういう意味でVSCodeに一日の長があります.プロジェクトの生成に関してはすでにわかりやすい記事がありますのでそちらをご参照ください.
さて,今回は屈伸動作とお辞儀をやらせてみました.とはいっても,今回は逆運動学を使うわけではなくPWMの指令値を通じて関節の角度を転倒しないように設定するだけのことですから,コード自体は複雑ではありません.PWMの指令値を決めるためには以下のようなコマンドを使えます.
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 75)
(参考:HALコマンドリファレンス)
ここで出てくるHALというのは,ハードウェア抽象化を意味します.すなわち,具体的に扱っているマイコンの種類を考慮することなくコマンドを書くことができます.
アドレス演算子&
が付いている&htim3
というのは,STM32のタイマー3を利用しているという意味になります.TIM_CHANNEL_1
は,PWM信号をチャンネル1から出力するということです.
タイマーとチャンネルの関係は,mbedのリファレンスから確認します.このリファレンスの紫色のところに,「PWMx/y」と書いてあれば,そのピンはタイマーxのチャンネルyによる出力先だということになるわけです.そこと繋がっているPB_xやPA_yといったピンが,CubeMXで表示されるピンの名前になります.
さて,サーボとSTM32を直付けしているので,ピンアサインさえ間違えなければ__HAL_TIM_SET_COMPARE
でサーボを動かすことができます.サーボのデータシートを読めばPWMの周期やパルス幅の範囲を知ることができますので,それをもとにCubeMX上からPWMの設定をしていきます.
Prescalerは分周器のことで,この値を$P$としたとき周波数が$1/P$倍されます.そして,Counter Periodは文字通り1カウントがどのくらいの周期かということです.
本来なら,割り込み周期(何秒に1回,原稿のタスクとは別タスクをやらせるか)をちゃんと考えるべきです.ただ,今回は丁寧に制御するわけでもなく,また時間の都合もあって前に使っていた設定(Prescaler=840,Counter Period=999)をそのまま読み込みました.
組付け時の微妙なずれを修正しつつ,実際に屈伸とお辞儀をしている様子がこちらです.
本当は鴨川沿いで撮った動画もあるのですが,思いっきり他の参加者さんの顔が映っているので室内で取り直したものを使っています.
反省点
ハッカソンで取り急ぎ作ったとはいえ,改善すべき点や反省点は多くあります.
- 配線がむき出しであり何かに引っ掛けてピンが抜けうる
- バッテリをロボット本体に乗せられない
- PCA9685のような多数のサーボを制御する基盤を使用していないため配線が煩雑である
- 本来使用予定だったサーボの故障により,トルクの不足しているサーボがある(SG90MD)
- 手前の6軸センサを使えていない