DJI GM6020 をPWMで速度制御する方法 RoboMaster Assistant

![GM6020](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/dcf3aafd-53af-05de-8afa-a1b1c6d62e53.png)
# GM6020のユーザーガイド(ドキュメント)
https://www.robomaster.com/en-US/products/components/general/gm6020?from=store-product-page#downloads

DJI RoboMaster GM6020 ブラシレスDCモーターをESP32から出すPWMで速度制御する。
GM6020では、CANまたは、PWMで制御できる。

### CANとPWMの比較
外部のセンサはなしで、それぞれのできること
|  | CAN | PWM |
|:-----------|:------------:|:------------:|
| 設定       | 位置、速度、電流、電圧       | 速度、位置         |
| 取得     | 位置、速度、電流、温度      | なし       |

速度制御のみする場合、CANでもできるが、PWMの方が楽なのでPWMで行った。

:::note warn
PWM制御するときの注意点
PWM制御のデフォルトでは、**位置**制御モードで、速度制御モードではない
:::
RoboMaster Assistantで設定することで、速度制御モードと位置制御モード(デフォルト)を切り替えることができる。
PWMで位置制御したい場合は、RoboMaster Asssitantで設定を変える必要はない。

# RoboMaster Assistantの使い方
ユーザーガイドには、USBシリアルコンバーターを繋ぐと書いてあり、DJI公式が別売りで販売しているものかと思ったが、そいういうわけではなく、市販品を使えばよい。マイコンで自作することも多分できる。今回、どのUSBシリアルコンバーターを使ったのかわからないので、入ってた箱の画像も載せておく。
配線は3本繋ぐだけ。
| GM6020 | シリアルコンバーター |
|:-:|:-:|
|  GND(黒) |  GND |
|  TX(灰) |  TX |
|  RX(白) |  RX |




| USBシリアルコンバーターの箱 | USBシリアルコンバーター |
|:-:|:-:|
| ![USBシリアルコンバーターの箱](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/40f2932d-8722-d4a8-6429-691f10ade19b.png)  | ![USBシリアルコンバーター](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/86e38eed-0380-c650-9034-70d63d50276e.png)  |

USBをパソコンに挿す。

RoboMaster Assistantをインストールして、起動する。
[RoboMaster Assistantのダウンロードリンク](https://www.dji.com/jp/downloads/softwares/robomaster-win)
![起動直後の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/c0e1320a-1fce-d50e-1ea2-8b20a088d397.png)
赤い文字が点滅するがそれはクリックしない。

24V電源入れる、USBシリアルコンバーターをパソコンに指す。ESCとモーターは繋がれた状態で、CANケーブルはつなぐ必要ない。
1回認識したら、別のESCに変えても認識を待たずにパラメーターを書き込める。

USBシリアルコンバーターをパソコンのUSBに挿す。数秒後に自動的に認識されて、デバイスを選択画面になる。
![デバイスマネージャー COMポートに認識される](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/a08ae442-5fdc-99af-3a26-a97007a42ff9.png)

![認識後の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/88b0b17c-f08c-6999-eaa2-706ab6fca3a8.png)

ESC GM6020 をクリックする。

左下で言語を選択できる。
![スクリーンショット 2024-02-19 145028.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/da106a4c-8cf4-4605-efcf-da963a001867.png)

ファームウェアのアップデートがあれば、アップデートする。
![アップデート後の画面1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/38d4f5ba-a41c-b326-7a08-94e057e820bc.png)
![アップデート後の画面2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/519df202-134d-1cfa-41ff-bd7f280f77f5.png)
![アップデート後の画面3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/96714fb2-6290-c3fc-8afe-34114cc891a6.png)
![ESC GM6020 を選択後の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/dda5d3a8-121e-3477-a748-73f428b8656b.png)

初期状態の設定
![スクリーンショット 2024-02-19 145218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/b73b2962-70e6-05db-5798-dfa6ddb16f21.png)

速度閉ループ周波数の設定
![スクリーンショット 2024-02-19 145139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/5cb8657c-10a9-38fa-bb49-4bb0c845544e.png)

最大?角の設定
![スクリーンショット 2024-02-19 145054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/620f1cbd-dd0c-a3f7-aeda-bafaff6d2189.png)

PWMモードの設定

:::note info
速度制御・位置制御を変える時はこの項目を変える
:::

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/e7fd8838-8a4b-15bc-9183-cf7243c5611a.png)

最後に右下の「設定」を押して保存する。

パソコンとモタドラがどのようにシリアル通信しているか、ロジックアナライザで見たかった

# 実験
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">GM6020 PWMで動かせた🥳めっちゃ遅いけどトルクは強い <a href="https://twitter.com/hashtag/%E3%83%AD%E3%83%9C%E3%82%B3%E3%83%B3?src=hash&amp;ref_src=twsrc%5Etfw">#ロボコン</a> <a href="https://t.co/AAyFvTJxAZ">pic.twitter.com/AAyFvTJxAZ</a></p>&mdash; Raptor//ラプター@ロボコン (@Raptor_zip) <a href="https://twitter.com/Raptor_zip/status/1759506262310498386?ref_src=twsrc%5Etfw">February 19, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 用意したもの
- [x] GM6020
- [x] PWMケーブル(GM6020付属)
- [x] XT30電源ケーブル(GM6020付属)
- [x] パソコン
- [x] マイコン(ESP32)
- [x] ジャンパー
- [x] 安定化電源
24Vの電源がすぐ近くなかったので、18Vの安定化電源に繋いで実験した。
![部室に転がってる今にも壊れそうな安定化電源](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/deb08dce-11ed-a698-b925-d339cc004757.png)

## コード
```c:GM6020_control.ino
#include <ESP32Servo.h>

#define ESC_PIN 15  //ESCへの出力ピン

Servo esc;  //Servoオブジェクトを作成する．今回はESCにPWM信号を送るので，`esc`と命名している．

void setup() {
  Serial.begin(115200);
  Serial.println("Program begin...");

  esc.attach(ESC_PIN);  //ESCへの出力ピンをアタッチする
  Serial.println("最大値2000にする");
  esc.writeMicroseconds(2000);  //最小のパルス幅を指示する
  delay(2000);
  Serial.println("最小値2000にする");
  esc.writeMicroseconds(1000);  //最小のパルス幅を指示する
  delay(2000);
}

void loop() {
  esc.writeMicroseconds(2000); //正転 MAX
  delay(2000);
  esc.writeMicroseconds(1000); //逆転 MAX
  delay(2000);
  esc.writeMicroseconds(1500); //止まる
  delay(2000);
}
```

### 解説
![ユーザーガイド p.8](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551471/771f3148-6d28-95ba-e46a-fc0bb83bee66.png)

Arduinoで動かすときはインクルードするライブラリをServo.hにすれば多分動く
ESP32Servo.hはライブラリマネージャーからesp32 servoで検索して、見つけた

キャリブレーションは、一般的なESCでブラシレスモーターと同じプログラムで、最大(2000)→最小(1000)の順に設定する。
正転逆転の指定は特殊で、1000～1500までは逆転で、1500で停止、1500～2000までは正転である。

起動すると、ステータスLEDが動画のように、緑色にゆっくり点滅する。これは、PWM通信は正常であることを意味する。

##  位置制御した結果
ボールを射出する競技で筒の仰角調整にGM6020を使いました。PIDゲインを細かく調整しましたが、振動してしまって、まともに動きませんでした。
GM6020を位置制御するために購入するのはおすすめしません。
そもそもロボコンだと使い道がほぼ0です。