創るたのしみを応援

Pololu ハイパワーシンプルモータコントローラG2

Linux I2C Pythonサンプル(Raspberry Pi)

シンプルモータコントローラG2のI2C通信を使い、Raspberry Piでモータ制御をします。

I2C動作モード

  • I2C デバイス番号 13
  • バイナリコマンド方式
  • CRC無効モード

Pythonで、smbus2ライブラリを使用しています。Raspberry Piでの設定は接続の時の説明をご覧ください。

smbus2のインストールがまだの時は、次のコマンドでインストールしてください。

pip install smbus2
pip3 install smbus2

Raspberry Piと接続

Raspberry Piとシンプルモータコントローラを、Raspberry Pi拡張ポートからI2Cで接続します。

  • シンプルモータコントローラG2 Rx / Raspberry Pi SDA1 (GPIO2)
  • シンプルモータコントローラG2 Tx / Raspberry Pi SCL1 (GPIO3)
  • GND

18v15/24v12と18v25/24v19で配置がすこし違いますが、ボードの左にあるRX/SDA、SCLとGNDへ接続します。(18v25/24v19は、SCLが2箇所ありますがどちらに接続しても大丈夫です。)

ハイパワーシンプルモータコントローラ G2 18v15 と 24v12 のピン配置
ハイパワーシンプルモータコントローラ G2 18v25 と 24v19 のピン配置

I2C通信へ設定

Simple Motor Control Center G2から設定します。 インストールがまだの時は、導入編をご覧ください。

Input settingsタブを開き設定していきます。

  1. Input ModeでSerial/USBを選択
  2. Enable I2C (disable TTL serial) にチェック
  3. Device Numberに 13 を入力 (標準 13)
  4. Apply Settingsをクリック

Device Numberを変更することで、複数台のシンプルモータコントローラG2を制御できます。

Raspberry Pi のI2C設定

I2Cポートを有効にする

sudo raspi-config

Advanced Optionsを選択し、I2Cを選んで enable(有効) にしてください。

ライブラリとツールのインストール

sudo apt-get install python-smbus i2c-tools
sudo reboot

インストールして、再起動をしてください。

I2C接続の確認

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やマイコンなどから複数台のモータコントローラを制御する方法もあり、多くのモータを制御するときにも便利です。

より詳細な使い方は、ユーザガイド(英語版)に紹介されていますのでご覧ください。