Sony MESHのButtonタグをハック

最近、SonyのMESHをいじっています。このデバイスは子供のプログラミング教育や簡単なプロトタイプ制作などの用途にぴったりだと思うので、例えば、Scratchなどのビジュアルプログラミング言語やProcessingのような手軽なプログラミング環境でも使えると便利そうです。

現在は公式のiOSアプリでしか直接MESHを利用することができませんが、せっかくだったら他の環境でも簡単に使えるとよいですね。現状でも、GPIOタグやHTTP経由でiOSの外のシステムとつなげることは可能ですが、用途によってはお手軽さが損なわれるのが少し残念な気がします。

そこで、実験として、公式のiOSアプリ以外から直接を使うことはできないか、MESHをハックしてみました。対象はMESHの中で最も単純そうなButtonタグ。BLEのパケットをキャプチャして調べてみたところ、ボタンを押したときのイベントを取得するための通信の手続きが分かったので、以下にまとめておきます。

 


 

ButtonタグのBLEの仕様

サービスとキャラクタリスティック

サービスとキャラクタリスティックのUUIDは以下の通りです。(Buttonタグ、LEDタグ、Moveタグ、GPIOタグとも共通)

  • Service
    • 72C90001-57A9-4D40-B746-534E22EC9F9E
  • Characteristic
    • 72C90003-57A9-4D40-B746-534E22EC9F9E  (Notify)
    • 72C90002-57A9-4D40-B746-534E22EC9F9E  (Write Without Response)
    • 72C90005-57A9-4D40-B746-534E22EC9F9E  (Indicate)
    • 72C90004-57A9-4D40-B746-534E22EC9F9E  (Write)

Buttonタグを利用するための手続き

以下の手続きを実行すると、BLEでButtonタグを使うことができます。

  1. Buttonタグに接続する。
  2. サービスとキャラクタリスティックを検索。
  3. 72C90005-57A9-4D40-B746-534E22EC9F9E (Indicate) の通知を有効にする。
  4. 72C90004-57A9-4D40-B746-534E22EC9F9E (Write) に0x00020103を書き込む。
  5. 72C90003-57A9-4D40-B746-534E22EC9F9E (Notify) の通知を有効にする。

これで、Notifyによってボタン押下のイベントが通知されるようになります。

ボタン押下時に通知される値

Notifyで通知される値は以下の通りです。ボタンの押し方によって3種類のイベントがあります。

通知される値 イベント MESHアプリ(iOS)での表記
0x01000102 タップ Pressed
0x01000203 長押し Hold
0x01000304 ダブルタップ Double

 


 

 

以上のように、ボタン押下のイベントを取得するのは比較的シンプルな通信の手続きで行うことができました。

これを実装した自作のiOSアプリとButtonタグを連携させてみた様子です↓

Sony MESH Hack – Using Button Tag with my iOS app from hikoLab on Vimeo.

 

iOSデバイスだけでなく、Macとも直接通信できることを確認しました。そこで、Buttonタグを「1ボタンキーボード」にするMacアプリを作ってみようと考えています。ボタン押下でMacにキーコードを出力できるようにすると、いろいろな用途に使えるようになるので便利かなと思います。

 

参考

LEDタグのBLEの仕様については、concre_shiitakeさんがブログに書かれています。
Sony Mesh をハックする LEDタグの使い方編

oFのプログラムでマウスカーソルが表示されない

以前開発したopenFrameworksのプログラムを実行したところ、Xcode6.3.2/Yosemiteの環境でマウスカーソルが表示されないという問題が起きました。

http://forum.openframeworks.cc/t/mouse-cursor-invisible-in-osx/17929
によると、GLFWのバグが原因とのこと。
とりあえず、このフォーラムの書き込みにある通り、void setup()にofHideCursor()を、void mouseMoved()にofShowCursor()を記述することでマウスカーソルは表示されました。

ProcssingでKinectを使うための環境構築について

Kinect(v1)をProcessingでは使ったことがなかったのですが、思いの外簡単に使えました。ただ1点、エラーが出た箇所が合ったので対処方法をメモしておきます。

今回はこちらを参考にMacに「SimpleOpenNI」を導入しました。
http://www.d-improvement.jp/learning/processing/libraries/kinect.html

OSとProcessingのバージョン
  • Mac OSX Mavericks 10.9.5
  • Processing 2.2.1

simpleOpenNIをインストール後、simpleOpenNIのExampleを実行してみると、以下のエラーが発生して実行できません。
Can’t init SimpleOpenNI, maybe the camera is not connected!

検索してみると、こちらに解決策がありました。
http://forum.processing.org/two/discussion/5693/simpleopenni-library-not-working-with-kinect1414-processing-2-2-1-mavericks-10-9-3

下記をターミナルで実行すれば、エラーが解消するはずです。”processing_sketch_dir”には、ホームディレクトリの下に作られる”Processing”ディレクトリのパスを指定します。例えば、通常は、”/Users/[User Name]/Documents/Processing”のようになるでしょう。

Pebble Timeの64色をRGB空間に描画してみました。

Kickstarterで史上最も支援額の多いプロジェクトとなっている話題のPebble Timeですが、Pebble Timeでは6bit(64色)でカラー表示できるようになりました。使える色の一覧は、Color Pickerで見ることができます。

64色の色の仕組みが分かりやすいかなと思い、それらの色をRGB空間に配置してみました。

Your browser does not support the canvas tag.

Source code: sketch_6bit_color
Built with Processing and Processing.js

RGBの各要素が4段階で、4×4×4=64色。

64色しか描画できないと聞くとチープな印象を受けますが、このようにアニメーションで見てみると、64色でもいろいろと面白い表現ができそうです。

mbedとiOSをBluetooth LEで通信する。

技術的なメモです。

IoT(Internet of Things)の開発に興味があり、実験としてmbedとiOSデバイスをBluetooth Low Energy(以下、BLE)で通信させるプロトタイプを作ってみています。

mbedとiPadのBLEでの通信テスト

iOSからmbedを制御するサンプルとしては、下記の記事が大変参考になりました。iOS側のコードも公開されていてありがたいです。

・iPhoneからmbedをBluetooth LE (BTLE)で制御する
http://todotani.cocolog-nifty.com/blog/2013/02/iphonembedbulet.html

ただ、こちらのコードはiOS6.1の頃に書かれたものようで、iOS6では正常に動作するのですが、iOS7ではうまく動きませんでした。具体的には、LED1のON/OFFの制御ができません。

これを解決するために以下のように修正しました。

原因がよく分からなかったので、検索してみると下記のサイトに同様の問題が書かれていました。同じようにiOS7にしてから書き込みに問題が生じたが、CBCharacteristicWriteWithoutResponseからCBCharacteristicWriteWithResponseに変更したら問題が解消したというものです。
http://lists.apple.com/archives/bluetooth-dev/2013/Aug/msg00046.html

そこには、

Apparently Core Bluetooth on iOS 7 is being more stringent about operations on characteristics and the setting of the properties on those characteristics.

とあって、iOS7ではキャラクタリスティックの扱いが厳格になったのではないかという指摘がされていました。

mbed側の実装では、LED1を制御するキャラクタリスティック(0xFFF2)のプロパティは、ReadとWriteで、Write without Responseは指定されていません。そのため、本来はCBCharacteristicWriteWithResponsを指定するべきだが、iOS6ではその辺りの扱いがアバウトだったためCBCharacteristicWriteWithoutResponsでも処理が成功していた、ということなのかもしれません。(正しく理解できていないかもしれないので、もし間違っていたら教えていただけると嬉しいです。)

あと、上記の修正で一応動作はしますが、iOS7になってからCBPeripheralのUUIDとisConnectedプロパティがDeprecatedになっているので、そちらの修正も。

参考: 【連載】Bluetooth LE (6) iOS 7 での CoreBluetooth の変化
http://blog.fenrir-inc.com/jp/2013/11/bluetooth-le-ios-3.html