Direct Drive Tech社製DDT M06/M15ダイレクトドライブモーターを使う
中国Direct Drive Tech社製ダイレクトドライブモーターが界隈で話題です。ギアを使っていないため静音性が高く、さらにトルクが高い事が特徴です。
販売ページ(スイッチサイエンス)
対応製品
- DDT M0601C_111
- DDT M0602C_112
- DDT M1502A_212
本記事・ライブラリはM5Stack,M5SickC等のM5シリーズでの使用を想定していますが、送受信部分のコードを一部変更すれば他のArduinoボードでも動作するかと思います。
必要なもの
- DDTダイレクトドライブモーター - 私はM0601C_111を使いました。
- M5 Stackシリーズの製品
- RS485ユニット (各種Hatでも可)
- 電源 - 定格は18Vですが、9Vくらいから回るそうです。
配線
モーターの線は画像のようになります。
ケーブルの電源はXHコネクタ、信号線はZHコネクタです。ZHコネクタはピッチが1.5mmのため、通常のユニバーサル基板に刺さりません。コネクタを切断等の処理が必要です。
(ミクミンPさんから画像お借りました)
私の場合の作成例です。ZHコネクタは2mmピッチのユニバーサル基板に強引に取り付けました。XHコネクタは通常の2.5mmピッチ基板に取り付けました。
自走ロボットを作る事を想定して、緊急停止スイッチを取り付けています。
コード
M5 Stackで使えるライブラリを作りました。
インストール方法
- githubからリポジトリを.zipでダウンロード
- ArduinoIDEから
スケッチ
->ライブラリをインクルード
->.zip形式のライブラリをインストール
スケッチ
サンプルスケッチをいくつか用意しました。 ArduinoIDEでファイル
-> スケッチ例
-> DDT_Motor_M15M06
にいくつかあります。
モーターを回す
モーターの正転逆転をくり返えし、モーターの速度をシリアルモニタに出力するコードです。
#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は消えません。
#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ライブラリを作ったので、間違えている部分が多いはずです。ご指摘があればお願いします。
Discussion