3
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?

DAMIAO DM2325(M2006互換?)を回してみた!

Last updated at Posted at 2025-10-17

はじめに

こんにちは!
豊橋技術科学大学 学ロボ2025世代のじゃにです!
学ロボ2025では、RC(背が高い方のロボット)の全体・ローラ機構の設計とピットクルーを担当していました.

今回は、TwitterでRoboMaster M2006(以下M2006)の互換品(大嘘)として話題になったDAMIAOのDM2325を回してみたことについて書きます!

結論から言うと、M2006の互換モータとして考えたら微妙ですが、制御性がよく趣味や制御が主目的でない研究などに非常に使いやすいモータだと思います!

WARNING
筆者はロボコン時代は機械設計を担当しており、制御関係に関しては素人です.記事内のコードもデータシートを読み、生成AIと相談しながら生成したものです.
記事内の回路構成や、コードを用いて同様のモータを動かして発生した損害について、筆者は一切の責任を負いません.

DM2325について

冒頭にも書きましたが、TwitterでM2006の互換として紹介されたものの、寸法がかなり異なり代替できないと話題になりました.同社製のDM3519がRoboMaster M3508と比較して直径や取付穴が共通化されており、本体の長さが異なるだけであったのに対し、このDM2325はモータ本体の直径・取付穴などが異なりそのまま置換できる製品ではありません.

IMG_1389.jpg

上記の画像は信号線をオシロで見るために追加ではやしているので一本多いですが、モータから生えている線はM2006と同様の電源線とGH4ピンケーブルです.

データシートは以下のGiteeという中国版GitHub(?)からダウンロードすることができます.リンク先のリポジトリには3Dデータなどもあります.
DAMIAOのGitee
DM2325のデータシートなど

DM2325の購入について

今回は、中国の通販サイトTaoBaoで購入しました。

9/30に注文して約2週間後の10/12に到着しました.

TAOBAO.png

TaoBaoで購入する際は上記画像の選択肢(下は翻訳したもの)から商品の組み合わせを選んで購入することができます.
私が今回購入したのは、「モーターキット(USB to CAN + ドライバーを含む)」です.商品名の通り、ギヤヘッド付きのモータとESC、USB to CANの書き込み機がセットになったものです.
購入金額は488元で、日本円で11,658円でした(2025年9月30日時点).
その後、なぜか国際送料のような名目で追加で1,406円を支払いました.この存在に2日くらい気づかなかったので、もっと早く払ってたら早く手に入っていた説はあります.

各商品の価格は以下の通りです(2025年10月17日時点).

商品 人民元 日本円
ギヤヘッド付きモータとESCのセット 448元 約9,458円
ギヤヘッドなしモータ 149元 約3,146円
ギヤヘッド付きモータ 249元 約5,257円
ギヤヘッド付きモータ + ESC + USB to CAN 488元 約10,303円
ギヤヘッド付きモータ + ESC + USB to CAN FD 528元 約11,147円
ESC単体 199元 約4,201円

他に方法があるorほかの製品で代替可能かもしれませんが、GUIツールを用いてESCのCAN IDを変更する際に必要なので、USB to CANを1つは購入することをお勧めします.

詳細

ギヤヘッド付きモータ本体

IMG_1390.jpg
IMG_1391.jpg
IMG_1392.jpg
IMG_1393.jpg

M2006との比較

IMG_1398.jpg

M2006との大きな違いは以下に挙げるような点だと思います.

  • 軸にピンを通せる穴がない
  • 軸の先端にタップ穴がない
  • 取付用の穴が3点じゃなくて4点である
  • 本体のサイズが直径・長さともに大きい

特に最初の2つがないことで固定する方法がクランプ系のものしかなくとても不便だと思いました.
また、画像を見たらわかるのですがDカットの加工が雑いです.

制御的なところでいうと

  • 自身のESCのIDにメッセージが送られた時のみフィードバックを返す
  • 起動時にenableのメッセージを送る必要がある
  • モードごとにCANのIDが異なる
  • CANのIDが、MASTER_IDとSLAVE_IDがある
  • CANのデータ構造が大きく違う
    • MITモードの場合
    • image.png
  • ロボマスが4個のモータで1メッセージなのに対して、DMシリーズは1個のモータに1メッセージ
  • ESC単体でCANのIDを変更することができない
    • CANでできるという説もある
  • エンコーダがアブソリュートでなくインクリメンタル

分☆解

モータを分解してみました.
ギヤヘッドとモータの固定はM2006と同じタイプでした.
IMG_1349.jpg
データシートで重量は172.2gとなっているのでほぼそれ通りです.

IMG_1350.jpg
IMG_1351.jpg

ギヤヘッドだけで100gもあります.

なぜか合計の重量が一致してない

IMG_1352.jpg
M2006単体が90gなので、DM2325はギヤヘッドだけでそれより重たいです.

IMG_1353.jpg
DM2325のほうがM2006よりも軸が太いです.

ESC

IMG_1386.jpg
IMG_1387.jpg
IMG_1388.jpg

DM3519に付属するESCと型番が同じなので全く同じものかと思いましたが、2325というシールが貼られているので内部のファームウェアが違ったりするのかもしれません.
RoboMasterのC620と似たような形状をしていますが、持った感じが軽いです.
ESC自体からケーブルが生えていないのが個人的にいいなと思いました.

USB to CAN

IMG_1394.jpg

伸びている信号線は、CANとUARTです.
後述するGUIツールで設定を書き込む際に使用します.

M2006との比較

GUIツール

DM2325(というよりDAMIAOのモータ?)には、GUIで設定を読み出し・書き込み、テスト動作できるGUIツールがあります.
導入方法や詳しい使い方を省略しますが、以下のリンク先の"dm_tools"がDAMIAOのモータに使用できるGUIツールです.
dm_tools

・シリアルポートの画面
image (7).png

・キャリブレーション画面
image (9).png

・設定の読み出し・書き込み画面
image (8).png

・テスト動作画面
image (6).png

パラメータを設定して各動作モードで動かしてみたりできます.
画面の一番上の赤いグラフが位置のグラフですが、エンコーダの範囲が-4π~4πであることがわかります.

GUIツールのTips

  • ESCのファームウェアを更新しないと通信できない
  • キャリブレーションを行おうとすると、データ転送エラーで行えない
    • データシートによると通常キャリブレーションは不要なので今回は行わずにモータを回しました.
  • 画面下の設定スイッチで中国語と英語を切り替えできる
  • テスト動作画面では画面右下のsendを押さないとCANのフィードバックが送られてこない

RP2040で回す

構成

偉大な先輩方のライブラリと知見により簡単にモータを回すことができました.
IMG_1385.jpg

基本的には以下のブログと同様な回路の構成でモータを回しました.

以下のライブラリにより、CANコントローラのないRP2040のPIOを用いてCANトランシーバを接続するだけでCAN通信を行うことができます.

動かしている様子

速度制御を行っている様子

位置制御を行っている様子

RoboMasterモータの起動音を再現しようとした

プログラム

ライブラリとサンプルプログラムを公開しました.
動作モードを切り替えることで、以下の3モードで動かすことができます.

  • MITモード
  • 位置制御モード
  • 速度制御モード

enableメッセージ送信時に起動音が鳴ります.

ソースコードを表示(折りたたみ)

動かしたプログラム

#include <RP2040PIO_CAN.h>
#include <DMMotorController.h>

// 1: MITモード
// 2: 位置制御モード
// 3: 速度制御モード
const int CONTROL_MODE = 3;
const int DELAY_AFTER_STARTUP_MS = 2000;

// --- CAN設定 ---
const uint8_t CAN_TX_PIN = 0;
const uint8_t CAN_RX_PIN = 1;

// --- モーター設定 ---
const byte MOTOR_ID = 0x01;
DMMotorController motor(MOTOR_ID, CAN);

// --- 制御パラメータ ---
const float VELOCITY_LIMIT_RPM = 50.0f;
const float MIT_KP = 2.0f;
const float MIT_KD = 0.8f;

// --- 状態管理用の変数 ---
int motionStep = 0;
unsigned long stepTimer = 0;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("--- DMMotorController Library Demo ---");

  CAN.setTX(CAN_TX_PIN);
  CAN.setRX(CAN_RX_PIN);
  if (CAN.begin(CanBitRate::BR_1000k)) {
    Serial.println("CAN bus initialized.");
  } else {
    Serial.println("CAN bus initialization failed!");
    while (1);
  }

  // --- 起動処理 ---
  Serial.print("Waiting for motor to be enabled...");
  while (!motor.isEnabled()) {
    motor.enableMotor(); 
    motor.update();      
    Serial.print(".");
    delay(100);
  }

  Serial.println("\nMotor enabled. Playing startup sound.");
  motor.playStartupBeep(2000, 100);
  
  Serial.print("Waiting for ");
  Serial.print(DELAY_AFTER_STARTUP_MS);
  Serial.println(" ms before starting operation...");
  delay(DELAY_AFTER_STARTUP_MS); 

  motor.setMode((DMMotorController::ControlMode)CONTROL_MODE);
  Serial.print("Initial mode set to: ");
  Serial.println(CONTROL_MODE);
  Serial.println("Operation started.");

  stepTimer = millis();
  motionStep = 1;
}

void loop() {
  motor.update();

  if (motor.isEnabled()) {
    switch (CONTROL_MODE) {
      case 1: 
        if (motionStep == 1) {
          motor.setMIT(0.0f, 0.0f, MIT_KP, MIT_KD, 0.0f);
          if (millis() - stepTimer > 2000) {
            motionStep = 2;
            stepTimer = millis();
          }
        } else if (motionStep == 2) {
          motor.setMIT(1.57f, 0.0f, MIT_KP, MIT_KD, 0.0f);
          if (millis() - stepTimer > 2000) {
            motionStep = 3;
            stepTimer = millis();
          }
        } else if (motionStep == 3) {
          motor.setMIT(-1.57f, 0.0f, MIT_KP, MIT_KD, 0.0f); 
        }
        break;

      case 2: 
        if (motionStep == 1) {
          motor.goToPosition(0.0f, VELOCITY_LIMIT_RPM);  // 0度
          if (millis() - stepTimer > 2000) {
            motionStep = 2; 
            stepTimer = millis();
          }
        } else if (motionStep == 2) {
          motor.goToPosition(1.57f, VELOCITY_LIMIT_RPM);  // 90度
          if (millis() - stepTimer > 2000) {
            motionStep = 3; 
            stepTimer = millis();
          }
        } else if (motionStep == 3) {
          motor.goToPosition(1.57f, VELOCITY_LIMIT_RPM);  // 90度で停止
        }
        break;

      case 3: 
        motor.setVelocityRPM(60.0f);
        break;
    }

    MotorFeedback feedback;
    if (motor.readFeedback(feedback)) {
      Serial.print("Step: ");
      Serial.print(motionStep);
      Serial.print(", Pos: ");
      Serial.print(feedback.position_deg, 2);
      Serial.print(" deg, Vel: ");
      Serial.print(feedback.velocity_rpm, 2);
      Serial.print(" RPM, Torque: ");
      Serial.print(feedback.torque_nm, 3);
      Serial.println(" Nm");
    }
  } else {
    motor.enableMotor();
  }

  delay(1);
}

詳しい関数の説明とかはいつか書きます.

結論

「はじめに」でも書きましたが、M2006の互換品として考えると微妙な点が多いですが、制御性がよく趣味や制御が目的でない研究の機械にはすごく向いたモータだと思います.
また、信号線を引き出してオシロで見ましたが、M2006の4ピンケーブルが、[電源・GND・ホールセンサ2本]の構成であるのに対して、DM2325は、[電源・GND・デジタル通信2本]という構成のようでした(要検証).
なので、同じGH4ピンのケーブルではありますが、DM2325のESCでM2006を回すことは不可能であり、その逆もまた不可能である思われます.
個人的には、趣味用であと数個買おうと思ってます!

3
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
3
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?