takashiskiのブログ

覚書の殴り書き

iOSやAndroid上のUnityとBLEで繋がるセンサー付コントローラを作る

概要

Unity製のiOS,AndroidアプリとBluetoothで繋がる自作専用ハードウェアを作りたい。 と言うシチュエーションは最近増えてきました。こうした場合はBLE(Blutooth Low Energy)経由で接続することが多いです。

過去の例だと BLE NANO RedBearLab BLE Nanoキット V2 - スイッチサイエンスiOSのネイティブ実装例が見つかります。

しかし現在はWifi+Blutoothに両対応した安価なESP32ボードが手に入ります。 もし安価なESP32ベースで専用BTコントローラを仕立てて、iOSAndroidと(Unityから)繋ぐことが出来ると、変なゲームやインスタレーションが作れそうです。

本エントリではUnity製アプリ内でESP32に繋いだジャイロセンサの値を反映する。というサンプルを作成します。 (端末の近くにある該当のESP32を名前決め打ちで引当て(Scan)、ESP32を発見したら自動で接続を行い、ESP32はデータをiOS,Androidに送りつけて、iOS,Android端末側で画面に表示する、というのをやります)

BLE自体の仕組みについては くらげのIoTテクノロジーさんが詳しいので、一読をおすすめします。

クラゲのIoTテクノロジー

本エントリで解説しないこと

お願い

  • 手元にiOS開発環境がないのでiOSの動作確認がとれません。動いたら教えてください。
  • 唯一のカメラ付き端末で動作させるせいで、動作動画撮影ができません。なんかアイデアください。

執筆時の環境

  • Windows10 april 2018
  • Android8.0(XperiaXCompact)
  • Unity2018 1.0b13
  • ArduinoIDE1.8.0

必要なもの

  • ESP32 dev kit
  • microUSBケーブル
  • 後述のアセット

amazonから買うときは、primeのものを買うようにしましょう。そうでないと中国発送で届くまでに2週間かかります。

amazon以外だと秋月電子あたりで買えるんじゃないでしょうか。

準備

  1. PCにUnityのandroid/iOSのビルド環境を用意する
  2. PCにESP32の開発環境入れる
  3. BLEをUnityのiOS,Androidで動かすための ネイティブプラグイン アセットを買う

PCにUnityのandroid/iOSのビルド環境を用意する

androidに関しては参考文献を参照してください。 参考文献通りに進めれば基本的に問題ないですが、一点変更がありました。

android studioインストーラのインストール項目のandroid SDKをチェックしていることを確認するよう書いてありますが、2018/05/15次点では一覧に表示されませんでした。

無視してそのままandroid studioをインストールしたのちにandroid studioを起動すると「SDKが見つからなかった」と表示がでてそのまま半強制的にSDKをインストールすることになりました。(r25 系である必要がありそうです)

qiita.com

framesynthesis.jp

PCにESP32の開発環境を入れる

別記事に書いてあるので参考にしてください。

takashiski.hatenablog.com

基本的に公式に書いてある通りの手順に沿って手を動かすだけです。

github.com

BLEをUnityのiOS,Androidで動かすための ネイティブプラグイン アセットを買う

買ってください。20ドルです。

Unity自体はBLEの処理を持っておらず、デバイスごとにネイティブで書く必要があります。

以下のアセットを購入すると、20ドルでiOS, tvOS, androidでBLEが取り扱えるようになります。

ネイティブの処理を自前で書いて連携できるなら買わなくても大丈夫です。がんばってゴリゴリ書いてください。

実装方針・概要確認

この記事では動確程度のため、サンプルコードを最小限の改変で動かすことを目標にします。

Unity側のBLEアセットのSimpleTestというサンプルシーンがScanとnotifyの受け取り・表示をするので使います。

ESP32側はSimpleTestにあうように実装を決めます。BLE_notifyというサンプルスケッチを使います。

SimpleTestがやってること

  1. BLEデバイスをScanする
  2. Scanで見つかったデバイスのうち識別情報が一致したデバイスに自動的に接続する
  3. 接続したデバイスから受け取ったバイト列を表示する(BLE notify)

BLE_notify.inoがやっていること

  • 次の処理を繰り返す
    1. notifyで1バイトの変数valueの値を投げる
    2. valueをインクリメントをする
  • 受信デバイスから見ると、0, 1, 2, ..., FF, 0, 1, ....という順番でデータが飛んでくる

やらなければならないこと

識別情報を一致させないといけません。一致さえさせれば動作確認は取れます。

今回識別情報と呼称しているのは以下の三点の組です。

  • Device Name
  • Service UUID
  • Characteristic UUID

UUIDとして今回は16bit UUIDと呼ばれるHEX4桁のものを利用します。 実際利用する際は16bitではなく、以下のXXXXに16bit UUIDを埋め込んだほとんどが共通部のUUIDを埋め込みます。

//16bit
XXXX

//full length
0000XXXX-0000-1000-8000-00805F9B34FB

今回はそれぞれ以下のように設定します

  • Device Name : MyESP32
  • Service UUID : 2220
  • Characteristic UUID : 2221

ESP32

ファイル > スケッチ例 > ESP32 BLE Arduino > BLE_notifyを開きます。 今後も改造することとしますので、適当な名前で別名保存してください。私はBLE_Unity.inoにします。

変更箇所は35, 36行目です。

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define SERVICE_UUID        "00002220-0000-1000-8000-00805F9B34FB"
#define CHARACTERISTIC_UUID "00002221-0000-1000-8000-00805F9B34FB"

Device NameはデフォルトがMyESP32なので変更は不要です。

これをビルド・書き込みしたら完了です。 そのまま電源を入れたままにしておけば、Unity側のインストールが終わり次第すぐに確認できます。

Unity

新規プロジェクトを作成し、android(もしくはiOS)をビルド対象にして、その他の設定を済ませてください。

アセット Bluetooth LE for iOS, tvOS, androidをインポートします。

Example>SimpleTest>SimpleTestシーンを開いてください。

ヒエラルキーのMain cameraを選択し、インスペクターの項目を設定します。Device Name以外は初期値を使っています。

  • Device Name : MyESP32
  • Service UUID : 2220
  • Subscrive Characteristic UUID : 2221
  • Write Characteristic UUID : 2222(今回は使わないのでHEXなら何でもよい)

SimpleTest.csを開いて以下の項目を編集します。具体的にはWriteCharacteristicを使わないように書き換えます。

  • 159行目 if文
if (_foundSubscribeID && _foundWriteID)
if (_foundSubscribeID)

もしくはWriteCharacteristicを使って評価してる部分を削除すればよいです。

最後に、スマートフォンをPCにデバッグモードで接続して、ビルドアンドランで書き込みましょう。

ESP32の準備が済んで電源がはいっているのであれば、起動次第すぐに見つけられて、数値がインクリメントされ続ける様子が見れるはずです。

まとめ

便利なアセットと便利なBTモジュール付きマイコンを使うことで、BLEでデータのやり取りができました。

notifyではデフォルトだと20バイトのデータが送れるそうです。今回は1バイトのみですが、任意バイトをおくって表示するなどしてみてはいかがでしょうか。

発展として、ESP32でセンサの値を読み取り、Unityに投げてUnity内のオブジェクトに反映させる、というのをこのあとやります。

補足

コントローラに相当するESP32側でセンサーやボタンの値を監視して、変化があった時だけ接続先の iOS,Android端末にデータを送る、という事を実現するためにBluetooth LEのnotifyを使います。 http://jellyware.jp/kurage/bluejelly/notify.html

参考文献

Unity

qiita.com

framesynthesis.jp

nn-hokuson.hatenablog.com

https://forum.unity.com/threads/build-failure-unable-to-retrieve-device-properties-in-unity-4-2-1.213178/

answers.unity.com

ESP32

yegang.hatenablog.com

BLE

jellyware.jp

謝辞

記事の内容をよくするためにご意見いただいたようてんさんとizmさんに感謝を申し上げます。

ArduinoIDEにESP32のボード定義やライブラリをいれる

経緯

ESP32の開発環境の一つとしてArduinoIDEがあります。Arduinoは散々使われているため、大抵のセンサのライブラリが容易されているので非常に便利です。

一方で、てきとーにネットを参考にしてやると地雷踏むことが分かったので怪しいとこだけ書きます。

世間では「gitよくわかんねーし、zipでダウンロードしてきて使えばいいじゃん」な風潮なようです。

その証拠に、ESP32 開発環境 あたりでググると平然と「download ZIPからダウンロードしたファイルを解凍して配置します」とか「BLEフォルダは空っぽなので別に用意されてるリポジトリの中身をダウンロードしてBLEフォルダにコピーしてきます」なんて書いてある記事が上位に出てきます。しかも、割と有名な人が書いています。複数。

「ダウンロードして配置すれば動く」は大嘘です。動かないです。動くケースもあるんでしょうが、私は以下のエラーで悩みました。半年くらい前に突っ込んだESP32環境に最新のBLEリポジトリを突っ込んだからな気がします。

https://github.com/espressif/arduino-esp32/issues/1299

大嘘と強い言葉を使っていますが、あながち間違いではないです。なぜならば、公式が提示している導入方法と異なるからです。少なくともarduino-esp32のリポジトリWindowsへの導入説明には、 git cloneして入れた後にgit submodule updateしてね と書いてあります。

github.com

ESP32は結構な頻度で更新されている上に、ArduinoIDEの機能では自動更新されません。git cloneコマンドで入れていれば、git pullなどのコマンドで比較的容易に更新ができます。「git...わからん...」な人も、これを機会に導入しましょう。よくわからんの人でも、公式はすごい少ない手順に死ぬほど丁寧にスクリーンショット貼りつけて説明してくれていますので順にやっていけばできるでしょう。英語なので無理と思う方は基本的に英語の情報しかないので諦めたほうが良いかと思います。

本題

以下は公式に書いてある内容を適当にメモしたものです。Windowsの手順です。それ以外のOSの人は適当に補完するか公式の導入手順を読んでください。 1. また、gitはコンソール版で、powershellで実行するものとします。ArduinoIDEは1.8.0です。

最初に、Powershellを起動します。

Arduinoのスケッチやライブラリが設置されているフォルダに移動します。Windowsだとデフォルトは~/Documents/Arduino/です。

cd ~/Documents/Arduino

次にその下にフォルダを作成します。~/Documents/Arduino/hardware/espressif/ としてください。

mkdir hardware/espressif

作成したらespressifフォルダに移動して、以下のgit cloneコマンドを実行します。

cd hardware/espressif
git clone https://github.com/espressif/arduino-esp32 esp32

作成されたesp32フォルダに入って、git submodule updateをします。このコマンドにより、適切なBLEライブラリが導入されます。

cd esp32
git submodule update --init --recursive

最後に、esp32以下のtoolsに入ってget.exeを実行します。

いま入れたばかりなので更新手順の確認ができませんが、たぶんgit pullすれば完了すると思います。ダメならget.exeをさらに実行すればよい気がします。

vimで改行コードが壊れている(?)に改行に置換する

改行がM(ctrl+v ctrl+m)に置き換わってしまっている場合は、以下のように置換するといい感じになる。

:%s/^M/\r/g

^Mはそのままの二文字ではなく、Ctrl+v Ctrl+mにより入力される特殊文字である。

メモ:tweetdeckの検索カラムのexcludingを適用させる方法

twitterで #技術書典 を追っていると、当日見落としていた本の情報や、購入対象外にしていた書籍の書評が流れてきて思いのほか面白そうだった、ということがたびたびある。 しかし、面白い記事の投稿があると、皆こぞってtweetをする。SEOでタイトルに#技術書典が含まれていたり、ハッシュタグを追加して投稿することがあるので検索汚染甚だしい。

検索のexcludingを適用しようと該当語句を追加したところ、何故か除外されないどころかその語句を含んだtweetしか出現しなくなってしまった。twitterの仕様とは言え酷い。

調べたところ、フォーマットはカンマ区切りのクォートされた文字列のようである。 具体的には下記である。

"word","語句", .... ,"単語"

これで「もうみた」を排除できるようになった。

メモ:対面電書にアップロードした書籍のDLカードの用意方法

技術書典4おつかれさまでした。 DLカードのみの準備で、20部売れる見込みで、一応40枚用意して20部売れたので予定通りだったtakashiskiです。

今回、対面電書とA-oneとbrotherに助けられたので書きます。

対面電書は...どういうサービスといったらよいんでしょうね。 シリアルコードをイベントで配布・販売すること前提のDLサービスです。 このサービス自体ではシリアルのやりとりはできず、イベントやその他の販売方法で配布します。

このサービスは無料で利用できます。管理者のkazamiさん(であってますよね?自転車創業の方が運営されてると考えてたけどはっきりかかれてなかった)にはいつも頭が上がりません。

年々アップデートされており、最近では電子書籍以外にもゲームなどの販売もできるようになったようです。

本題

さて、今回諸事情で入稿締め切り日からリライトをすることになり、イベント当日にQRコードを作成する、ということを実施しました。 本当はイベント会場でサーマルプリンターで即時印刷するつもりでしたが、ジャンクでかったプリンタであったためうまく動きませんでした。 そのため急きょほかの手段を模索したところ、たまたま揃っていた部材で解決できましたのでここにまとめます。

具体的には、対面電書のDLカードを自宅で作成する方法です。

必要なもの

  • 名刺用紙
  • 名刺用紙が使えるプリンター

私は以下の2種類を使いました。名刺用紙の50シート500枚は多いと感じるかもしれません。 実際はテスト印刷もしますし、個人名刺を作ることもあるでしょう。

例えば、100部用意して個人名刺を200枚用意すると、それだけで半分なくなってしまいます。 「急きょ必要になった時」のことを考えると、500枚が不安ではないです。100枚ごとに買うよりも単価が下がりますしね。

また、厚手を選ぶ理由は受け取った時にしっかりしているほうが嬉しいからです。 薄い名刺カードには、受け取った時に残念な印象を受けませんか? ここは完全に好みで選択してます。 単価をさらに下げたいようであればより薄い名刺カードを選んでもよいでしょう。

プリンタは購入当時amazonで一番安かったやつです。品質を求めるならもっといいやつを買ってください。 黒インクは切れないようにいつも一つ以上予備を持っています。

対面電書でやること

まず、対面電書に書籍情報を登録します。この時点では仮データで問題ないです。

次に、書籍のページの右上に管理に関するリンクがありますので、「シリアル管理」を選びます。

シリアル管理の右上のボタンで必要な数を満たすまで「シリアル発行(+100個)」を選びます。

必要な数を出しましたら「CSVダウンロード」でシリアルコードのCSVをダウンロードします。

ラベル作成ツールでやること

A-oneの名刺作成ツール 「ラベル屋さん」をインストールします。

www.labelyasan.com

次に、起動して「用紙を選んで新規製作」を選び、「品番や用語で絞込検索」に「51678」を入力して絞り込み、51678を選びます。 f:id:takashiski:20180422212119p:plain

次に、右上のタブをデザインから差し込みに切り替えてください。

次に、右上の差し込みをONにしてください。確認ダイアログがでていますが、現段階では一切影響はないのでOKで問題ありません。

次に、データ読み込みを選択してください。既存のデータが破棄されると出ますが、既存のデータなんてないので問題ありません。

次に、先ほど対面電書からダウンロードしたシリアルCSVを選択します。

次に、読み込み対象を聞かれますので、全読込を押して全部を対象にしてから読み込みを押してください。

次に、列をテキストエリア・QRコードの関連付けを行います。

次に、デザインタブに戻って、文字とバーコード(QRコード)を配置してください。非常に雑に配置すると次のようになります。

f:id:takashiski:20180422212552p:plain

次に、再度差し込みタブに戻ってください。

次に、列名を選択しテキストエリアを選択して「関連付け」ボタンを押してください。マッピングがされます。

今回はパスコードとpasswordが、QRコードとsecret-urlを関連付けます。

次に、印刷タブに移動します。すると、全カードに対して異なるデータが配置されていることが分かります。

あとは、必要な分だけ印刷するだけです。そのままだと、全データを印刷してしまいます。「開始行」と「終了行」を設定すると、50-59番だけ印刷する、などができます。

レイアウトにも問題がなければ、印刷ボタンを押します。

デフォルトだと片面印刷ですが、必要であれば、逆面にも絵を付けてください。

手順は以上です。

その他

レイアウトはグリッドスナップなどないようで、かなり厳しいです。うまく調整してください。 予め、別のツールで矩形など配置した画像を用意し、その画像をガイド/背景として使うのがよいかもしれません。 注意点としては、印刷時にちょっとずれることがあるので何も印刷されない余白は確保したほうがいいです。

また、対面電書を知っている人の割合はまだまだ多くはありませんので、注記はつけたほうがよいです。

secret-urlをブラウザで開けばパスコードは自動で入力された状態のページが表示されますので、すぐにダウンロードやアカウント連携ができます。しかし、何事も事故は考えられますので、念のためパスコードを付けています。

まとめ

自宅にプリンターと名刺用紙が常備されていれば、前日/当日まで執筆をしてサークル入場直前まで時間をかけてキンコーズに駆け込んで並んでコピー本をする、なんてことをしなくてもよくなります。

自宅で提出用の見本誌と、内容確認用の見本誌2-3部程度をコピー本として印刷している間に、対面電書に登録してDLカードを作成しましょう。DLカードの印刷はコピー本の印刷に比べると一瞬で終わります。

追加で必要なものは布とPOPとおつりくらいでしょうか。あとサインペンや白紙のA4用紙とクリアファイルがあるとよいですね。

とても非常に身軽に会場に向かうことができます。

「紙の本ないの?」と聞かれたら、非常に乱暴ではありますが「このPDFを購入・ダウンロードしてセブンイレブンのコピー機で小冊子印刷をしてください。」と注記するなり伝えるなりすればよいのです。

展望

最初にちらっと書きましたが、サーマルプリンターでDLカードを動的?生成をすることを本当はやりたいです。ぎりぎりまで寝ていたいです。

以上。

追記

メモ:害虫退治

一人暮らしを始めてから、ずっと長野だとか山梨だとかで比較的新しめの家に住んでいた。 東京にきて「虫がでるんだろうなぁ...」と思ってたらダニかノミかなにかがでた。朝起きると虫刺されが増えている。

とりあえず、いろいろ典型的な駆除対策をした。しかし、どうも被害が消えない。

不思議に思って、追加資料を見たら、ノミもダニも、部屋でみた虫と外形が異なる。

さらに調べたところ、「トコジラミ」とか「南京虫」と呼ばれているカメムシの仲間だったようだ。 なんとこいつ、本来であれば日本では根絶されていたらしい。しかし、最近観光客が多くなり、観光客から輸入されてしまったようだ。海外でもかなり問題とされているトコジラミであるが、害虫駆除によく使われる成分に耐性を持った個体が輸入されてしまっているようである。

www.sankyoremake.com

クローズアップ現代で特集されたこともあるそうで、なかなかつらい話である。

www.nhk.or.jp

そのため、ダニだのノミだのゴキブリだのの薬は効かないと思ったほうがよい。 不幸なことに、使えそうな薬剤情報がまとまっていなかったので、ここにまとめたいと思う。

効く薬

現在わかってるのは以下3系統。これ以外の者は

  • トコジラミゴキブリアース[1]
  • アーススレッドプロα[1]
  • パラジクロロベンゼン系防虫剤(名前にパラってはいってるやつ)[2]

【第2類医薬品】トコジラミゴキブリアース 450mL

【第2類医薬品】トコジラミゴキブリアース 450mL

【第2類医薬品】アースレッドプロα6~8畳用 10g ×2

【第2類医薬品】アースレッドプロα6~8畳用 10g ×2

【第2類医薬品】アースレッドプロα12~16畳用 20g ×4

【第2類医薬品】アースレッドプロα12~16畳用 20g ×4

ネオパラエース 引き出し・衣装ケース用 防虫剤 400g

ネオパラエース 引き出し・衣装ケース用 防虫剤 400g

おそらく、パラジクロロベンゼンをあらゆるところに置いて、密室にしたのちに旅行に行くのが手軽そうである。しかし、それをやるとあらゆるものからパラジクロロベンゼンの匂いがする。

次点はアーススレッドプロαだろうが、部屋の片づけをしないと意味がない。あと電子機器が多いので退避がつらい...

最後は、トコジラミゴキブリアース。これで結界を作るしかない?

参考資料

  1. http://www.city.toshima.lg.jp/214/kurashi/ese/nezumitomushi/gaichu/documents/ippanmuketokojirami.pdf

  2. トコジラミ(南京虫)の防除法!?: 害虫・害獣と戦う会社,エスケーシステムのブログ

#技術書典 4の販売予定

後に引けないようにするために書く。

サークル情報は以下。

techbookfest.org

おうちセンシングをやってみる本

  • どこのご家庭でも持て余しているだろうRaspberry piとESP8266 + αを使って自宅の環境センシングをやってみましょう。
  • おうちセンシングです。I〇Tといっしょにしないでください。
  • 主にESP8266の話です。「ESP8266からサーバにデータを上げるまでをする本」のほうが題としては適当かもしれないです。
  • サーバ側は申し訳程度に組みます。Raspberry piさえあればいい。

既刊

  • Addressable LEDの本少しと、ぷらはちゃんが書いた本が余ってればそれも持っていきます。