創るたのしみを応援

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

Arduinoサンプル

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

Arduinoシリーズや、A-Starなどの互換機から、TTLシリアル通信で制御する基本的なサンプルコードと、エラー処理も行う詳細なサンプルコードです。

シリアル動作モード

  • ボーレート 19,200 bps
  • バイナリコマンド方式
  • CRC無効モード

基本的なサンプルコード

Arduinoと接続

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

  • シンプルモータコントローラG2 Rx / Arduino Tx(D4)
  • GND

Arduinoシリアル通信に、SoftwareSerialを使用しているので、Arduino Txのピンは、D4ピン以外にも設定できます。

18v15/24v12と18v25/24v19で配置がすこし違いますが、ボードの左にあるRX/SDAとGNDへ接続します。

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

シリアル通信へ設定

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

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

  1. Input ModeでSerial/USBを選択
  2. TTL Serialの Fixed baud rate: を選択し 19200を入力
  3. Apply Settingsをクリック

サンプルコード中で、baud rateを指定しているため、19200にしてください。標準のAuto-detect baud rateでも動作しますが、SoftwareSerialライブラリのボーレートの正確さを考えると推奨できません。

基本的なサンプルコード

基本的な、正転と逆転を行うサンプルコードです。

正転全速回転 1秒し、逆転全速回転 1秒 を繰り返すコードです。

#include <SoftwareSerial.h>
#define rxPin 3  // pin 3 connects to smcSerial TX  (このサンプルでは使用しません)
#define txPin 4  // pin 4 connects to smcSerial RX
SoftwareSerial smcSerial = SoftwareSerial(rxPin, txPin);

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

// 速度を数値で -3200 ~ 3200 まで
void setMotorSpeed(int speed)
{
  if (speed < 0)
  {
    smcSerial.write(0x86);  // モータ逆転コマンド
    speed = -speed;  // モータ速度を正の値へ
  }
  else
  {
    smcSerial.write(0x85);  // モータ正転コマンド
  }
  smcSerial.write(speed & 0x1F);
  smcSerial.write(speed >> 5 & 0x7F);
}

void setup()
{
  // 初期化: ソフトウェアシリアル ボーレート 19.2 kbps
  smcSerial.begin(19200);

  // シンプルモータコントローラは、
  // シリアルデータを送る前に 1ms あける必要があります。
  // ここでは、5ms 遅延処理を行います。
  delay(5);

  // シンプルモータコントローラで自動ボーレート検出を有効にしている場合、
  // ボーレートを学習できるように、最初に 0xAA (10進数170)を送信します。
  smcSerial.write(0xAA);

  // 次に、セーフスタート終了コマンドを送信
  // セーフスタートエラーをクリアし、モータを動作開始状態にします。
  exitSafeStart();
}

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

詳細なサンプルコード

Arduinoと接続

Arduinoとシンプルモータコントローラを接続します。基本的なサンプルコードより接続が増えていますので注意してください。

  • シンプルモータコントローラG2 Rx / Arduino Tx (D4)
  • シンプルモータコントローラG2 Tx / Arduino Rx (D3)
  • シンプルモータコントローラG2 /RST / Arduino D5
  • シンプルモータコントローラG2 ERR / Arduino D6
  • GND

Arduinoシリアル通信に、SoftwareSerialを使用しているので、シリアルはD3,D4ピン以外にも設定できます。/RSTとERRも、任意のデジタルピンへ変更できます。

18v15/24v12と18v25/24v19で配置がすこし違いますが、ボードの左にあるRX/SDA、TX、/RST、ERRとGNDへ接続します。

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

シリアル通信へ設定

上で設定した、基本的なサンプルコードの設定と同じです。

詳細なサンプルコード

シンプルモータコントローラG2との、シリアル通信の方法、モータ速度の設定、変数の読取り、モータの制限を変更するためのコマンドの送信サンプルです。

#include <SoftwareSerial.h>
#define rxPin 3    // pin 3 connects to SMC TX
#define txPin 4    // pin 4 connects to SMC RX
#define resetPin 5 // pin 5 connects to SMC nRST
#define errPin 6   // pin 6 connects to SMC ERR
SoftwareSerial smcSerial = SoftwareSerial(rxPin, txPin);

// some variable IDs
#define ERROR_STATUS 0
#define LIMIT_STATUS 3
#define TARGET_SPEED 20
#define INPUT_VOLTAGE 23
#define TEMPERATURE 24

// some motor limit IDs
#define FORWARD_ACCELERATION 5
#define REVERSE_ACCELERATION 9
#define DECELERATION 2

// シリアル 1バイト読込み (タイムアウトしデータがない時は -1 を返す)
int readByte()
{
  char c;
  if(smcSerial.readBytes(&c, 1) == 0){ return -1; }
  return (byte)c;
}

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

// 速度を数値で -3200 ~ 3200 まで
void setMotorSpeed(int speed)
{
  if (speed < 0)
  {
    smcSerial.write(0x86);  // モータ逆転コマンド
    speed = -speed;  // モータ速度を正の値へ
  }
  else
  {
    smcSerial.write(0x85);  // モータ正転コマンド
  }
  smcSerial.write(speed & 0x1F);
  smcSerial.write(speed >> 5 & 0x7F);
}

unsigned char setMotorLimit(unsigned char  limitID, unsigned int limitValue)
{
  smcSerial.write(0xA2);
  smcSerial.write(limitID);
  smcSerial.write(limitValue & 0x7F);
  smcSerial.write(limitValue >> 7);
  return readByte();
}

// 指定した変数IDの値を unsinged int で返す
// もし指定した変数IDの値が、符号付き整数(singed int)の場合は、
// この関数の返値をintとして型をキャストしてください。
// 具体的には (int)getVariable(TARGET_SPEED)
unsigned int getVariable(unsigned char variableID)
{
  smcSerial.write(0xA1);
  smcSerial.write(variableID);
  return readByte() + 256 * readByte();
}

void setup()
{
  Serial.begin(115200);    // デバッグ用 (optional)
  smcSerial.begin(19200);

  // Arduino起動時にSMCを一時的にリセット (optional)
  pinMode(resetPin, OUTPUT);
  digitalWrite(resetPin, LOW);  // reset SMC
  delay(1);  // wait 1 ms
  pinMode(resetPin, INPUT);  // let SMC run again

  // リセット後に送信するとき、1ms以上待機する必要があります。
  delay(5);

  // SMC ERRピンの状態を読出し (optional)
  pinMode(errPin, INPUT);

  smcSerial.write(0xAA);  // ボーレート自動検出用バイト送信
  setMotorLimit(FORWARD_ACCELERATION, 4);
  setMotorLimit(REVERSE_ACCELERATION, 10);
  setMotorLimit(DECELERATION, 20);

  // セーフスタートエラーをクリアし、モータを動作開始状態にする
  exitSafeStart();
}

void loop()
{
  setMotorSpeed(3200);  // 正回転 全速
  // 符号付きの変数はintへキャストします:
  Serial.println((int)getVariable(TARGET_SPEED));
  delay(1000);
  setMotorSpeed(-3200);  // 正回転 全速
  Serial.println((int)getVariable(TARGET_SPEED));
  delay(1000);

  // シリアルモニタに入力電圧(mV)を送信
  Serial.print("VIN = ");
  Serial.print(getVariable(INPUT_VOLTAGE));
  Serial.println(" mV");

  // エラーによりモータが停止している時は、
  // エラーステータス変数を読込み、モータの再始動をトライする。
  if (digitalRead(errPin) == HIGH)
  {
    Serial.print("Error Status: 0x");
    Serial.println(getVariable(ERROR_STATUS), HEX);
    // 全てのエラーが解除されると、モータが再び動作します。
    exitSafeStart();
  }
}

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