Raspberry Pi Zero とジャイロ加速度センサーMPU-6050とUnityでIoTなゲームを作る

#作ったもの

### IoTクソゲー「うちわdeファイト」
[Maker Faire Tokyo 2018] (http://makezine.jp/event/mft2018/)出展作品


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">IoTクソゲー「うちわdeファイト」 <a href="https://t.co/wVBovLRKMH">pic.twitter.com/wVBovLRKMH</a></p>&mdash; たつや@9/29-30レッドハッカソン (@tatsuya1970) <a href="https://twitter.com/tatsuya1970/status/1041134620874399744?ref_src=twsrc%5Etfw">2018年9月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

うちわを仰いだ回数がパワーとしてパソコン画面の物体に伝わり、相撲のように落とし合いをするというというゲームです。
このビデオでは、勝者は逆ですねww




### 構成図


<img width="1273" alt="スクリーンショット 2018-09-16 11.33.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/291592/cb2abbb0-83c1-7674-728b-4a4d1536cea5.png">





<br>
[私の環境]
MacBook Pro (Retina, 13-inch, Early 2015)
macOS High Sierra
Python 2.7.10
Unity 2018.2.0f2



### 必要なもの
- [Raspberry Pi Zero WH](https://www.switch-science.com/catalog/3646/)
- [Raspberry Pi Zero ケース](https://www.switch-science.com/catalog/3196/)
- [ジャイロ加速度センサーMPU-6050](https://amzn.to/2MshW2B)
- [ジャンパワイヤ(メス～メス)](https://amzn.to/2OjZiLY)
- モバイルバッテリー ※うちわの柄にもピッタリ
- microBケーブル
- うちわ

<img width="501" alt="スクリーンショット 2018-09-16 11.49.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/291592/37f7bb69-2b02-b496-10b5-fe809c651af1.png">



#製作

### Raspberry Pi Zeroの初期設定

こちらのブログの通りにしました。
[Raspberry Pi ZeroにRaspbianをインストールする](https://www.g104robo.com/entry/install-raspbian-raspberry-pi-zero)



###センサーMPU-6050の初期設定

こちらのサイトのとおりにしました。
[Interfacing Raspberry Pi and MPU-6050](http://blog.bitify.co.uk/2013/11/interfacing-raspberry-pi-and-mpu-6050.html
)

###ターミナルからRaspberryPi接続方法

普通は

```
$ ssh pi@raspberrypi.local
```
で接続しますが、
今回は２つのRaspberry Piを同時に接続することもありますので、Raspberry PiのIPアドレスで接続します。

例えば、
うちわ１のRaspberry PiのIPアドレスを192.168.10.107
うちわ２のRaspberry PiのIPアドレスを192.168.10.108
と仮定しますと、

まず、うちわ１のRaspberry Piに接続します。

```
$ ssh pi@192.168.10.107 (IPアドレスは例）
```
次に「コントロール+T」 でターミナルウィンドウをもう１つ出現させ、
うちわ２のRaspberry Piに接続します。

```
$ ssh pi@192.168.10.108 (IPアドレスは例）
```
これで、うちわ１、うちわ２、２つのRaspberry Piに同時に接続できました。

なお、Raspberry PiのIPアドレスの確認方法は色々ありますが、Macなら[Lan Scan](https://itunes.apple.com/jp/app/lanscan/id472226235?mt=12&ign-itsct=472226235-472226235&ign-itscg=0177&ign-mpt=uo%3D4)というアプリを使うのが簡単です。



<br>

###プログラミング
センサー値を取得し、角度に変換するコードは、こちらのブログを参考にしました。
[Raspberry Pi 2でI2C (MPU-6050の制御) Python編-5 (傾き計算-3)](http://www.widesnow.com/entry/2015/10/15/003337)


Raspberry Piからサーバーに送るコードは、こちらのブログの「8. 温度情報をHerokuに送信する」に記載のコードを参考にしました。
[【Linebot #3】家の温度をLineで通知するアプリ (BME280使用)（MotoJapan's Tech-Memo）](http://motojapan.hateblo.jp/entry/2017/07/22/134906)

<br>

###バックエンド

サーバーはherokuを使い、Ruby on Railsで構築しました。

※詳細は割愛


<br>
###Unity

ゲームはUnityで作りました。

うちわ１を制御するコードは以下の通りです。
サーバーにRaspberryPiから送られたデータを取りに行って、画面上の物体にその値を加えてます。
うちわ２も同様にコーディングします。
他にゲーム全体を運営するプログラムも必要ですが、ここでは割愛します。

```C#:Player1Controller.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Player1Controller : MonoBehaviour
{
    public Rigidbody rb;

    void Start()
    {
    }

    void Update()
    {      
        StartCoroutine(connect("https://XXXXX.herokuapp.com/uchiwa1")); //サーバーのアドレスを入力
    }

    IEnumerator connect(string url)
    {
        WWW www = new WWW(url);
        yield return www;
        JSONObject json = new JSONObject(www.text); //サーバーからデータをJSON形式で取得
        JSONObject power = json.GetField("power");  //取得したデータから必要なデータpower（物体に加える力）を抽出
        float addpower = power.n;
        
        Rigidbody rb = this.GetComponent<Rigidbody>();  // rigidbodyを取得
        Vector3 force = new Vector3(addpower, 0.0f, 0.0f);    // 力を設定
        rb.AddForce(force);  // 力を加える
    }
}
```


#最後

###自動実行設定
実際に遊んでみて、プログラムを微調整し、
最後の最後に、Raspberry Piの電源を入れたら自動的にPythonのプログラムが実行する設定をします。（このゲームを遊ぶのに、いちいちターミナルを起動、コマンド入力などするのは手間ですので）

Raspberry Piのプログラムの自動起動は、こちらのブログのとおりです。
[Pythonプログラムを起動時に実行する方法(Systemd)](http://www.raspberrypirulo.net/entry/2017/07/17/Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%28Systemd%29)


これで、完成です。

![IMG_3749.jpg](https://qiita-image-store.s3.amazonaws.com/0/291592/59327ce7-dd69-55f2-fc35-6df84936247b.jpeg)





ほとんどググって、先人たちの叡智を組み合わせただけですが、なんとか動作するものはできました。


###反省点
Maker Faire Tokyoの会場（東京ビッグサイト）では、当日Wifiが全く繋がりませんでしたので、単なる置物となりました。来場者にはデモ動画で説明するだけしかできず、悔しい思いをしました。
Maker Faireのような展示会に出展する時は、Wifiが繋がらないことを前提に、有線やWifi以外の無線を考慮に入れなければいけないことを身をもって知りました。

<br><br>