第3回アキハバラIoTツアーズ ばっしー編

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは。

IoTツアーズの翌日は休日作業(@自宅)で、更に翌週末は娘の運動会ということで、やっと記事をアップしているばっしーです。

さて、そんな運動会に備えて、カメラを買い換えてしまいました。

APS-CサイズのNikonのD7000から、フルサイズのD600に!ついにフルサイズですよ!

30年前の中学生の頃から、祖父に頂いた一眼レフをずっと使っていて、時代がデジタル化されてからは35mmの画角からしばらく遠ざかっていましたが、15年ぶりくらいにようやく長く慣れ親しんだ元のフォーマットへ戻ることができました。

まぁイマドキD600なんて型落ち品、もちろん中古ですけどね。

それでも標準ズームとセットで10万円もしました。すごーい!たかーい!

ってそんなことはどうでも良いですね。

去る2017/5/20に第3回目となる、「アキハバラ IoT ツアーズ」が開催されました!

私は今回、別会社ではありますが、以前の職場で同僚だった友人と出場したのでその内容を記します。

題材は『健康』・・・そこはかとない既視感が

さて、まずはその友人と題材を決めなければなりませんが、早速打合せ(飲み)です。

[感想]ワタミって意外に高いんですね。さくら水産バンザイ。

はい、どうでも良いですね。

とりあえず、先日作ったRFIDが二人とも気に入ったので、RFIDで何かできないかな~、ということになりました。

RFIDの使い道といえば、タッチしてIDを読み取るか、IDに何か書き込むか、という使い方が考えられます。

そこで、思いついたのが、スポーツジムのようにアトラクションをRFIDで回数カウント…ちょっとつまらないなぁ。

次の案は、オリエンテーリング。あの、野山にチェックポイントを設けて歩き回るヤツです、が、若い人って知らない人も多いんですよね。びっくりだよ!

テーマの健康だけど、歩き回るのも健康に良いからOKだよね~。

そこで更に思いついたのが、けも○フレンズのフレンズたちがジャパリパークを歩き回るって言う設定だったらビジュアル的にもわかりやすいかも?!と、それに決めちゃいました。

作業分担はIoTの「I」と「T」

友人が「I」=インターネットというわけでサーバー側を、私が「T」ということでThings=マイコン側をそれぞれ担当することにしました。

友人はSEではあるけど上流SE暦が長いため、実はコーディングなどはカラッキシやったことがないということで、とりあえずサーバーレスの仕組みを取り組みました。

サーバーレスでがんばるぞいっ

AWS IoTでデバイスとの通信を確立し、Lambdaでプログラムを動かして取得したデータをDynamoDBに保存し、リクエストが来たら逆にLambdaがDynamoDBからデータを引き出して、S3に置いた画像ファイルを組み合わせて表示…と、妄想構想は完璧でした。

しかし、いざ動作させてみようとすると、まずはAWS IoTがArduinoではちょっとややこしい。Lambdaでhttpリクエストをどう受ければいいかわからない。LambdaからDynamoDBに接続できない。などなど。困った。

なので、

やっぱりサーバー作るか

アッサリ方針転換です。

できないものは仕方ないです。

とりあえず会社の検証用アカウントが自由に使えるので、私がAmazon LinuxにNginxを入れ、コーディングが不安な友人のために、簡単なサンプルPHPプログラムを作って引き継ぎました。

登場フレンズは14人(匹?)

RFID一つにつき各フレンズが割り振られるため、RFIDユニットに付属してきたモノが2個(キーホルダータイプ+カードタイプ)×2台に、さらにキーホルダータイプ×10個の合計で14個のRFIDがあったので、14人となりました。キャラの選択は私の独断と偏見になりますが、基本は出番の多さとか人気ランキングを参照しながら作りました。

↑これが

↓こうなる

わーい!かーわいー!

RFIDユニットを作るよ

次にRFIDリーダーです。

基本的には今回はこれまで使っていたESP-WROOM-02(ESP8266)ではなく、それの新型であるESP-WROOM-32(ESP32)を使用することにしました。

RFIDユニット(RC-522)自体はESP8266で稼働実績もあるので、問題なく動くだろうと思っていたのが大間違い!

SPIデバイスのPinアサインが…?!

RC-522の様なSPIプロトコルの機器を接続する際には、結果的に以下の様な違いがありました。

ESP8266の際に、いくつかIDE上でPinを定義しなかったので不思議だったのですが、ESP32では決められていたため、そうした疑問も生じませんでした。

信号Pin ESP8266 ESP32
SPI MOSI 自由に割当て GPIO23(SPI MOSI)
SPI MISO 自由に割当て GPIO19(SPI MISO)
SPI SCK 自由に割当て GPIO18(SPI SCK)
SPI SS(SDA) 自由に割当て GPIO5(SPI SS)
RST 自由に割当て 自由に割当て

具体的には以下の画像の通りです。(画像はこちらから引用)

I2Cデバイスのピンアサインも…?!

今度はOLEDディスプレイを接続した際にも動作せず。こちらも結果的に以下の様な違いがありました。

信号Pin ESP8266 ESP32
SCL 自由に割当て GPIO22(Wire SCL)
SDA 自由に割当て GPIO21(Wire SDA)

さらに、IDE上でPinを定義する際にwire begin(22,21)等とPin番号の記述は不要で、wire begin()だけで動作しました。

ボタンが動作したりしなかったり…?!

本来はRFIDユニットをパークの数だけ用意して、そのユニットにRFIDをスキャンすることで、オリエンテーリングを進めることにしたかったのですが、そこまで多数のRFIDユニットは準備できなかったため、仕方なく2台だけに。そのため、ボタンを押すことでどのパークかを設定できるようにしたかったのです。

しかし・・・ボタンを押すことを検知してLEDを光らせるサンプルプログラムは動くのに、本番のプログラムからボタンを検知してパークの番号をインクリメントさせようとすると、全く意図した動作をしてくれません。

何をやっても埒が明かなかったため、この機能は諦めて、0.5秒でパークの数字が勝手に変わっていく様なプログラムに書き換えてしまいました。そのため、ボタンはダミーとなっています。残念!

サーバー側のプログラム

以下の様な構成としました。

プログラム①(ばっしー担当) → RFIDユニット(ESP32)からパークの番号とUIDを受け取って記録する

プログラム②(友人担当) → ジャパリパークの各パークに、どのフレンズが居るか(ログインしたか)表示する

ESP32から受け取るプログラム

RFIDのユニークIDを読み取ったら、サーバ側にデータを投げます。その際に、オリエンテーリングの場所としてパークの番号(code)も一緒に送る感じです。パラメーターは以下の様にhttpのGetメソッドで送ることにしました。

http://サーバアドレス/sample.php?code=[パーク番号]&id=[RFIDのUID]

受け取ったパラメーターはテキストファイルにCSV形式で追記することにしました。

結果を表示するプログラム

以下の様に特にパラメーターなしで表示します。

http://サーバアドレス/sample2.php

CSV形式のファイルからデータを読取り、各パークの場所に、各フレンズを表示させます。

実際の表示は以下の様に表示されます。

なかなか素敵でしょ?!

タッチすると、そのフレンズがどんどん移動して増えていきます。

オリエンテーリング、たのしーい!

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す