創るたのしみを応援

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

Arduino I2Cサンプル

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

Arduinoシリーズや、A-Starなどの互換機から、I2C通信で制御する基本的なサンプルコードです。

I2C動作モード

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

Arduinoと接続

Arduinoとシンプルモータコントローラを、I2CとGNDを接続します。

  • シンプルモータコントローラG2 SDA / Arduino SDA(A4)
  • シンプルモータコントローラG2 SCL / Arduino SCL(A5)
  • 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を制御できます。

基本的なサンプルコード

モータコントローラ起動時間を表示し、正転と逆転を行うサンプルコードです。

正転全速回転 1秒し、逆転全速回転 1秒 を繰り返します。

#include <Wire.h>

const uint8_t smcDeviceNumber = 13;

// コントローラの再起動やエラー後に
// モータの動作を有効にするため必要
void exitSafeStart()
{
  Wire.beginTransmission(smcDeviceNumber);
  Wire.write(0x83);  // Exit safe start
  Wire.endTransmission();
}

void setMotorSpeed(int16_t speed)
{
  uint8_t cmd = 0x85;  // モータ正転コマンド
  if (speed < 0)
  {
    cmd = 0x86;  // モータ逆転コマンド
    speed = -speed;
  }
  Wire.beginTransmission(smcDeviceNumber);
  Wire.write(cmd);
  Wire.write(speed & 0x1F);
  Wire.write(speed >> 5 & 0x7F);
  Wire.endTransmission();
}

uint16_t readUpTime()
{
  Wire.beginTransmission(smcDeviceNumber);
  Wire.write(0xA1);  // Command: Get variable
  Wire.write(28);    // Variable ID: Up time (low)
  Wire.endTransmission();
  Wire.requestFrom(smcDeviceNumber, (uint8_t)2);
  uint16_t upTime = Wire.read();
  upTime |= Wire.read() << 8;
  return upTime;
}

void setup()
{
  Wire.begin();
  exitSafeStart();
}

void loop()
{
  // コントローラから起動時間を読み出し
  // シリアルモニタへ送信
  uint16_t upTime = readUpTime();
  Serial.print(F("Up time: "));
  Serial.println(upTime);

  setMotorSpeed(3200);   // 正転 全速
  delay(1000);
  setMotorSpeed(-3200);  // 逆転 全速
  delay(1000);
}

Pololuユーザガイドにある、ArduinoのI2C通信からシンプルモータコントローラG2を制御するのサンプルコードです。バイナリコマンド方式の詳細は、ユーザガイド 6.2.1(英語版)をご覧ください。