オムロン HVC-Cを使った開発

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すれば良いからね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください