Unity
IoT
mpu6050
raspberrypizero

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

作ったもの

IoTクソゲー「うちわdeファイト」

Maker Faire Tokyo 2018出展作品

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

構成図

スクリーンショット 2018-09-16 11.33.31.png



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

必要なもの

スクリーンショット 2018-09-16 11.49.11.png

製作

Raspberry Pi Zeroの初期設定

こちらのブログの通りにしました。
Raspberry Pi ZeroにRaspbianをインストールする

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

こちらのサイトのとおりにしました。
Interfacing Raspberry Pi and MPU-6050

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

普通は

$ ssh pi@raspberrypi.local

で接続しますが、
今回は2つのRaspberry Piを同時に接続することもありますので、Raspberry PiのIPアドレスで接続します。

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

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

$ ssh pi@192.168.10.107 (IPアドレスは例)

次に「コントロール+T」 でターミナルウィンドウをもう1つ出現させ、
うちわ2のRaspberry Piに接続します。

$ ssh pi@192.168.10.108 (IPアドレスは例)

これで、うちわ1、うちわ2、2つのRaspberry Piに同時に接続できました。

なお、Raspberry PiのIPアドレスの確認方法は色々ありますが、MacならLan Scanというアプリを使うのが簡単です。


プログラミング

センサー値を取得し、角度に変換するコードは、こちらのブログを参考にしました。
Raspberry Pi 2でI2C (MPU-6050の制御) Python編-5 (傾き計算-3)

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


バックエンド

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

※詳細は割愛


Unity

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

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

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)

これで、完成です。

IMG_3749.jpg

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

反省点

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