シンプルモータコントローラG2のI2C通信を使い、Raspberry Piでモータ制御をします。
I2C動作モード
Pythonで、smbus2ライブラリを使用しています。Raspberry Piでの設定は接続の時の説明をご覧ください。
smbus2のインストールがまだの時は、次のコマンドでインストールしてください。
pip install smbus2
pip3 install smbus2
Raspberry Piとシンプルモータコントローラを、Raspberry Pi拡張ポートからI2Cで接続します。
18v15/24v12と18v25/24v19で配置がすこし違いますが、ボードの左にあるRX/SDA、SCLとGNDへ接続します。(18v25/24v19は、SCLが2箇所ありますがどちらに接続しても大丈夫です。)
Simple Motor Control Center G2から設定します。 インストールがまだの時は、導入編をご覧ください。
Input settingsタブを開き設定していきます。
Device Numberを変更することで、複数台のシンプルモータコントローラG2を制御できます。
sudo raspi-config
Advanced Optionsを選択し、I2Cを選んで enable(有効) にしてください。
sudo apt-get install python-smbus i2c-tools sudo reboot
インストールして、再起動をしてください。
sudo i2cdetect -y 1
接続されていたら、デバイス番号が表示されます。
基本的な、正転と逆転制御するサンプルコードです。
# smbus2ライブラリを使用し、シンプルモータコントローラG2から送受信を行います。 # Linux上の Python 2 と Python 3 で動作します # # シンプルモータコントローラG2の入力モードを Serial/USB にしてください。 # Enable I2C を必ず設定してください。 # # 注意: "SMBus(1)" の行を、正しいI2Cバスデバイスに変更する必要があります。 # 注意: "address = 13" の行を、正しいデバイス番号に変更する必要があります。(標準 13) from smbus2 import SMBus, i2c_msg class SmcG2I2C(object): def __init__(self, bus, address): self.bus = bus self.address = address # セーフスタート終了コマンド送信 # モータを動作させるために必要 def exit_safe_start(self): write = i2c_msg.write(self.address, [0x83]) self.bus.i2c_rdwr(write) # SMC ターゲット速度設定 (-3200 ~ 3200) def set_target_speed(self, speed): cmd = 0x85 # Motor forward if speed < 0: cmd = 0x86 # Motor reverse speed = -speed buffer = [cmd, speed & 0x1F, speed >> 5 & 0x7F] write = i2c_msg.write(self.address, buffer) self.bus.i2c_rdwr(write) # 指定した変数IDの値を 符号無し整数 で取得 def get_variable(self, id): write = i2c_msg.write(self.address, [0xA1, id]) read = i2c_msg.read(self.address, 2) self.bus.i2c_rdwr(write, read) b = list(read) return b[0] + 256 * b[1] # 指定した変数IDの値を 符号付き整数 で取得 def get_variable_signed(self, id): value = self.get_variable(id) if value >= 0x8000: value -= 0x10000 return value # ターゲット速度取得 (-3200 ~ 3200) def get_target_speed(self): return self.get_variable_signed(20) # 異なるエラーの各ビット表示の数値を取得 # ビットが「1」の時は、現在もエラーが有効 # エラービットの定義はユーザガイドを参照 def get_error_status(self): return self.get_variable(0) # I2Cバスの "/dev/i2c-1" をオープン (Raspberry Pi だと SMBus(1) が標準) bus = SMBus(1) # SMB I2Cアドレスを選択 (デバイス番号) address = 13 smc = SmcG2I2C(bus, address) smc.exit_safe_start() error_status = smc.get_error_status() print("Error status: 0x{:04X}".format(error_status)) target_speed = smc.get_target_speed() print("Target speed is {}.".format(target_speed)) new_speed = 3200 if target_speed <= 0 else -3200 print("Setting target speed to {}.\n".format(new_speed)); smc.set_target_speed(new_speed)
シンプルモータコントローラG2を使い、いろいろなインタフェースから基本的なモータ制御をやってみました。
モータを簡単に制御できるように複数のインタフェースに対応し、強力なモータドライバを搭載したシンプルモータコントローラG2です。今回は、1台で制御しましたが、R/Cやマイコンなどから複数台のモータコントローラを制御する方法もあり、多くのモータを制御するときにも便利です。
より詳細な使い方は、ユーザガイド(英語版)に紹介されていますのでご覧ください。