M5StackからDYNAMIXELの内部パラメータを設定するツールを作った話

**本稿は[ACCESS Advent Calendar 2024](https://qiita.com/advent-calendar/2024/access) 16日目の記事としてお送りします！**

## 緒言

こんにちは．急に寒くなりましたね．B-SKY-Labです．昨年のアドカレは[M5StackとDYNAMIXELサーボをつなぎたい！](https://qiita.com/B-SKY-Lab/items/c52801ce683df49d64a1)という内容でM5StackとDYNAMIXEL XL330を接続する基板を作りました．記事を書いた後になんやかんや設計変更して作った基板が[こちら](https://github.com/kim-xps12/m5stack_board_dynamixel_ttl_rs3485)です．

本稿はその続編です．DYNAMIXELのサーボIDやBaudrateなどを**M5Stack Core2から**操作したい！と長らく思っていたので，[DYNAMIXEL Wizard](https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_wizard2/)の一部機能を再現できるような簡易ツールを作りました．以下の画像のようにタッチパネルをぽちぽちして設定変更できて便利です．

![IMG_5809.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1490597/163e04e6-c09a-6358-bb3c-f563939d4dfa.jpeg)

機能としては，

1. IDスキャン
1. 設定変更
    - ID変更
    - Baudrate変更
1. 動作テスト（サンプル動作実行）
    - 位置制御モードサンプル
    - 速度制御モードサンプル

を用意しました．M5Stack Core2だけでもある程度の設定が行えますね．ゆくゆくは[以前作った倒立振子](https://github.com/kim-xps12/bsl-balancer)にこの機能も合体させたいきもちがあります．きもちがあるだけなのでいつになるかは分かりません...

実はこれを作ったのは約二か月前なのですが，「あとで公開しよ～」と放置しすぎてしまったのでこの場を借りて宣伝しようと思います．issueやPRもお待ちしております！！

## 免責事項
本稿の内容を用いて行う実験等について，全て自己責任でお願いいたします．また，この記事の一切の責任は @B-SKY-Labにのみ帰属します．

## 注意事項

本コードおよび[DYNAMIXEL TTL UART Board](https://github.com/kim-xps12/m5stack_board_dynamixel_ttl_rs3485)は，DYNAMIXEL XL330でのみ期待通り動作することを確認をしています．XC330もはDNYNAMIXEL TTLだしいけるはず，と思っていたのですがなぜか動かないので調査中です...何か違いをご存じの方いらしたら教えてください...！

それでは宣伝本編どうぞ！

---

## 概要

[DYNAMIXEL TTL UART Board](https://github.com/kim-xps12/m5stack_board_dynamixel_ttl_rs3485)とM5Stack Core2を用いて[DYNAMIXEL Wizard](https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_wizard2/)の一部機能を再現します．現時点では以下の機能が実装されています．

- 接続されたサーボのIDとBaudrateをスキャン
- ID / Baudrateの変更
- 位置制御モード / 速度制御モードのサンプル実行

## セットアップ

1. Visual Studio Codeをインストールします
1. PlatformIOのプラグインを追加します
1. M5Stack Core2へ本リポジトリのコードをビルドして書き込みます
1. [DYNAMIXEL TTL UART Board](https://github.com/kim-xps12/m5stack_board_dynamixel_ttl_rs3485)を用いてサーボを接続します
1. `initializing...`と数秒間表示された後に以下のようなメインメニューが表示されたら完了です
    ```
    DYNAMIXEL Wizard M5Core2!
    Button A: scan
    Button B: ID / Baud
    Button C: Sample Exec
    ```
**注意**
本コードはDYNAMIXEL TTL UART Board **v2.0** を想定しています．
v1.0をお使いの方は，[main.cpp#L9-L10]()のRX, TXピン番号を以下のように入れ替えてからビルドと書き込みを行ってください．（v2.0をお使いの場合は何も編集せずにそのままビルド→書き込みを行ってください）

```
// Pin assign for v1.0 board
const uint8_t PIN_RX_SERVO = 32;
const uint8_t PIN_TX_SERVO = 33;
```

## 機能と使用方法

### サーボのスキャン

メインメニューで`Button A`をタップすると，接続されたサーボのスキャンを行います．
結果の表示画面で再度`Button A`をタップするとメインメニューに戻ります．


### ID/Baudrateの変更

メインメニューで`Button B`をタップすると，接続されたサーボのIDまたはBaudrateの書き換えが行えます．

- Use Baud: サーボが**現在使用しているBaudrate**を指定してください
- Target ID: 書き換え対象のサーボに**現在設定されているID**を指定してください
- New ID: **変更後**に使用したいサーボIDを指定してください
- New Baud: **変更後**に使用したいBaudrateを指定してください

上記の項目の値を設定したら，IDの変更を行う場合には[Apply ID]を，Baudrateの変更を行う場合には[Apply Baud]をタップしてください．

設定の書き込み途中以外で再度`Button B`をタップするとメインメニューに戻ります．


### 位置制御/速度制御サンプルの実行

メインメニューで`Button C`をタップすると，位置制御 / 速度制御のサンプル実行が行えます．

- ID: 接続されたサーボのうち，動作させたいサーボのIDを指定してください
- Baud: 接続されたサーボが使用しているBaudrateを指定してください

上記の項目の値を設定したら，位置制御のサンプル実行を行う場合には[Position Mode]を，速度制御の場合には[Velocity Mode]をタップしてください．

- 位置制御のサンプル実行では，0, 90, 180, 270[deg]への位置制御が行われます
- 速度制御のサンプル実行では，60[rpm], -60[rpm]の速度制御がそれぞれ1秒間行われます

サンプル実行中以外で再度`Button C`をタップするとメインメニューに戻ります．

## 結言
本稿ではDYNAMIXELのサーボIDやBaudrateなどをM5Stack Core2から操作するための自作ツールについて紹介しました．これを読んだ方のロボット開発(等)の一助になれば幸いです．


それでは．