2015/12/17

姿勢監視チェッカー作ってみた

by JINS MEME
JINS MEME Advent Calendar 2015 17日目の記事です。
姿勢監視.gif

JinsMEME × PhilipsHue

JinsMEMEの加速度センサーをインプットとして使って、アウトプット先をPhilipsHueのLEDライトにして、猫背になったら赤く点滅し、正しい姿勢になるとアラートなしの通常のライトに戻るというのを作ってみました。


デスクワーカーのために

ホワイトカラー、デスクワーカーのために。
PCでの長時間仕事をするとなるとどうしても、背中が曲がってきがちです。
猫背になると赤く点滅させるという物理的な現象を発生させ、まわりの人の迷惑にならないように、意識します。
またライトがちかちかして鬱陶しいので、反射的に良い姿勢を維持しようとするのでよいです。猫背にも前傾猫背や後傾猫背など左右のねじれなどがあると思いますが、今回は前傾になった際に加速度センサーx軸のある一定の敷居値を超えたらという判定でアラートしています。
日常的に姿勢を観察し、正しい姿勢を維持することによって、腰痛の予防や、日々の姿勢を見直すきっかけになればいいなと思っています。

仕組み

JINS MEME→iOS→Philips Hue
JINS MEMEからiOSにBluetoothでデータを送信、
iOS側データを取得、iOSからwifi経由でPhilips Hueを操作
言語はSwiftで書き、Hueを操作するためのSDKを利用しています。
The hue Apple SDK by Philips
https://github.com/PhilipsHue/PhilipsHueSDK-iOS-OSX

必要なもの、環境

実装 

作成したAppCilentIDとClientSecretを以下の****の場所にセットします。
AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        MEMELib.setAppClientId("*********************", clientSecret: "*********************")
        return true
    }
  • SwiftからObjective-Cのクラスを利用するためにBridging-Header.hを作成 HueSDK_iOSとSDKWizardの中のPHLoadingViewController,PHBridgeSelectionViewController,PHBridgePushLinkViewController プラス Meme用にMEMELibを記述
Bridging-Header.h
#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "PHLoadingViewController.h"
#import "PHBridgeSelectionViewController.h"
#import "PHBridgePushLinkViewController.h"
#import 

#import 


#endif /* Bridging_Header_h */

Hue bridgeとの接続

詳細に関してはこちらをご覧ください。
http://www.developers.meethue.com/documentation/apple-api-guide

猫背になったら、アラート

MEMEからのリアルタイムデータ取得の部分と、Hueのライト変更箇所を抜粋
ライセンスはMITです。ご自由にどうぞ。
MMDataViewController.swift
    var memeRealTimeData:MEMERealTimeData?

    func memeRealTimeModeDataReceived(data: MEMERealTimeData!) {

        self.memeRealTimeData = data
        if let d = self.memeRealTimeData as MEMERealTimeData?{

            // 猫背判定
            let accX = d.accX
            if  (Int(accX) <= -3){

                // red
                self.updateLight(0, isAlert: true, isRandom: false)
            }
         }
    }

    func updateLight(hueValue:Int, isAlert:Bool, isRandom:Bool){

        let cache = PHBridgeResourcesReader.readBridgeResourcesCache()
        let bridgeSendAPI = PHBridgeSendAPI()

        for light in cache!.lights!.values {
            // don't update state of non-reachable lights
            if light.lightState!.reachable == 0 {
                continue
            }

            let lightState = PHLightState()
            if light.type == DIM_LIGHT {
                // Lux bulbs just get a random brightness
                lightState.brightness = Int(arc4random()) % 254
            } else {

                // アラートの場合
                if isAlert {
                    // 点滅中
                    if lightState.alert == ALERT_SELECT {
                        break
                    }
                    lightState.alert = ALERT_SELECT
                }

                // ランダム点灯
                if isRandom {
                    lightState.hue = Int(arc4random()) % 65535
                }else{
                    lightState.hue = hueValue
                }

                lightState.brightness = 254
                lightState.saturation = 254
            }

            // Send lightstate to light
            bridgeSendAPI.updateLightStateForId(light.identifier, withLightState: lightState, completionHandler: { (errors: [AnyObject]!) -> () in

                if errors != nil {
                    let message = String(format: NSLocalizedString("Errors %@", comment: ""), errors)
                    print("Response: \(message)")
                }
            })
        }
    }

ビルド実行

初期ロード時にHueとの接続、Scanして、MEMEと接続。
MEMEをかけた状態で、前傾姿勢になってみてください。

今後の展開

今回もJINS MEMEで遊んでみました。JINS MEME × Something(Thing to Thing)というのはいくらでもあります。
今回はローカルでのアラート点灯ですが、インターネット越しにリモートのデバイスを動かすようなことも可能で実装済みですので、公開していきたいと考えています。
AWS IoTでデバイス間の状態を検知して、M2M(Machine to Machine)の世界を実現できるのではないかと、わくわくしています。

ではまた。