Pythonでダイレクトドライブモーターを回してみた!

6月 12, 2022

おうちハックをしているとモーターを使用したくなるときがあります. どうしてもモーター音が気になってしまいます. そこで比較的静音なダイレクトドライブモーターというものがあります. ダイレクトドライブモーターはギアを持っておらず, モーターの駆動力を減速機を介さず, 直接動かすものに伝えます.
減速機構を使用しないため, 下記の利点があります.

  • バックラッシュによる精度低下がない
  • 静音
  • 部品点数が少ない分, 高信頼性
  • 摩擦損失がない分, 高効率

今回はこうした利点のあるダイレクトドライブモーターのセットアップからモーターが回るまでの手順を紹介していきます.

Direct Drive Tech社のダイレクトドライブモーター

今回の記事ではDirect Drive Tech社のダイレクトドライブモーターを使用しました.
ミクミンPさんのツイートを見ると, モーターを2個使用し, 15kgのものも動かせるくらいのパワーがあるみたいです.

仕様を見ると, 駆動電圧は18V, 0.96Nmのトルクがあり, 115rpmで回転します.
またモータードライバが組み込まれているため, あらたに用意する必要がなく, RS485通信でモーター制御します.

公式ユーザーマニュアル

準備したもの

セットアップ

ハードウェア

下図を参考に配線してみてください.

配線

3Dモデル

Direct Drive Tech社のダイレクトドライブモーターはSTEP形式の3Dモデルデータが公開されているので, それを用いてアタッチメントを作成することができます.

STEPファイルのインポート方法

3DモデルからDXFファイルをエクスポートする方法

ソフトウェア

RS485通信に必要なモジュールをインストールします.

# install pyserial
pip3 install pyserial
pip3 install numpy

ダイレクトドライブモーターを駆動させるためのソースを取得します.

# clone repository
git clone https://github.com/tech-life-hacking/DDT_M0601C_111.git

接続ポートの名前と権限付与

ソフトウェア内で接続ポートを指定するため, /dev/serial/by-id/下に生成されるデバイスファイル名を調べておきます.
USB-RS485変換アダプタをPCやRaspberryPiに挿し, 下記コマンドを実行します.
下記の場合はPORTNAMEです.

# confirm port name
ls -lrt /dev/serial/by-id/

output: PORTNAME -> ../../ttyUSB0

USB-RS485変換アダプタに権限を付与します.

# permit serial port 
sudo chmod 666 /dev/serial/by-id/PORTNAME

上記コマンドを毎回打つのが面倒な場合, 権限を自動付与する設定を行います.

sudo nano /lib/udev/rules.d/50-udev-default.rules

- KERNEL=="tty[A-Z]*[0-9]|ttymxc[0-9]*|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"
+ KERNEL=="tty[A-Z]*[0-9]|ttymxc[0-9]*|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout", MODE="0666"

Pythonでのダイレクトドライブモーター使用例

下記のサンプルを実行して, モーターが回転すればうまくセットアップできていると思います.

import usart
import time

# set port name to open the port
port_name = "/dev/serial/by-id/PORTNAME"
cp = usart.CommunicationProtocol(port_name)

Speed, Mode, ID, Acce, Brake_P = 150, 2, 1, 0, 0
# set ID
cp.Set_MotorID(ID)
# set motor mode 2: velocity loop
cp.Set_MotorMode(Mode, ID)
# control motor
mode, Current, Velocity, Angle, Fault_value = cp.Control_Motor(Speed, ID, Acce, Brake_P)
# check motor velocity
mode, Current, Velocity, Angle, Fault_value = cp.Check_Motor()

おわりに

今回はDirectDriveTech社のダイレクトドライブモータを紹介しました. 比較的安価だと思うのでぜひ使ってみてください!