Pythonでダイレクトドライブモーターを回してみた!
おうちハックをしているとモーターを使用したくなるときがあります. どうしてもモーター音が気になってしまいます. そこで比較的静音なダイレクトドライブモーターというものがあります. ダイレクトドライブモーターはギアを持っておらず, モーターの駆動力を減速機を介さず, 直接動かすものに伝えます.
減速機構を使用しないため, 下記の利点があります.
- バックラッシュによる精度低下がない
- 静音
- 部品点数が少ない分, 高信頼性
- 摩擦損失がない分, 高効率
今回はこうした利点のあるダイレクトドライブモーターのセットアップからモーターが回るまでの手順を紹介していきます.
Direct Drive Tech社のダイレクトドライブモーター
今回の記事ではDirect Drive Tech社のダイレクトドライブモーターを使用しました.
ミクミンPさんのツイートを見ると, モーターを2個使用し, 15kgのものも動かせるくらいのパワーがあるみたいです.
仕様を見ると, 駆動電圧は18V, 0.96Nmのトルクがあり, 115rpmで回転します.
またモータードライバが組み込まれているため, あらたに用意する必要がなく, RS485通信でモーター制御します.
公式ユーザーマニュアル
準備したもの
- DDT M0601C_111 ダイレクトドライブモーター 18V/0.96Nm/115rpm
- ノートPCのACアダプター(>18V, >1.25A)
- 2.1mm標準DCジャック〜JST型2ピンコネクタ変換ケーブル
セットアップ
ハードウェア
下図を参考に配線してみてください.
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社のダイレクトドライブモータを紹介しました. 比較的安価だと思うのでぜひ使ってみてください!