🏍️

Direct Drive Tech社製DDT M06/M15ダイレクトドライブモーターを使う

2022/06/02に公開

中国Direct Drive Tech社製ダイレクトドライブモーターが界隈で話題です。ギアを使っていないため静音性が高く、さらにトルクが高い事が特徴です。

販売ページ(スイッチサイエンス)
https://www.switch-science.com/catalog/7646/

対応製品

  • DDT M0601C_111
  • DDT M0602C_112
  • DDT M1502A_212

本記事・ライブラリはM5Stack,M5SickC等のM5シリーズでの使用を想定していますが、送受信部分のコードを一部変更すれば他のArduinoボードでも動作するかと思います。

必要なもの

配線

モーターの線は画像のようになります。
ケーブルの電源はXHコネクタ、信号線はZHコネクタです。ZHコネクタはピッチが1.5mmのため、通常のユニバーサル基板に刺さりません。コネクタを切断等の処理が必要です。

(ミクミンPさんから画像お借りました)

私の場合の作成例です。ZHコネクタは2mmピッチのユニバーサル基板に強引に取り付けました。XHコネクタは通常の2.5mmピッチ基板に取り付けました。
自走ロボットを作る事を想定して、緊急停止スイッチを取り付けています。

コード

M5 Stackで使えるライブラリを作りました。
https://github.com/takex5g/M5_DDTMotor_M15M06

インストール方法

  1. githubからリポジトリを.zipでダウンロード
  2. ArduinoIDEからスケッチ -> ライブラリをインクルード -> .zip形式のライブラリをインストール

スケッチ

サンプルスケッチをいくつか用意しました。 ArduinoIDEでファイル -> スケッチ例 -> DDT_Motor_M15M06にいくつかあります。

モーターを回す

モーターの正転逆転をくり返えし、モーターの速度をシリアルモニタに出力するコードです。

spin_the_motor.ino
#include <DDT_Motor_M15M06.h>
#include <M5StickCPlus.h>

int16_t Speed = 0;   // Speed of motor
uint8_t Acce = 0;    // Acceleration of motor
uint8_t Brake_P = 0; // Brake position of motor
uint8_t ID = 1;      // ID of Motor (default:1)

Receiver Receiv;
// M5Stackのモジュールによって対応するRX,TXのピン番号が違うためM5製品とRS485モジュールに対応させてください
auto motor_handler = MotorHandler(33, 32); // RX,TX

void setup()
{
  Serial.begin(115200);
  Serial.println("DDT-Motor RS485");

  motor_handler.Control_Motor(0, ID, Acce, Brake_P, &Receiv);
}

const int16_t SPEED_MAX = 330;
const int16_t SPEED_MIN = -330;
void loop()
{
  while (true)
  {
    Speed++;
    delay(5);
    motor_handler.Control_Motor(Speed, ID, Acce, Brake_P, &Receiv);
    Serial.println(Receiv.BSpeed);
    if (Speed > int16_t(SPEED_MAX))
    {
      break;
    }
  }

  while (true)
  {
    Speed--;
    delay(5);
    motor_handler.Control_Motor(Speed, ID, Acce, Brake_P, &Receiv);
    Serial.println(Receiv.BSpeed);
    if (Speed < SPEED_MIN)
    {
      break;
    }
  }
}

モーターIDの変更

5回コマンドを送り、送信後パワーリセットする必要があります。変更したIDはフラッシュに保存され、電源を切ってもIDは消えません。

id_setting.ino
#include <DDT_Motor_M15M06.h>
#include <M5StickCPlus.h>

Receiver Receiv;

// M5StackのモジュールによってRX,TXのピン番号は違います
auto motor_handler = MotorHandler(33, 32); // RX,TX
void setup()
{
  Serial.begin(115200);
  Serial.println("ID setting");
  //モーターIDを2に変更するサンプル
  uint8_t ID = 0x02;
  for (int i = 0; i < 5; i++)
  {
    motor_handler.Set_MotorID(ID);
    delay(500);
  }
  Serial.println("setted");
  // Note:When setting the ID, please make sure that the bus has only one motor. ID setting is allowed once every power reset.
}

モード変更

Set_MotorMode(uint8_t Mode, uint8_t ID);

電流モード、速度モード、角度モードの3つあります。デフォルトは速度モードです。変更したモードはフラッシュに保存されません。

Mode Value
Current Mode 0x01 -32767 ~ 32767 correspond to 0 ~ 8A
Velocity Mode 0x02 -330~330 rpm
Angle Mode 0x03 0 ~ 32767correspond to 0° ~ 360°

そのほかの仕様についてはリポジトリのREADMEとモーターのデータシートを参照してください。

Trouble Shooting

  • コマンドを送っているのにモーターが回らない/値が取得できない
    • 一度モーターの電源を切り、再度電源投入すると値が取れる場合がある
    • モーターのケーブル黒線はGNDではないので注意
    • デフォルトIDは0ではなく0x01, Velocity Mode
  • コマンドが送れてない
    • コマンド送信完了まで5~10msほど待つと良さそう
  • タイヤについて
    • 良い感じのものがないので注意

初めてC++触ったりArduinoライブラリを作ったので、間違えている部分が多いはずです。ご指摘があればお願いします。
https://twitter.com/takex5g

Discussion