ロボットアーム付き移動ロボットRomiを動かす①（HelloWorld）

## はじめに

この記事ではPololu Romiのシャーシキットとロボットアームを動かすことを試みていきます。
5年以上前にPololu Romiのシャーシキットとロボットアームキットを買ったのですが、ずっと押入れで熟成させていたので供養🙏も兼ねて記事にしていきたいと思います。
幸い（？）にも日本語での解説記事があまり見つからないようなので、パイオニアとして頑張っていきます。

## Pololu Romiとは？
[![](https://img.youtube.com/vi/5Mrd0w9fmKo/0.jpg)](https://www.youtube.com/watch?v=5Mrd0w9fmKo)
公式：https://www.pololu.com/category/202/romi-chassis-and-accessories
[Pololu社](https://www.pololu.com/)が販売している動画の様な組み立て式のロボットアームが取り付けられる2輪モバイルロボットです。
Pololu社自体は2000年にMITの学生達が立ち上げたベンチャーで、現在はアメリカのネバダ州ラスベガスに本社があります。
↑の公式を見ると、Romiに似た面白そうなロボットがいっぱいありますね。ちなみにPololuはハワイ島北岸にあるポロル渓谷にちなんで名づけられたそうです。

今回は以下のセットを買いました。
SwitchScienseさんから買うことができます。

- [Romiシャーシキット](https://www.switch-science.com/catalog/2970/): 4,279円
- [Romiロボットアームキット](https://www.switch-science.com/catalog/4060/): 11,429円
- [Romi用エンコーダ](https://www.switch-science.com/catalog/2971/): 1,639円
- [Romi用32U4搭載制御基板](https://www.switch-science.com/catalog/3169/): 11,539円

また、基盤への書き込みはデータ通信可能なmicroUSB-USBケーブルが必要になります（付属していない！）。
※充電器等に付属しているケーブルはデータ通信不可能だったりするので、気をつけて下さい。

- [microUSB-USBケーブル](https://www.amazon.co.jp/dp/B019Q3T7YG/ref=cm_sw_r_tw_dp_93B3C5HYZZSBYGY1WT2K)


全部揃えると**3万円**くらいしますね…供養と言わずちゃんと活用していこうと思います。

### 詳細スペック

Romiというか、セット込み込みのスペックになりますが、

- ATmega 32U4ベースなのでArduino Leonardoと同じように扱える
- 2つのモータードライバ
- 電源回路
- 6軸慣性センサ
- 3つのボタン
- 2自由度のロボットアーム
- Raspberry Piも搭載可能

一式買えばすぐにプログラミングすることができ、とりあえずロボット始めてみたい人の導入として非常に良いと思います。
ただ、動画の様にボールを認識するには別のセンサを取り付ける必要がありそうですね…🤔

## 環境構築

### 組み立て

組み立ては以下のページを参考にしてください。

- [シャーシキットの組み立て](https://www.pololu.com/docs/0J68/all#4)
- [ロボットアームの組み立て](https://www.pololu.com/docs/0J76/3)

公式通り進めていくと基盤をシャーシに載っけて、ロボットアームも載っけるところまでやってしまっていますが、配線の接続等ありますので**シャーシとロボットアームは一旦分離させた状態がおすすめです**。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/458ddefa-7f24-5c21-d438-731fb5fb5e30.jpeg" width="600">


### PC環境セットアップ

基盤の公式セットアップは[こちら](https://www.pololu.com/docs/0J69)です。

#### ドライバインストール

提供されているドライバがWindowsのみなので、Windowsの環境でやっていきます。
[5.1. Installing Windows drivers](https://www.pololu.com/docs/0J69/5.1)のリンク先からドライバのzipファイルをダウンロードします。
zipファイルを解凍し、`a-star.inf`というファイルを右クリックして、「インストール」を押します。
インストールが完了すると、デバイスマネージャのポートに「Pololu A-Star 32U4」が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/d36c7e3b-067b-9e6c-e50d-87625d6d1c45.png)

#### プログラム環境

公式ではArduino IDEを使っていますが、この記事ではVSCodeのPlatformIOでやっていきます。
参考：[マイコン開発するならPlatformIOがめちゃくちゃいいぞ](https://qiita.com/JotaroS/items/1930f156aab953194c9a)
PlatformIOは拡張機能から「PlatformIO」と調べるとインストールすることができます。
インストール完了後、PIO Homeから「New Project」で、Nameは適当に、Boardに「Pololu A-Star 32U4」と入力すると候補が出てくると思います。
New Project押下後は以下の画像の様になると思います。Finishでプロジェクトを作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/b939e133-05f4-43fe-2204-55513278db0f.png)

プロジェクトの作成が完了すると、以下の構成になると思います。

```bash
MyFirstRobot
├─.pio
│  └─build
│      └─a-star32U4
│          ├─FrameworkArduino
│          └─src
├─.vscode
├─include
├─lib
├─src
└─test
```

プログラムは`src`フォルダの`main.cpp`に書いていきます。

## Hello World

電子工作のHello WorldといえばLチカですね。公式の通りLチカさせていきましょう。

```c:main.cpp
#include <Arduino.h>

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}
```

基盤搭載のLEDをチカチカさせるコードになります。
コードが書き終わったら、Buildして確認し、Uploadして基盤に書き込みましょう。
VSCodeの左下に以下のアイコン群があると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/fbebed18-c406-cd97-f986-924c3a0ce613.png)
✅がBuildで、プログラムが動くかどうか事前に確認することができます。エラーが出たら直してください。
「→」がUploadになります。こちらを押すと基盤への書き込みが始まります。

書き込みが終わると以下のようにMicro USB接続口から見て左の車輪部分でLチカしていると思います。
![Lchika.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/9bff3215-496f-059f-09a6-9afff40be094.gif)

コード内の`delay`はmsオーダーなので、中の数値を小さくすればより速く、大きくすればより遅くLチカします。

## モーターを動かす

参考：[romi-32u4-arduino-library（サンプル：MotorTest）](https://github.com/pololu/romi-32u4-arduino-library/tree/master/examples/MotorTest)

### ハードウェア側の準備

モーターを動かすにはシャーシ裏側の電池ボックスに単3電池6つセットする必要があります。
また、以下の画像の赤丸箇所がちゃんと基盤と接触するようにラジオペンチ等で折り曲げてください。
**※モータの方は簡単にちぎれるので気をつけてください**
はんだ付けするのもワンチャンありですが、いつ取り外したくなるかわからないので一旦折り曲げが良さそうです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/761f1d37-d359-5a47-0ad6-043caa7da454.jpeg" width="400">
Romi用エンコーダとモータ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/c16b0d79-f60b-98d4-aa10-1936400ffa11.jpeg" width="800">
基盤と電池ボックス

ちゃんと接触しているとUSB接続口側を下に見て左下のトグルスイッチをONにすると、トグルスイッチ横のLEDが青色に光ります（結構接触がシビア…）。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/aa05140d-dbff-aa99-27d3-f8fc26b59575.jpeg" width="800">


### ライブラリのインストール

PlatformIOで以下のGIFを参考にHome画面から`Romi32U4`のライブラリをプロジェクトへインストールしてください。
![romi_library2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271414/86d5c4e5-7dda-3857-be2a-bf8ca4c7b6a2.gif)

### プログラムを書く

ライブラリインストール直後、たまにライブラリ（`Romi32U4.h`）が読み込まれないときがあるので、その場合はVSCodeを一度再起動してください。
**※以下のプログラムをUploadする前に、Romiの車輪を浮かせた状態で机、もしくは床に置いて下さい。
急に動き出して机から落ちて壊れるなんて多々あるので…**

```c:main.cpp
#include <Arduino.h>
#include <Romi32U4.h>

Romi32U4Motors motors;
Romi32U4ButtonA buttonA;

void setup() {
  // Wait for the user to press button A.
  buttonA.waitForButton();

  // Delay so that the robot does not move away while the user is
  // still touching it.
  delay(1000);
}

void loop() {
  // Run left motor forward.
  ledYellow(1);
  for (int speed = 0; speed <= 400; speed++)
  {
    motors.setLeftSpeed(speed);
    delay(2);
  }
  for (int speed = 400; speed >= 0; speed--)
  {
    motors.setLeftSpeed(speed);
    delay(2);
  }

  // Run left motor backward.
  ledYellow(0);
  for (int speed = 0; speed >= -400; speed--)
  {
    motors.setLeftSpeed(speed);
    delay(2);
  }
  for (int speed = -400; speed <= 0; speed++)
  {
    motors.setLeftSpeed(speed);
    delay(2);
  }

  // Run right motor forward.
  ledYellow(1);
  for (int speed = 0; speed <= 400; speed++)
  {
    motors.setRightSpeed(speed);
    delay(2);
  }
  for (int speed = 400; speed >= 0; speed--)
  {
    motors.setRightSpeed(speed);
    delay(2);
  }

  // Run right motor backward.
  ledYellow(0);
  for (int speed = 0; speed >= -400; speed--)
  {
    motors.setRightSpeed(speed);
    delay(2);
  }
  for (int speed = -400; speed <= 0; speed++)
  {
    motors.setRightSpeed(speed);
    delay(2);
  }

  delay(500);
}
```

Upload完了後、USB接続口の左に小さいボタン（ボタンA）があるのでこのボタンを押すと
左車輪が回転（前方向）→左車輪が回転（後ろ方向）→右車輪が回転（前方向）→右車輪が回転（後ろ方向）
します。
プログラムとしては非常に簡単で、`setup()`内でボタンAが押されるまで待機状態に入り、ボタン押下後、
`motors.setLeftSpeed(speed)`で徐々に左車輪スピードを上げて前方向に進み、徐々に落とす、といった内容になっています。
前方向であれば正の値、後ろ方向であれば負の値を与えればいいだけで非常に簡単ですね。
これでRomiを走らせられるようになりました。
ちなみに単3電池によって電源が供給されているので、一度プログラムUpload後であればUSBケーブルを抜いてもプログラム通り走らせることができます。

[次の記事](https://qiita.com/bigface00/items/fed94a2a51fc344b28db)ではエンコーダとロボットアームについて見ていこうと思います。