raspberry pi 3を使ってRAPIROを無線で動かしてみる

SRA Advent Calendar 12/17 の記事です

こんにちはhurusuです。
前回は、Arduinoの電子工作のお勉強の記事を書きました。
今回は、自前で購入したロボットのRAPIROを、Raspberry Pi3 を使って無線で動かしてみます。

そもそもRAPIROってなにさ
-
こんなかわいらしいホビーロボットです。
会社の先輩からは百式に似てるねって言われましたが、確かに金色メッキにしたら百式に似てそう。
![IMG_2608.JPG](https://qiita-image-store.s3.amazonaws.com/0/149669/1583049c-c1e6-70a8-b1dc-dbc6548ff165.jpeg)


二足歩行ロボットの割りに安くで買えるし、色々拡張がききますのでホビーロボットとして優秀です。箱をあけると部品がたくさん入っていますが、ミニ四駆作る気分で2，3時間で組み立てられます。公式サイトはこちらをご覧ください。
http://www.rapiro.com/ja/

ちなみにRAPIROは日本人の石渡さんって方が作った人型ロボットでして、
日本人発進では初めてKickstarterでのファンドが成立したロボットらしいです。
しかも2日で目標金額達成という快挙らしいですよ！

RAPIROに入ってるのはArduino互換マイコンでして、
開発はArduinoIDEを使ってスケッチしますが、今回は最初から入ってるスケッチのままRAPIROを使います。
(デフォでシリアル通信で指令を送ってある程度動いてくれます)

今回は、Raspbery Pi3を使ってRAPIROを無線で動かして見ました。


購入したもの
-
・RAPIRO: 45000円くらい
・PanasonicのENELOOPの電池5本 
・Raspberry Pi3  ←pi3からWLANついてる
・MicroUSBケーブル (デバッグ用途)


RAPIROとラズパイを繋げてみる。
-
Rapiroを買うと、最初からPi3にシリアルで通信する用のケーブルが入っているので、
RapiroのArduinoとPi3をつなぎます。(RAPIROの配線はマニュアルのってます)

![IMG_2610.JPG](https://qiita-image-store.s3.amazonaws.com/0/149669/e5668eb6-3c9f-ae09-a601-6044af8b7f13.jpeg)

Pi側のピンは左から5Vピン,5vピン、GND, GPIO 14, GPIO 15, GPIO 18に挿すようです。

離れてみた図
-
![IMG_2609.JPG](https://qiita-image-store.s3.amazonaws.com/0/149669/d9f9f0ef-827d-1b4e-a9a8-d10bea5077f3.jpeg)

ちょっと言い訳させてください。
実は諸都合でPi3はタッチスクリーンと繋げていまして、
外すのが面倒臭かったのでタッチスクリーンにガムテープを巻いて首に乗っけました。
(かなり雑いですがご容赦を...)


Pi3をWLANのアクセスポイント化
-
無線で操作するにあたってPi3をアクセスポイントにします。
アクセスポイント化に関しては以下の記事を参考にさせて頂きました。
http://qiita.com/mt08/items/f2e4f9d3b1ed00849e23

SSIDは適当にRAPIRO_APとかにしました。

Pi3のシリアル通信を有効化する
-
Pi3のシリアル通信機能を有効化するにあたって以下の記事を参考にさせて頂きました。
http://qiita.com/yamamotomanabu/items/33b6cf0d450051d33d41


Pi3で動かすサーバープログラムソース
-
特別なことは何もせず単にソケットで受信したデータを中継して、シリアルポート(繋がってる先はRAPIROのArduino)に書き込んでるだけです。
Pythonでのサーバープログラムの書き方分からなかったので、下記のサイトから流用させてもらいました。
http://qiita.com/ponsuke/items/6a90ef8c2a76b3e236df


```py
import serial
import SocketServer
import time

HOST = '192.168.42.100'
PORT = 12345


class Handler(SocketServer.StreamRequestHandler):
        def handle(self):
                while True:
                        data = self.request.recv(1024)
                        print data
                        if len(data) == 0:
                                break
                        ser = serial.Serial('/dev/ttyAMA0',57600)
                        ser.write(data)
                        ser.close()
                        time.sleep(1)
                self.request.close()

server = SocketServer.TCPServer((HOST,PORT),Handler)
print 'listening', server.socket.getsockname()
server.serve_forever()
```

RAPIROの電源を入れる。
-
RAPIROの電源を入れると、RAPIRO内のArduino経由でPi3に電源が供給されて、
Pi3が起動します。LEDが点滅します。
![IMG_2609.JPG](http://i.imgur.com/lomuTOE.jpg)

Pi3のアクセスポイントに接続する
-
しばらくたつと、Pi3のDHCPサーバが立ち上がってきて、
アクセスポイントで見えるようになります。
今回Pi3には「RAPIRO_AP」という名前のSSIDとしましたのでそれに接続しました。
![アクセスポイント.png](http://i.imgur.com/Yb9rDbO.png)

アクセスポイントに繋がったらpyのサーバープログラムを立ち上げときます。

Teratermからソケット通信でサーバーに指令を送る
-
teratermは図のように設定していてコマンドを送ります。
![teraterm.PNG](https://qiita-image-store.s3.amazonaws.com/0/149669/c605c1fb-2d1b-5980-4d43-eae479482e34.png)

コマンドは以下のように規定されています。(目の色は今回確認できませんが)

| コマンド | 動作 | 目の色 |
|:-----------|------------:|:------------:|
| #M0       |        停止 |     青     |
| #M1       |        前進 |     青     |
| #M2       |        後退 |     青     |
|#M3|右に曲がる|青|
|#M4|左に曲がる|青|
|#M5|両手を振る|緑|
|#M6|右手を振る|黄|
|#M7|両手を握る|青|
|#M8|左手を振る|赤|
|#M9|右手を伸ばす|青|


とりあえず動いた
-
左手を振る
![IMG_2633.JPG](https://qiita-image-store.s3.amazonaws.com/0/149669/c036c174-66d9-020a-0458-d285fd2aaa8b.jpeg)

両手を振る
![IMG_2634.JPG](https://qiita-image-store.s3.amazonaws.com/0/149669/4256a247-0eef-2f94-182c-44d1af1034bf.jpeg)


最後に
-
今回はRAPIROとラズパイを使ってみました。
とりあえず動いてよかったです。
(ほんとはBluetooth通信での操作とかUIアプリ(Win,ios,android)から操作とか、Webから操作とか色々やりたいけど、この辺は時間かかるしWebの知識も全然ないのでやらなくていいや...)

ということで、今回はあまり勉強って感じではなかったですが、
こういうホビーもあるよっていう紹介でした。