ヘッドレストと頭の距離を計測して顔を画面へ突き出したら音で教えるobnizで首コリ頭痛を防ごう


こめかみが締め付けられるような頭痛があり、整体師さんから「首の上の筋肉まで固まってますね。」と首と頭の付け根に鍼を6本も打たれました。パソコン作業で顔を前に突き出す格好は首に負担がかかるのですが、集中するとついつい自覚なしにそんな態勢になってしまっています。なので、顔を画面へ突き出したらビープ音で警告してくれるシステムをobnizで作りました。
![0517-obniz-beep-top.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289676/be90d4e5-2b2b-c580-447a-f8dca902a7c8.jpeg)


## 実際に動いているところの動画

椅子のヘッドレストの上にobnizを設置して、距離センサーで頭との距離を計測して、その値によってビープ音を鳴らします。（動画のビープ音は小さめですがそれなりの音が出ています）
<iframe width="560" height="315" src="https://www.youtube.com/embed/CXetQqFx-D4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## いつもの姿勢がセンサーから何㎝なのかを計測する

私の姿勢は下図のような感じですので、obnizからの計測値をconsoleに出しながら何㎝くらいが閾値として適正なのか見極めていきました。

改めて写真に撮ってみると頭（体重の10%）が重力に引かれるのに逆らう筋肉が姿勢によって異なりそう、というのがわかります。
![アイディア-4 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289676/5e827c6e-25e7-ea91-d212-be2ffabcf5d4.jpeg)

## 席を立つときにOFF、席に戻ったらONは絶対運用しなくなる
当初想定していた「10㎝未満だと音が鳴らない。10㎝以上だと音が鳴る」という条件だと席から離れてもビープ音が鳴り続けてしまいます。「席を立つときにOFF、席に戻ったらONにする」という”運用でカバー”は絶対しなくなる自信があるので「50㎝以上だと音が鳴らない」というif文を追加しました。

## 物理法則には適わない。obnizが重力に負けて2回落ちる。

椅子がメッシュ生地なのでブレッドボードの粘着シールでは弱く、後傾姿勢になってから数分でモバイルバッテリーがobnizを巻き添えにして床に落ちました。それでモバイルバッテリーを落ちないように椅子に固定したのですがそれでもブレッドボードとobnizだけの重さで落ちました。（壊れなくて良かった…）

[「魔法のテープ 極」](https://www.amazon.co.jp/iHouse-all-%E9%AD%94%E6%B3%95%E3%81%AE%E3%83%86%E3%83%BC%E3%83%97-%E5%BC%B7%E5%8A%9B%E4%B8%A1%E9%9D%A2%E3%83%86%E3%83%BC%E3%83%97-%E3%81%82%E3%81%A8%E6%AE%8B%E3%82%89%E3%81%AA%E3%81%84/dp/B08D89N65D)という強力な両面テープを持っていたのでこれで固定しました。テグスがあればメッシュの隙間に通してブレッドボードを固定するのがいいかな、と思います。

## 意外と測定不能値が出るので1mm以上というif文を加える

当初はif文のelseでビープ音が鳴るようにしていたので計測不能値が出てもビープ音が鳴っていました。1秒単位で計測していると割と計測不能が出てしまうので「1mm以上を計測した場合はビープ音を鳴らす」というelse ifを追加して、elseでは音を鳴らさないようにしました。

##環境
Node.js	15.12.0
npm	7.6.3
obniz Board 1Y
[超音波距離センサー HC-SR04](https://obniz.io/ja/sdk/parts/HC-SR04/README.md)
[圧電スピーカー（圧電サウンダ）（１３ｍｍ）ＰＫＭ１３ＥＰＹＨ４０００－Ａ０](https://obniz.io/ja/sdk/parts/Speaker/README.md)

#コード
```distance_beep.js

const Obniz = require('obniz');
const obniz = new Obniz('【各自のobniz ID】');

obniz.onconnect = async () => {
    // 超音波距離センサを利用
    const hcsr04 = obniz.wired('HC-SR04', {
        gnd: 3,
        echo: 2,
        trigger: 1,
        vcc: 0,
    });

    // スピーカーを利用
    const speaker = obniz.wired('Speaker', { signal: 10, gnd: 11 });

    // obnizディスプレイ（初期表示）
    obniz.display.clear();
    obniz.display.print('obniz Ready');

    // setIntervalで定期実行
    setInterval(async () => {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        // 小数点以下がたくさんあるのでここでは整数にします
        distance = Math.floor(distance);
        // 距離をコンソールに表示
        console.log(distance + ' mm');
        // 距離をobnizディスプレイに表示
        obniz.display.clear();
        obniz.display.print(distance + ' mm');
        // 距離によって判定
        if(distance > 500.0){
            // 50cm より大きい場合、席を離れたと判断する。
            obniz.display.clear();
            obniz.display.print('Away From Keyboard.');
            console.log('Away From Keyboard.');
            // 音を停止する
            speaker.stop();
        }
        else if (distance < 100.0) {
            // 10cm 未満の場合、良い姿勢と判断する。
            obniz.display.clear();
            obniz.display.print('Good!!');
            console.log('Good!');
            // 音を停止する
            speaker.stop();
        }
        else if (distance > 1.0){
            // 10cm 以上　50cm未満の場合、悪い姿勢を判断する。
            // 計測不可時に音が鳴るのを防ぐため、1mm以上を条件としている。
            obniz.display.clear();
            obniz.display.print('Bad Posture!!');
            console.log('Bad Posture!!');
            // 100mm = 10cm を超えるときは300Hzで音を鳴らす
            speaker.play(300);
        }else {
            // 測定不可エラーの場合の処理
            obniz.display.clear();
            obniz.display.print('Error');
            console.log('Error');
            // 音を停止する
            speaker.stop();
        }
    }, 1000); // 1000ミリ秒 = 1秒ごとに実行
};

```
## おわりに

コードとしては難しくないので簡単に完成までもっていけると目論んでいたのですが「椅子がobnizを粘着しにくい生地だったので固定部材を探す」「甲高いビープ音が家族に不評なので低い周波数に変える」など普段のソフト開発では気にしないところにハードを組み合わせた開発の難しさがあって新鮮でした。ハードいじりは楽しいですね。

━－━－━－━－━－━－━－━－━－━－━－━－━━－━－━－━－━－━－━－━－━
2021年4月からプロトアウト（プロトタイプ＋アウトプット）スタジオに参加して、技術を学んだり自身を深掘りして卒業制作＝クラウドファンディングのテーマを決めたりしています。

金融系SEという安定稼働を最優先にガチガチに設計書を作ってバグは許さぬ、という世界で十数年やってきました。自分の性格としても独創的なアイディア出しは苦手で、決まったことを正確に効率的にこなすことが得意です。

そんな私が無事クラウドファンディングに辿り着いて成功できるのか、見守っていただけましたら幸いです。

〇情報発信
・自身とテーマ深掘り的な記事 → [note](https://note.com/shinsukesutou)
・開発中のつぶやき → [Twitter](https://twitter.com/ShinsukeSutou)