0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ESP32からCANでGM6020を動かす

Last updated at Posted at 2024-09-02

今回はESP32を使ってCAN通信でGM6020を制御する方法について説明します。ちなみにm3508(c620)なども似たような方法で制御できます。

開発環境

  • PC
    Windows11
    ArduinoIDE
  • USBシリアルコンバータ

  • CANトランシーバ

ファームウェアの更新とIDの変更

RoboMaster Assistantのダウンロード

GM6020のファームウェアを更新するためにはRoboMaster Assistantというソフトウェアが必要になります。
以下のサイトからソフトウェアをダウンロードしてください。同じページに日本語ドキュメントもあるので読んでおくと良いと思います。

image.png

7zファイルがダウンロードされるので,適当な方法で解凍してください。

PCとGM6020の接続

USBシリアルコンバータを用いてGM6020とPCを接続します。今回自分が利用したコンバータは6ピンのものだったので,以下の画像のように接続しました。
image.png

下側は付属品のPWM配線で,上がUSBシリアルコンバータです。
今回の場合,それぞれのピンの対応は以下の表のようになっていますが,これはコンバータの種類によって変わってくると思います。

PWM シリアル -
1番 GND
5番 TX
4番 RX

ファームウェアの更新

GM6020に24Vを投入したら,USBシリアルコンバータをPCに接続します。
先ほど解凍したフォルダ内にある,RoboMaster Assistant.exeというファイルを実行してください。
上手く認識されていると,数秒で起動画面が遷移し,以下のような画面になります。
image.png

画面が遷移しない場合はコンバータのRXとTXを入れ替えてみたりするといいかもしれません。
ESC GM6020と表示されている部分をクリックすると,以下のような画面になります。また,左下のタブから表示言語を日本語にできます。
image.png

ここではCANのモジュールIDを確認することができます。
ファームウェアの更新は左側のファームウェアの更新タブから行うことができます。
image.png

アップグレードをクリックすると更新が始まります。

IDの変更

IDを変更するにはモータの裏側にあるDIPスイッチを用います。詳しい内容についてはドキュメントを参照した方が良いと思いますが,簡単にここでも説明します。
image.png

モータの裏側を見ると上の図のようなスイッチが見つかると思います。ここで,左三つのスイッチはモジュールIDを設定するために利用し,一番右側の4番スイッチは終端抵抗のon/offを設定するために利用します。スイッチは上がonで下がoffになります。

IDの設定方法についてですが,1~3番のスイッチがそれぞれ2進数の1の位,2の位,4の位を意味しています。なので例えばIDを4にしたい場合は以下の表のようにスイッチを変更すれば良いことになります。

1 2 3
off off on

スイッチの変更はモータの電源を入れなおすと反映されます。RoboMaster Assistantを使えば簡単にIDの変更を確認することができます。
image.png

モータの制御

配線

コードを書く前にESPとCANトランシーバの配線をしなければなりません。今回用いるCANトランシーバはMCP2562FDなので,以下のサイトを参考に基盤を作成しました。

image.png

RXをGPIO5に,TXをGPIO4に接続しました。

ライブラリの導入

便利な制御ライブラリがあったので,それを使ってみたいと思います。

ArduinoIDEのLibrary ManagerにDJIMotorCtrlESPと入力すると出てくるのでインストールしてください。
image.png

新規スケッチを作成し,以下のコードを貼り付けます。

#include <DJIMotorCtrlESP.hpp>
const uint8_t RX_PIN = 5;
const uint8_t TX_PIN = 4;
//                          kp,  ki,  kd,   dead_zone, max_value
pid_param gm6020_1_speed   (10,  0,   0,    1,         16384);
pid_param gm6020_1_location(1.0, 0.1, 0.03, 5,         350);
//            can_id
GM6020 gm6020(4, gm6020_1_location, gm6020_1_speed);

void setup() {
    Serial.begin(115200);
    while(!Serial);
    can_init(RX_PIN, TX_PIN, 100);
    gm6020.setup();
}

float target_angle = 0;
bool flag = true;
void loop() {
    gm6020.set_angle(target_angle);
    if(target_angle <= 10) flag = true;
    else if(target_angle >= 350) flag = false;
    if(flag) target_angle += 1;
    else target_angle -= 1;
    delay(10);
    Serial.print(target_angle);
    Serial.print(",");
    float angle = gm6020.get_angle();
    Serial.println(angle);
}

上のコードではモータを位置制御して,10度から350度の間を往復させています。ライブラリの詳しい使い方についてはGitHubのReadMeを読むと良いと思います。

PCにESPを接続し,書き込んでください。

トラブルシューティング
  • WindowsがESPを認識しない場合

WindowsがESPを認識しない場合はドライバを最新のものにすると良いかもしれません。
下のサイトからCP210x Windows Driversをダウンロードしてください。

https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads

zipを解凍すると,中にCP210xVCPInstaller_x64.exeがあるので,実行するとドライバがインストールされます。

  • 書き込み中にエラーが発生する場合

以下のようなエラーが発生する場合はESPのbootボタンを押しながら書き込んでください。

A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
Failed uploading: uploading error: exit status 2

テスト

ESPとGM6020をCANで繋いで,24Vを投入すると動き始めます。

image.png

ArduinoIDEのシリアルプロッタで確認すると,ある程度正確に制御できている事が分かります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?