Arduino
Balboa
32U4

Arduinoで倒立振り子ロボットBalboa 32U4を制御する(1)

はじめに

 PololuのArduino互換のロボットBalboa 32U4を動かすまでの記録です。Arduinoは初めてでいろいろ分からなかったので、その手順です。

準備・工作

 スイッチサイエンスから購入しました。

 https://www.switch-science.com/catalog/3243/

 キット以外にもPololuのモーター2つ、タイヤ2つが最低限必要です。

 Pololuからのドキュメントはこちら。

 https://www.pololu.com/docs/0J70

 組み立て方はドキュメントの4. Assembling the Balboa 32U4 kitからです。少し難く、5-6時間ぐらいかかりました。
 注意点としては、モーターの極性を指示通りにつけること、アウトプットシャフトをボールベアリングに差し込むところがめちゃくちゃ固いこと、細かい部品(4極の磁気ディスクやネジなど)をなくしやすいことです。

動かす

 完成後、サンプルプログラムを書き込むとすぐ立ちます。次のようにします。

 Arduino IDEをインストールします。手順は省略(1)。

 次にWindowsの場合、ドライバをインストールします。手順は以下のページにあります。

 https://www.pololu.com/docs/0J70/5.1

 次にArduino IDEにサンプル、ライブラリをインストールします。Preferencesの追加ライブラリの欄に以下を追記します。

 https://files.pololu.com/arduino/package_pololu_index.json

 Arduino IDEのツールの下にボードとしてPololu A-Star 32U4が追加されるはずです。
 BalboaをUSBケーブルで接続します。
 ファイル→スケッチの例→Balboa32U4→Balancerを開きます。
 書き込みボタン(ツールバーの右矢印のアイコン)をクリックすれば、プログラムが書き込まれます。
 USBケーブルを外します。
 ロボットを床に立たせて手で支えます。
 モーターの下の4つのプッシュボタンのうち、一番左(小さい字でPOWERと書かれています)を押します。
 手を離すと、前後に行ったり来たりしながら、立ちます。完成!!

スケッチを書く

 さて、Arduinoの勉強もかねて、手製のスケッチを動かしてみます。加速度センサーとジャイロの値を読み出すことを目標にします。
 結果として、以下のスケッチになりました。

test_balboa
#include <Wire.h>
#include <Balboa32U4.h>
#include <LSM6.h>

LSM6 imu;

static void error_end(char *msg) {
  Serial.println(msg);
  while(true) {
    ledRed(1);
    delay(1000);
    ledRed(0);
    delay(1000);
  }
}

static void print_vector(LSM6::vector<int16_t> &vector) {
  Serial.print("(");
  Serial.print(vector.x);
  Serial.print(",");
  Serial.print(vector.y);
  Serial.print(",");
  Serial.print(vector.z);
  Serial.print(")");
}

void setup() {
  Serial.begin(9600);
  Serial.println("test_gyro");
  Wire.begin();

  if(imu.init() == false) {
    error_end("LSM6 not found.");
  }
  imu.enableDefault();
  ledYellow(1);
}

void loop() {
  imu.read();

  Serial.print("Acc:");
  print_vector(imu.a);

  Serial.print(" Gyro:");
  print_vector(imu.g);
  Serial.println();

  ledGreen(1);
  delay(100);
  ledGreen(0);
  delay(100);
}

 書き込んで動かすと、シリアルモニターに加速度、ジャイロの数値がリアルタイムにずらずら書き出されます。

 初めてですので一つ一つ調べました。
 <Wire.h>はi2c通信、<Balboa32U4.h>はBalboaのモーター、LEDなどの制御のクラス、<LSM6.h>は加速度・ジャイロセンサーLSM6DS33の制御のクラスが入っています。

LSM6 imu;

 これで加速度・ジャイロセンサーの制御インスタンスimuが生成されます。

static void error_end(char *msg)

 デバッグ用の関数です。メッセージをシリアルコンソールに出力し、赤のLEDを点滅させて、永久ループします。

Serial.println(msg);

 スケッチをビルドすると、Arduino標準ライブラリのどこかでSerialというインスタンスが作られるようです。Arduinoリファレンスにドキュメントがあります。

ledRed(1);

 Balboa32U4.h, Balboa32U4.cppに定義されているLEDのインスタンスです。

delay(1000);

 これもArduino標準ライブラリで使えるようです。ミリ秒待機します。

static void print_vector(LSM6::vector<int16_t> &vector)

 vectorがLSM6.hに定義されています。vector.{xyz}でアクセスします。

void setup()

 リセット後最初に一回呼び出される関数です。

Serial.begin(9600);

 Serialを通信速度9600bpsで通信するように初期化します。

Wire.begin();

 LSM6を使用する前に、このように必ずi2cを初期化する必要があります。

imu.init()

 LSM6DS33を初期化します。LSM.cppによると、LSM6DS33はi2cバスの0xd3と0xd2にレジスタがあるようです。

imu.enableDefault();

 LSM6DS33のモードは、加速度について±2 gと±16 gの2つの範囲、ジャイロについて±125°/sと±2000°/sの2つの範囲に設定できる(リンク)ようですが、それぞれフルスケールで±2 g、245°/sに設定するようです。フルスケールはint16_tの範囲のようです。

 プログラムにバグはつきもの。上のスケッチでWire.begin()を忘れたばかりに暴走して文鎮化しました。復旧手順ですが、ドキュメントに従います。

 Balboaのボードの右上にリセットボタンがあります。これを2回押すとファームウエアが10秒ほど待機状態になります。この10秒の間に正常なスケッチを書き込みます。実際には10秒の間に(a)Arduino IDEの起動、(b)スケッチを開く、(c)コンパイル、(d)書き込みは間に合わないのですが、(a)の前にリセット2回、(d)の直前にもう一度リセット2回、押します。タイミングが難しいですが、慣れるしかありません。

あとがき

 このキットを通じて、メカの制御の勉強、AVR(8ビットCPUです)のアーキテクチャの勉強に足を突っ込みたいと思います。
 AVRはRaspberry Piやmbedに比べて消費電力がきわめて小さいので、ガジェットを作るのに良さそうです。

(1) 私は古いiMacを使っているので、最新のArduino IDE(1.8.5のようです)はインストールできませんでした。ので古いものをインストール。ついでにコマンドラインでもコンパイルできるように環境を整えました。Mac OS 10.7.5です。
 Arduino IDE 1.0.5を探してきてインストールしました。

 https://www.arduino.cc/en/Main/OldSoftwareReleases#previous

 Balboa 32U4のライブラリは~/Documents/Arduino/librariesにコピーしました。次からBalboa32U4、LSM6、LIS3MDLのアーカイブをとってきて展開しました。

 https://www.pololu.com/docs/0J70/6

 Balboa 32U4はArduino Leonardと互換なので、スケッチの描き込みはArduino Leonardで行います。普通はArduino UNOでCPUはATmega328Pなのですが、Arduino LeonardはATmega32u4のようです。これらの比較は次のページにあります。

 http://www.microchip.com/paramChartSearch/chart.aspx?branchID=30047

 ATmega328PはROM 32KB, SRAM 2KB, EEPROM 1 KBで、ATmega32u4はROM 32KB, SRAM 2.56 KB, EEPROM 1KBです。

 コマンドラインのツールはCrossPackというものを使いました。

 https://www.obdev.at/products/crosspack/index.html

 /usr/local/CrossPack-AVRにインストールされます。~/.bashrcで/usr/local/CrossPack-AVR/binにパスを通しておきます。