BLIP2のデータをクラウドにあげてみる

#はじめに
[inscape](http://www.inscape.jp/)さんが企画運用されている[APS〈組込みCPU比較検討プラットフォーム〉](https://www.aps-web.jp/)で、[BLIP2の研究員を募集](https://www.aps-web.jp/kit/adi201708/)されてましたので、興味があったため参加いたしました。
以下では、この募集の課題である「クラウド環境へBLIP2のデータをあげてみる」のクリアを最終目的に、ADZS-BF707-BLIP2を使ってみた際の作業記録です。

##開封
まずは開封。思ったより大きい箱でとどきました。
![blip2_001.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/39db066f-5d37-c01d-c706-afd0c7ce7781.jpeg)
中には、ボード本体以外に、ACアダプターやケーブル、ICE-1000 emulatorに三脚等が入っていました。
![blip2_002.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/501133f4-0a7c-b2f3-052d-7848368ae317.jpeg)

説明書類は１枚だけで、[Web](http://www.analog.com/jp/design-center/evaluation-hardware-and-software/evaluation-boards-kits/adzs-bf707-blip2.html)から取得しろとのこと。開発環境のCrossCore Embedded Studioの180日評価ライセンスのIDが書かれた紙も入っていました。

##準備
次に、必要なソフトウェア一式を落としてきます。

- CrossCore Embedded Studio
 - ソフト開発しなくても、ファームウエアの書換等で必要になります。
- BLIP2 Board Support Package
 - CrossCore Embedded StudioをBLIP2のボード向けに設定するのに必要になります
- ADVisionSensorController GUI
 - BLIP2を試すのに必要なアプリケーション

次に、CrossCore Embedded Studioをインストールし、以下のマニュアルに沿ってCrossCore Embedded StudioをBLIP2用に設定します。

- ADZS-BF707-BLIP Board Evaluation System Manual

BLIP2のボードとICＥ-1000をつなげるとこんな感じ。
![blip2_003.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/4003854a-d653-aae6-ae3c-da8d8a3011ca.jpeg)

この際、ＰＣと接続されるＵＳＢケーブルの数は３本（mini 2本にmicro 1本。mini 2本はセットに同梱されているが、microは別途用意する必要があり。ただし、ACを使用すれば不要かもしれない。試してないので想像。）になるのに注意です。

ファーム書換しない、通常利用時はICＥ-1000はいらないので、USBケーブルは２本になります。

##試しに使ってみる

ADVisionSensorController GUIをインストールして、実際につかってみます。基本的な操作は、[「CMOSセンサーのコンフィグレーションを変えてみる」](https://www.aps-web.jp/lab/adi/201704/02/)をみると理解できます。

ただ、最初につまづいたのは、動画にあるように「Enable VOS」ボタンを押してみても矩形での動体認識がでない状態でした。
※これを解決するのに非常に時間がかかってしまいました。。。

アプリについてきたUserGuideを読んでみたところ、検出モードには「VoS(Video Occupancy Sensor)」と「IoS（Indoor Occupancy Sensor）」の２つがあるようで、矩形で検出物を表示するのはVoSの時のようです。
いま、どちらが採用されているかは、キャプチャー画面の右上のアイコン形状で区別できるとのこと。
VoSの時は色付きバーが表示され、
![blip2_005.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/17f5c582-60f9-4a03-4ef6-5a1474ed6b0b.jpeg)
IoSの時はランプ型のアイコンが表示されるとのこと。
![blip2_006.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/9002ab51-6daa-5ec5-1b78-a209888e9bc9.jpeg)

結果、現状はIoSで動作していることがわかりました。では、どのようにVoSに変更するのか、またUserGuideとにらめっこしたところ、Firmwareを入れ替える必要があることに気が付きました。

UserGuideに従ってFirmwareの入れ替えをすすめ、デフォルトのフォルダー(Flash)配下の"VOS_Outdoors_realtime_BLIP2.dxe"に入れ替えることで、無事に矩形表示が現れました。

Firmwareの入れ替え時ですが、GeneralConfigurations.xmlにあるCCES_versionタグの値を、インストールしたCrossCore Embedded Studioのバージョンに変更しておく必要があります。私の場合は、2.1.0となっていたので 2.6.0としました。

##検出するものを決める

BLIP2のアルゴリズムはいじらず、そのまま利用できそうな例として以下をを考えてみました。

「TOMYの[チョロQ Q-eyes](http://www.takaratomy.co.jp/products/lineup/series/qeyes.html)を走らせて、その動きをモニタリングしてみる。」

![blip2_015.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/361a0d96-2d14-594b-90b9-4701a9ff0da1.jpeg)

チョロQを用意した走行フィールド上を走らせ、BLIP2で認識してみたところ、うまく認識されているようですので、このBLOB情報をSPIで繋げたArduinoから取得してみようとしました。
※ただ、先に結果を書いておきますと、BLOB情報をSPIで取得することができずにまだ実現できておりませんm(_ _)m

##Arduinoとの接続

これについては、[マイコン（Arduino）とBLIP2をSPI接続してみる](https://www.aps-web.jp/lab/adi/201704/04/)の内容を参考に作業しました。
とりあえず試したい！という場合は、このサイトから対応Firmwareがあがっているのでそちらを使えばよいです。

まずは、公開されているスケッチ(APS_BLIP2.ino)をそのまま使うことで「Occupancy」の値を取得することができました。次に、このスケッチを改良して、BLOB情報を取得してみようと思いました。

SPIの仕様は、[Video Occupancy Sensor, Blackfin](http://www.analog.com/jp/design-center/processors-and-dsp/evaluation-and-development-software/bf_objdt_03.html)のインストール先のdocフォルダに

- SPI_Communication_Protocol.pdf

に書かれていました。

これを参考にスケッチを改良してみたのですが、残念ながら、上手く動かすことができませんでした。
※SEND BLOB INFOを送信しても、トリガーの割り込みが発生しない状態

今回はクラウドにデータをあげるところまでをやってみることですので、ここで詰まっていても仕方ないため、以降は「Occupancy」のデータをあげてみることに方針転換しました。

##クラウドにデータをあげる

次に、BLIP2から取得したデータをクラウドにあげてみます。

まず最初に思いついたのは、Azure IoT HubにMQTTでデータをあげる方法です。これを実現するために、[ESP-WROOM-02](https://www.switch-science.com/catalog/2346/)を使用しようと思い、手持ちの[Board1](https://www.switch-science.com/catalog/2696/)をArduino IDEで使用できるようにして、サンプルのスケッチを試してみました。
しかしながら、結果としてはサンプルのスケッチは動作しませんでした。トリガーの割り込みが上がってきませんでした。

他の手を考えてみたところ、手持ちのものでは[クラウド環境へBLIP2のデータをあげてみる](https://www.aps-web.jp/lab/adi/201704/05/)と同等のさくらのIoT Platform βがあったので、これを使ってみました。

手持ちは、[sakura.io シールド for Arduino](https://sakura.io/product/arduino.html)ではなく、[ブレイクアウトボード(検証ボード)](https://sakura.io/product/breakoutboad.html)だったため、Arduinoで使用するためにI2Cのレベル変換(5v <-> 1.8v)を[ロジックレベル双方向変換モジュール](https://www.switch-science.com/catalog/1523/)を使って行いました。

すべてを繋げてみると以下のような感じになります。
![blip2_010.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/f609d0f2-bf81-1d1b-7bf9-217b50c98bf7.jpeg)

運用する場合は、Arduino UNOを小型の[Arduino Pro Mini](https://www.switch-science.com/catalog/946/)にすれば、すべてを評価ボードの裏側に実装できるかと思います。
※J2のWSNピンが逆向きならよかったのですが

ここから先は簡単で、まずは、sakura.ioのWebサイトでモジュールを登録、WebSocketのサービスを作成して表示しておきます。

次に、サンプルのスケッチ(BLIP2_IOT.ino)をArduinoに書き込み起動し、sakura.ioがオンラインになるまで待ちます。その後、BLIP2のアプリを動作すると、以下のようにOccupancyの値が表示されました。
![blip2_020.JPG](https://qiita-image-store.s3.amazonaws.com/0/51272/264f6246-6724-8dae-d3e0-2d2a35898a44.jpeg)

##最後に

sakura.ioを使えば、APSさんが公開されているサンプルを使って、BLIP2からの情報を非常に簡単にクラウドに繋げることができました。

一方、他の方法だといろいろと対応が必要になる感じです。が、あまり時間がとれずに根本解析を行っていないので、もう少し時間をかければ解決できると思います。

また、VoSとIoSのようにBLIP2本来の用語や操作方法についての情報がもう少しあると発想が広がるかと思いました。