2022年5月4日
シンプルモータコントローラG2のI2C通信を使い、Arduinoでモータ制御をしていきます。
Arduinoシリーズや、A-Starなどの互換機から、I2C通信で制御する基本的なサンプルコードです。
I2C動作モード

Arduinoとシンプルモータコントローラを、I2CとGNDを接続します。
18v15/24v12と18v25/24v19で配置がすこし違いますが、ボードの左にあるRX/SDA、SCLとGNDへ接続します。(18v25/24v19は、SCLが2箇所ありますがどちらに接続しても大丈夫です。)


Simple Motor Control Center G2から設定します。 インストールがまだの時は、導入編をご覧ください。
Input 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(英語版)をご覧ください。