Raspberry Pi 2とタミヤの1/10RCでインターネットラジコンを作ってみた

#インターネットラジコンを作ろう！
！！！個人的な備忘録です！！！
私は**Raspberry Piや電気工作に関して、ほとんど素人**です。所々正しくない記述があるかもしれません。適宜直しますのでどんどんご指摘ください。
![15_秋_wip.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/94774/796e89e3-8c74-ae5c-0754-dc6262f5074b.jpeg)



##今回作ったもの
JavaScript (Node.js)、スマートフォンのモーションセンサーで制御できるラジコンカーを作ります。今回はスマートフォンから操作出来ることを目標にします。
ソースコードは[GitHubで公開しています](https://github.com/yas-nyan/Internet-RC)。
**追記**:
[新しく書き直したバージョン](https://github.com/yas-nyan/inetRC)

###仕様
* Raspberry Pi 2 B  rasbian 4.1~
* Servoblaster 2015年10月更新版
* Node.js v0.10.28
* npm 3.3.12
* Socket.io 1.4.5
* Express 4.13.4
* Keypress 0.2.1

![構成図.jpeg](https://qiita-image-store.s3.amazonaws.com/0/94774/c23d7f66-77dc-e22e-1840-d79d1ea65d0a.jpeg)


## 一般的なラジコンの構成図
![スクリーンショット 2016-01-31 3.12.14.png](https://qiita-image-store.s3.amazonaws.com/0/94774/50367cb4-27df-46f8-5ce7-483764dc28d2.png)
こちらが一般的なラジコンの主要部分の構成図です。今回利用したTAMIYAのRCはもちろんのこと、だいたいの競技用ラジコンカーが共通してこのような構成です。

- 送信機
    - いわゆるプロポ。リモコンです。
- 受信機 
    - プロポから受け取ったFMなりWi-Fiなりの電波を、PWM信号という電気信号にして各部に送信します。
- ESC 
    - スピードコントローラーとも呼ばれる部分です。受信機からの信号を基にモーターに掛かる電圧を変えて回転数を制御しているそうです。バッテリーはここに接続されます。
- サーボ 
    - 受信機からの信号を受け取りステアリングを動かすモーター部分です。
- バッテリー 
    - 図には載っていませんが、クルマが走るためには勿論バッテリーが必要です。TAMIYAのノーマルは7.2v 1000mAh。


##今回の構成
![スクリーンショット 2016-01-31 3.11.21.png](https://qiita-image-store.s3.amazonaws.com/0/94774/c77c5eba-b10b-cf92-9f22-6e9105a5536c.png)
続いてこちらが今回の構成図。上の図と比べればどこがどの役割を果たすかが分かりやすいですねぇ。

* Raspberry Pi 
    * 言わずと知れたIoTの申し子。今回はRaspberry Pi 2を使用しました。
* パソコン・スマホ 
    * 環境を構築したり、ラジコンを制御するのに使用します。一部のスマホではモーションセンサーが動かない可能性があります。
* Raspberry Pi 
    * 言わずと知れたIoTの申し子。今回はRaspberry Pi 2を使用しました。

#準備編
##1.必要なもの。
インターネットラジコンでIoTの恩恵を享受するためにはそれなりに投資が必要です。
###ラジコン
今回はTAMIYAのXBシリーズを使用しました。
[XBシリーズ No.148 スバル BRZ]
(http://www.amazon.co.jp/dp/B00A7ITIQC)
大体同じ要領でできると思うので車種はお好みでどうぞ。シャシーの種類によってはRaspberry Piの収まりが悪いかも。
####Raspberry Pi 2 
http://www.amazon.co.jp/dp/B00TBKFAI2
OSをインストールするためにはSDカードも必要です。
ちなみにRaspberry Pi 1だと電圧不足などに陥る可能性があり。
####USB Wi-fiモジュール
http://www.amazon.co.jp/dp/B002G9URGA
Raspberry Piを無線に接続するために使用します。今回はバッファローのアダプターを使いましたが、適宜手に入った物を使って下さい。
####ジャンパーワイヤー
http://www.amazon.co.jp/dp/B00P9BVKOK
配線用のケーブルです。オスメス,オスオス,メスメスが全部あるとすごく便利になるはず。
####モバイルバッテリー
http://www.amazon.co.jp/dp/B0071SYNAM
車載したRaspberry Pi用のバッテリー。ラジコンに積める物なら何でもOK。
 
####USBケーブルなど
Raspberry Piをモバイルバッテリーに接続する際に使用します。適宜用意。

##2.環境構築をしよう！
インターネットラジコンを作り始める前に基本的な環境構築をしましょう。わかる方は読み飛ばしちゃって下さいな。

###SSHクライアントのインストール
Windowsの方はSSHクライアントをインストールする必要があります。
　 [Tera Term](https://osdn.jp/projects/ttssh2/)などを適宜用意して使ってください。
###Raspberry Piの初期設定
Raspberry PiにOSをインストールし、無線接続・SSH出来る環境を整える必要があります。
デフォルトOSのRasbian,バージョンは4.1以降で大丈夫です。
 [Raspberry Pi 2 設定メモ 01 （導入編)](http://qiita.com/baba163/items/bc7225312f001fb703a0)
[raspberry pi2 で 無線 LAN 設定まで](http://qiita.com/hotchpotch/items/dfcb9bd02baf67223eb0)
適当にお好きなリンクをどうぞ。こういう時Qiitaは便利ですね。固定IPを用意できるなら設定。
[Raspberry Piに固定IPを割り振る]
(http://ysdyt.github.io/blog/2015/06/28/raspi-wifi-static-ipaddress/)

#配線編
結構簡単です。自分は手探りでやったので時間がかかりましたが、やり方を理解すれば猫でも5分で出来ます。
###1.受信機から端子を引き抜く。
【画像】
左側がアクセル,右側がステアリングです。平型端子の爪を折り、白のケーブル2本と黒のケーブル1本(アースなのでどっちでもOK)を引きぬきましょう。
###2.配線をする。
　回路図って物がさっぱりわからないので、猫でもわかる絵にしてきました。
**アースが大事**です！！忘れると動きません。
![配線図.png](https://qiita-image-store.s3.amazonaws.com/0/94774/efd2ab8b-c879-021f-c437-a4cf40ac2811.png)
![gpoio.jpg](https://qiita-image-store.s3.amazonaws.com/0/94774/d2f148d7-d34a-ebc0-d5ed-fc82391a1e38.jpeg)
必要に応じてハンダゴテやキボシ配線などを使いましょう。


#実装編

##ServoBlasterのインストール
https://github.com/richardghirst/PiBits/tree/master/ServoBlaster
ServoBlasterは接続したサーボをターミナル上で操作できる超便利なライブラリです。これを発見するまでCでPWM信号を自力で生成してましたから楽になったものです。
Raspberry Piのカーネルのバージョンによってはソースコードの書き換えが必要でしたが、最新版で公式に対応したためそのまま実行するだけでサーボが回せるようになります。

githubから最新版をダウンロードしましょう。


```shell-session
:~/
git clone https://github.com/richardghirst/PiBits.git
```

余計なファイルがダウンロードされるので消しときます。内容は変わるかもしれないので適宜適当に。

ServoBlasterの実行ファイルがあるディレクトリに移動してMAKEします。そのまま管理者権限でインストール


```shell-session
:~/
cd ServoBlaster/user
make 
sudo make install
```

これでインストールは完了。今後は、makeしたディレクトリ下で


```shell-session
:ServoBlaster/user
sudo ./servod
```

を実行すればOKです。


動作テストをしてみましょう。
>$echo サーボ番号=周波数 > /dev/servoblaster


で接続したサーボを動かす事ができます。
RC用サーボの周波数は事前に受信機からオシロスコープで調べておきました。

![glaf2.png](https://qiita-image-store.s3.amazonaws.com/0/94774/a1c5a573-d726-139f-bb56-88ef0573a246.png)


17.5msec周期で、1msec~2msecの範囲でアクセル全開↔バック全開,左一杯↔右一杯を制御しています。何も操作していない状態(ニュートラル状態)は1.5msecです。
Servoblasterでは1msecが100として扱います。



例えば左一杯に切るときは、


```shell-session
:~/
echo 1=100 > /dev/servoblaster
```

右に切りながらちょっとだけバック


```shell-session
:~/
echo 1=170 > /dev/servoblaster
echo 2=160 > /dev/servoblaster
```

というように数値を増減させることで速さを調整させることが出来ます。
閾値をまとめておきました。

前進:100~149
ニュートラル：150~158
バック:159~200
左:100~149
ニュートラル:150
バック:151~200

微妙にアクセル側のニュートラルが広いみたいです。ちなみに前進状態から直接バックに移行することはブレーキ機能が作動するため出来ません。一度ニュートラルを経由させてあげましょう。








##操作プログラムをダウンロードする
と、いうわけでここまで自由にラジコンをRaspberry Piから操作できるわけです。
自分は通信機能を拡充させることを見越してnode.jsで操縦プログラムを作ってみました。
githubにコードをあげていますのでクローンしてきて下さい。

```zsh
$ git clone https://github.com/yas-nyan/Internet-RC.git
```

##node.jsのインストール
node.jsでファイルが構成されているためnodejsのインストールが必要です。
このページが参考になりました。
http://usicolog.nomaki.jp/engineering/raspberryPi/raspberryPi2_Nodejs.html

##npm moduleのインストール
npmとはnodeの拡張機能群です。ラジコンに必要な拡張機能をインストールしましょう。
package.jsonというファイルに必要なモノは全て記述されてあるので、ワンコマンドでmoduleをインストールできます。


```shell-session
:~/Internet-RC
npm install
```


##hostの宣言
nodejsでサーバーを立ててそこにブラウザからアクセスする形でラジコンを操作します。
サーバーのアドレスをプログラムに教えてあげる必要があります。host.jsをjsディレクトリ以下に作れば勝手に読んでくれます。
固定IPを用意出来ている方は固定IPを、ローカルネットワークで操作する方はRaspberry PiのIPアドレスをhost.nameに書いちゃってください。

ちなみにIPアドレス調べ方。wlan0のinetで普通はOK。


```zsh
:~/
ip a
```




```shell-session
:~/Internet-RC/js
vim host.js
```

```js


:~/Internet-RC/js
var host ={
    name:"【ラズパイのIPアドレス】",//固定IPを用意出来ている方はそれを。
    port:"3000" //初期値は3000です。

}
```

##実行！走らせよう！
さあようやく実行です。



```shell-session
:~/Internet-RC/
node socket-rc.js
```


これでサーバーサイドは起動完了。
モーションセンサーによる操作機能が実装されてるのでスマートフォンから下記のアドレスにアクセスしましょう。

>http://【Raspberry PiのIPアドレス】:3000/


#今後の展望
携帯回線を積みたいんだなぁ...＼(^o^)／

# 追記
携帯回線を積んで動かしてみました。
いつか詳しく記述します。