リモートルンバを作ろう【ハードウェア編】

#はじめに

　皆さんはルンバは制御できるという事をご存じでしたか？ルンバには標準でシリアルポートが搭載されており、そのポートを使用すれば任意にプログラムしたとおりにルンバを動かすことができるそうです（大分昔から有名な話だそうで）。

　私も最近ルンバを手に入れ、せっかくなので色々遊んでみることにしました。最後までお付き合いいただけると幸いです。

#目標

　本記事ではルンバをリモートで操作することを目標にしています。【ハードウェア編】と【ソフトウェア編】で記事は分かれており、今回はルンバを制御する前の下準備についてまとめたものとなります。
　某ウイルスの影響で帰れない実家等でも、ルンバがあれば気軽にリモートで帰省とかできちゃうかも。

![IMG_20200909_112758.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/290a1487-16db-1ecd-fa20-9b43d36e3292.jpeg)


#使用機器

####1.Roomba
　制御可能なルンバには限りがあります。基本的には**500、600、700、800シリーズ**までしかシリアルポートはないそうです。しかし900シリーズにはシリアルポートの代わりにmicroUSBが搭載されているようです。ところで上記のルンバは多少古いシリーズなので、最近ではヤフオク等で非常に安く手に入れることが可能です。もしお持ちでない方はこれを機に一台入手してみてはいかがでしょうか？

[【iRobot Roomba770】ジャンクエッセイ](https://furuya-base.net/home/2020/09/09/%e3%80%90irobot-roomba770%e3%80%91%e3%82%b8%e3%83%a3%e3%83%b3%e3%82%af%e3%82%a8%e3%83%83%e3%82%bb%e3%82%a43/)
↑ みたいな感じでジャンク品でも手入れすると結構使えますよ。

####2.Raspberry Pi
　ラズベリーパイは制御するのに使用します。GPIOがあれば基本的にはどのタイプでも大丈夫ですが、リモートで操作したい場合には**3**がお勧めです。3 Model B+や4といった上位機種は電力消費がこれよりも増加するため、モバイルバッテリーで駆動しなくなる可能性が非常に高いというのが理由です。
　
####3.モバイルバッテリー
　ラズパイ駆動用です。USB Type-Aで**2.4[A]**以上の供給力がある必要があります。

####4.Webカメラ
　リモートで操作する際に映像も見たいので使用します。USB接続であればなんでも大丈夫だと思います。オートフォーカス機能とかあると便利かも。

####5.ルンバとラズパイの接続ケーブル
　ルンバとラズパイを接続する際に使用します。が、基本的にこのケーブルは売っていないので**自作**する必要があります。ので、下記に作り方を記載しておきました。外見に特にこだわりのない方はオス-メスのジャンパーワイヤーでも大丈夫です。

#製作

###1.接続ケーブル製作
![IMG_20200902_191534.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/4e257d65-7515-e155-8c2b-ca5b00013902.jpeg)
　はじめにケーブルを作っていきます。Mini-DIN7Pinのオスのコネクターを用意します。秋葉原では千石通商の2Fとかで150円くらいで入手できます。
![0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/699579e6-b445-a0a4-2d07-fe7c6ee01d86.png)
iRobotが公式にだしているルンバの仕様書によると、シリアルの送受信には3,4番ピンが使用されるそうです。また、シリアル通信の信号レベルが0-5[V]と記載されているため**RS232Cの信号レベルではなく、TTLレベルでの通信が必要**のようです。ですのでレベル変換機がないとコンピュータから直接制御することはできません。そこで今回はラズパイのGPIOとルンバを接続して通信させることにします。
![0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/1ea42d8d-0dff-a1de-7080-33304869e607.png)
具体的にはこの図のように配線します。**お互いのTXとRXが接続するように配線**してくださいね。TX-TXやRX-RXでは通信できないので注意してください。
![IMG_20200907_144646.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/fb85e895-173c-997f-b5ab-cbabbe519937.jpeg)
　余談ですがケーブルにはダイソー製300円スピーカーの3.5φステレオミニプラグケーブルが太さ長さ共に最適でお勧めです。(ただしスピーカーは使えなくなりますけど)
![IMG_20200902_205823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/bc832522-d566-e3ad-a7f0-5d5977cc33c4.jpeg)

同じくダイソー商品の収縮チューブを使用すると見栄えもきれい製作にできるのでこれまたお勧めです。

###2.ラズパイセットアップ
　ラズパイを設定していきます。OSはRaspberry Pi OSが無難でよいと思います。
####2-1.WiFiに接続
ラズパイを任意のWiFiに接続します。この場合はGUIからでもなんでも設定できればOKです。ですが後々ホストコンピューターからアクセスしたいので、固定IPをつけることをお勧めします。

[Raspberry Pi 3 (Raspbian Jessie)の無線LANに固定IPアドレスを設定する](https://qiita.com/momotaro98/items/fa94c0ed6e9e727fe15e)
↑こちらの方の説明がわかりやすく参考になると思います。
####2-2.SSH有効化
その後コマンドラインによる制御を行っていきたいのでSSHを有効にします。

[Raspberry Pi3のLAN外からのSSH接続設定方法](https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20)
↑こちらの方の説明がわかりやすく参考になると思います。この場合だとまさしくローカルエリア外から接続する方法を詳しく説明なさっているので、リモートで制御するという意味では最適です。しかしはじめは動作だけ確認して楽しみたいという方はSSHのみ有効にしていただければOKです。

####2-3.ホストコンピュータからの接続
ターミナルはラズパイに接続できればなんでもOKです。当方ではTera Termを使用しております。任意のIPアドレスにユーザー名とパスワードを打ち込み接続できたらとりあえずアップデートしておきましょう。

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
```

####2-4.UARTの有効化
ラズパイはデフォルトでシリアル通信が無効化されているので有効化する必要があります。

[Raspberry PiでUARTの有効化＋シリアル通信](https://qiita.com/s_fujii/items/466d455ca19fb4c20744)
↑こちらの方の説明がわかりやすく参考になると思います。

###3.ケーブルの導通確認
　とりあえずここまで来たら気になるのは正しくケーブルが製作できているかです。そこで実際に信号を送ってみてセルフで受信してみましょう。上手く導通していれば正しく受信できるはずです。

```
$pip3 install PySerial
```
python3にpipで上記のライブラリを追加してください。

```test_serial.py
import serial

def main():

    #'/dev/serial0'
    #'/dev/ttyAMA0'

    port = '/dev/ttyAMA0'
    ser = serial.Serial('COM3', 115200, timeout=0.1)

    while True:

        tx = bytes([128])
        ser.write(tx)
        print("tx:", tx)

        rx = ser.readline()
        print("rx: ", rx)

if __name__ == '__main__':
    main()
```
　使用言語はPython3.7です。これをラズパイ上で実行してMini-DINの3番ピンと4番ピンをクリップか何かでショートさせてください。上手くいけばショートしている間だけ`rx:b'\x80'`という値を受信しているはずです。

　値が`rx:b''`となっている方はどこかで断線している可能性が高いです。`could not open port '/dev/ttyAMA0'`となった方はUARTの有効化に失敗している可能性があるのでそちらをご確認ください。

　またラズパイでPythonを実行する際にデフォルトで2.7が呼び出されるようになっていますので、**必ずPython3で実行するようにお願いいたします。**(Python2には`bytes`という関数がないはずなのでエラーになると思われます。)

###4.より快適に使用するために
　ここからは余談です。ルンバを制御する際に各機器をルンバの上に置くとごちゃごちゃするし見栄えもあまりよくありません。そこでわたしはこんな感じにしてますよっていう紹介です。
![IMG_20200903_161813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/721f7926-4118-9f5d-98e7-9c987b626a5c.jpeg)
こちらはダイソーに売っていた三脚と結束バンド。使用したWebカメラには三脚固定用のネジ穴があり、安価で丁度良いと思ってこの三脚を使用しました。カメラの画角も調整しやすいため、今後画像処理等のシステムを追加する際には最適です。また各機器はすべてこの三脚に固定しており、普通にルンバを使用する際は三脚をどけるだけでよいという構造になっております。
![IMG_20200908_144109.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629378/347c9aec-dd05-da7c-a92e-6dbf6cf2ca19.jpeg)
ラズパイそのものは付属のケースにあった固定用の穴を用いて、適当なサイズと厚さのプラバンに穴をあけ結束バンドで三脚に固定しました。モバイルバッテリーなどの取り外しを頻繁に行う機器には、マジックテープを貼り付け使用しています。

#次回
　ここまで完了すればひとまずハードウェアのセットアップは完了です。しかしこれではルンバは動作しないので、次回、[リモートルンバを作ろう【ソフトウェア編】](https://qiita.com/Yurix/items/234f7775a1f9d3ad43af)にて基本的なルンバ制御とカメラを用いたリモートシステムを構築していきたいと思います。

#参考文献
1.[iRobot Roomba 500 Open Interface (OI) Specification](https://www.irobot.lv/uploaded_files/File/iRobot_Roomba_500_Open_Interface_Spec.pdf)
2.[Raspberry Pi 3 (Raspbian Jessie)の無線LANに固定IPアドレスを設定する](https://qiita.com/momotaro98/items/fa94c0ed6e9e727fe15e)
3.[Raspberry PiでUARTの有効化＋シリアル通信](https://qiita.com/s_fujii/items/466d455ca19fb4c20744)