Raspberry Piと赤外線センサでリモコンから光線を発射するARシステムを作ってみました

# はじめに

センサの値をARで可視化しようと取り組むなかで、Raspberry Piと赤外線センサを使用して、リモコンから光線を発射するARシステムを思いついたので作ってみました。

本記事では、動画につづいて、本システムの使用機材や仕組みについて説明します。

# 動画

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Raspberry Piと赤外線センサーで、リモコンから光線が出るARシステムを作ってみた（動画はAndroidデバイスの画面をキャプチャしたもの） <a href="https://t.co/0xZizRhDeA">https://t.co/0xZizRhDeA</a></p>&mdash; mikanbako (@mikanbako) <a href="https://twitter.com/mikanbako/status/814671563043651584">2016年12月30日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
赤外線センサに向かってリモコンのボタンを押すと、光線が出ます。赤外線センサの範囲外では、リモコンのボタンを押しても何も出ません。

# 使用機材

本システムでは下記の機材を使用しています。

## Raspberry Pi

Bluetooth Low Energyが使用できるRaspberry Piが必要です。

本体が対応していなくても、Bluetooth 4.0以上対応のUSBドングルを差し込めば問題ありません。

## 赤外線センサ

今回は、赤外線リモコン受信モジュールPL-IRM2161-XD1を使用しました。

## Androidデバイス

Android 4.4以上のカメラ付き、Bluetooth Low Energy対応のデバイスが必要です。

# 仕組み

まず、本システムのおおまかな処理の流れについて説明します。その後、赤外線センサとRaspberry Piを接続する際の回路図を掲載し、Raspberry PiやAndroidアプリそれぞれの処理の詳細について説明します。

## 処理の流れ

1. 赤外線センサでリモコンの赤外線を検出します。
1. 赤外線を検出したら、Raspberry PiがBluetooth Low Energyのアドバタイジングパケットを送信します。
1. アドバタイジングパケットを受信したAndroidデバイスは、カメラに写ったリモコンの角度に応じて光線を発射するエフェクトを描画します。

## 回路図

下記に赤外線センサとRaspberry Piを接続する際の回路図を掲載します。赤外線センサを定格通りに動作させるための抵抗、ノイズ防止のためのコンデンサを加えて、Raspberry PiのGPIOに接続します。なお、今回使用したRaspberry Piは「Raspberry Pi Model B rev2」、赤外線センサはPL-IRM2161-XD1です。

![circuit_diagram.png](https://qiita-image-store.s3.amazonaws.com/0/30639/43aff398-cf90-3423-5972-27473bcc82e3.png)

## Raspberry Piの処理

GPIOを監視して、赤外線センサからの信号があれば、Bluetooth Low Energyのアドバタイジングパケットを生成して送信するPythonスクリプトを走らせます。GPIOの監視には[RPi.GPIO](https://pypi.python.org/pypi/RPi.GPIO)モジュールを使用します。アドバタイジングパケットを送信する際には、[BlueZ](http://www.bluez.org/)のコマンドラインツールをスクリプトから操作します。

アドバタイジングパケットのSignificant partは、下記の11オクテットの構成になっています。用語などについては、[Bluetooth Core Specification](https://www.bluetooth.com/specifications/adopted-specifications)をご覧ください[^1]。

[^1]: 例えば、「Bluetooth Specification Version 4.2 Volume 3: Core System Package [Host volume], PartC: Generic Access Profile, 11. ADVERTISING AND SCAN RESPONSE DATA FORMAT」や「Supplement to the Bluetooth Core Specification v7, PartA: DATA TYPES SPECIFICATION」を参照してください。

<table> 
        <tr>
            <th>オクテット番号</th>
            <th>AD Type</th>
            <th>AD Structureの内容</th>
            <th>オクテットの内容</th>
            <th>備考</th>
        </tr>
        <tr>
            <td>1</td>
            <td rowspan="3">Flag</td>
            <td>Length</td>
            <td>0x02</td>
            <td>-</td>
        </tr>
        <tr>
            <td>2</td>
            <td>AD Type</td>
            <td>0x04</td>
            <td>-</td>
        </tr>
        <tr>
            <td>3</td>
            <td>AD Data</td>
            <td>0x04</td>
            <td>クラシックBluetooth非サポート、検索不可</td>
        </tr>
        <tr>
            <td>4</td>
            <td rowspan="8">Manufacturer Specific Data</td>
            <td>Length</td>
            <td>0x07</td>
            <td>-</td>
        </tr>
        <tr>
            <td>5</td>
            <td>AD Type</td>
            <td>0xff</td>
            <td>-</td>
        </tr>
        <tr>
            <td>6</td>
            <td rowspan="6">AD Data</td>
            <td>0xff</td>
            <td rowspan="2">試験用Company Identifier</td>
        </tr>
        <tr>
            <td>7</td>
            <td>0xff</td>
        </tr>
        <tr>
            <td>8</td>
            <td rowspan="4">32ビット符号付き整数</td>
            <td rowspan="4">赤外線を検出するごとに1ずつ増加する</td>
        </tr>
        <tr>
            <td>9</td>
        </tr>
        <tr>
            <td>10</td>
        </tr>
        <tr>
            <td>11</td>
        </tr>
</table>

## Androidアプリの処理

Androidアプリでは、アドバタイジングパケットを受信するたびに、カメラに写ったリモコンの角度に応じて光線を発射するエフェクトを描画します。

Androidアプリの作成には、ARの実現のために[Unity](http://japan.unity3d.com/)と[Vuforia](https://www.vuforia.com/)を使いました。エフェクトは、UnityのAsset Storeから入手しました。リモコンの角度は、VuforiaのObject Recognition機能を用いて割り出しています。

# ソースコード

ソースコードは[GitHub](https://github.com/mikanbako/ri_ar
)で公開しています。ライセンスはMITです。

なお、これ以上の改善を行う予定はないため、ドキュメント修正以外のプルリクエストを受け付けるつもりはありません。