HVC-Cを使った開発について備忘録で記載しておきます。
一般的にはSDKについている通りに作れば良いんだろうけど、iPhone/Androidのコードだけなのでやっぱり色んな環境で動かしたいよね…ということで、とりあえずopenFrameworks上を使うことに。
あと、SDKを見てみると、特にソースはBluetoothとの通信のコマンドとかそのまま見れる。という事で…Edison + NodeJSでも動かそうとして書いてあったのもあったんだけど、今見たらrmしちゃったようで、存在が無くなっていた…orz 方法的には「インテルEdison + BLEで、konashi/SBBLEを動かしてみた。」を参考にnobleとかで作れる。
一般的な作りとしての参考情報はこちらを。
HVC-C iOS SDKサンプルプロジェクトの起動
集中力を測定するCencentMeter – べるべる研究日誌
OKAO Visionがやってきた!!(4)
んで自分のアプリの環境、構成は以下の通り。
– センサ
HVC-C
モバイルバッテリ
– iPhone側
Mac OS 10.9.5
Xcode 6.1
openFrameworks 0.8.4(ios)
MQTT Kit
– 光りモノ側
Spark Core + LED沢山
MQTT Client
iPhone/Server/Spark間はもちろんWiFiで、それぞれのパーツが無線で通信する。最近、自分はMQTTが好きでよく使う。MQTTを利用するとセンサーの値をsubscribeしている端末(ここではSpark)のMQTT側にpublishできるから以下のような感じにも。
MQTTを利用するとセンサーデータをpublishすればあとは、そのデータをsubscribeしている方に処理をまかせる事が出来るから、センサーデータを使ったアプリをネットワークを介してリアルタイムで行いたい時にはとっても便利。例えばHVC-Cを使う場合、取得できる人の数・顔の位置・表情の状態…etc をpublishしておけばあとは使いたい方で、好きなような処理を行うことが出来るという感じ。
別にSpark Coreを使わなくてもOKで、MQTTで受けれる物であればAndroid/iPhone/Win/Mac…etcなんでもsubscribeしておけばpublishされたデータが一斉に流れてくる。iPhoneとServer間は矢印が一方通行で書いちゃったけど、もちろんここも双方向。
んで、次にopenFrameworks側との合体については以下のような感じ。HVCのSDKに入っているソースコードを一式持ってきて(多少修正は入るけど)、oF側からコールするだけ。
これを動かすとこんな感じ。表情で色を変えているだけの単純な物だけど。
んで、oF側も出来て端末側(HVC-C/openFrameworks)は完成。つぎにモノ側、SparkのMQTTの処理はこんな感じのコールバックを書くだけ。
void callback(char* topic, byte* payload, unsigned int length);
MQTT client("hogehoge.com", 1883, callback);
int faceflg = 0;
// HVC-Cからpublishされてきたデータ
void callback(char* topic, byte* payload, unsigned int length) {
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
String message(p);
if (message.equals("SURPRISE")) faceflg = 0;
else if (message.equals("NEUTRAL")) faceflg = 1;
else if (message.equals("HAPPINESS")) faceflg = 2;
else if (message.equals("ANGER")) faceflg = 3;
else if (message.equals("SADNESS")) faceflg = 4;
}
void setup() {
RGB.control(true);
RGB.color(0, 0, 0);
// connect to the mqtt server
client.connect("sparkclient");
// subscribeする
if (client.isConnected()) {
client.subscribe("/HVC/spark");
}
}
void loop() {
if (client.isConnected())
client.loop();
// 表情で何らかの処理(LEDピカー!!とかサーボ動かしたりやりたい放題)
switch (faceflg) {
.....
}
ちなみに、iOS側のpublish側はSDKに付いている内容だと、こんな感じでサクッと。
NSString *expression;
switch(fd.exp.expression){
case HVC_EX_NEUTRAL:
expression = @"NEUTRAL";
break;
case HVC_EX_HAPPINESS:
expression = @"HAPPINESS";
break;
case HVC_EX_SURPRISE:
expression = @"SURPRISE";
break;
case HVC_EX_ANGER:
expression = @"ANGER";
break;
case HVC_EX_SADNESS:
expression = @"SADNESS";
break;
}
[client connectToHost:@"hogehoge.com"
completionHandler:^(MQTTConnectionReturnCode code) {
if (code == ConnectionAccepted) {
[client publishString:expression
toTopic:@"/HVC/spark"
withQos:AtMostOnce
retain:NO
completionHandler:^(int mid) {
NSLog(@"message has been delivered");
}];
}
}];
この部分はopenFrameworks側で処理をしても問題無い(というか、その方が分離という意味では良いと思われ)。普通のMacOS上でも多分、少し修正すれば動くと思うけど、NodeJS/nobleとかでチョコチョコっといじって動かした方が便利だと思う。
といった感じで全部構成完了という感じ。このMQTTを使うパターンは他でもわりと使っていて、何気に自分は好き。サクッと配信して使いたい・処理したい人だけsubscribeすれば良いからね。


