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(英語版)をご覧ください。