編集履歴一覧に戻る
naranavinのアイコン画像

naranavin が 2021年05月15日10時40分19秒 に編集

コメント無し

本文の変更

[デモ動画](https://youtu.be/TOcAz77ixhE) [ ![キャプションを入力できます](https://camo.elchika.com/43c1a88fcb3b87e56a5f1cb50cb5f0360c616e53/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34353963343863342d396266302d346137362d383737612d6535363366326365623735652f33303837356639652d333930362d346561372d616237392d636338346430616137313132/) ](https://youtu.be/TOcAz77ixhE) う さ 耳 型 O bniz 食 い し ば り 防 止 器(肩 こ り を う さ 耳 で 克 服 せ よ) ブロック図 ![キャプションを入力できます](https://camo.elchika.com/5a4572a06b8c1052668ef3172401a297b8c38939/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34353963343863342d396266302d346137362d383737612d6535363366326365623735652f65653834323362622d613565342d346263612d626539322d653531633636643064646435/) 1. 外観 ![キャプションを入力できます](https://camo.elchika.com/930445912998ceec833292ffe116931bdc32ab11/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34353963343863342d396266302d346137362d383737612d6535363366326365623735652f34396436383931322d383665312d346631332d383534302d303334326534383464663262/) ![キャプションを入力できます](https://camo.elchika.com/059f7ca0aab29b02b6b5d4698a5679be7f067619/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34353963343863342d396266302d346137362d383737612d6535363366326365623735652f39343665666536622d306130312d343562382d623038312d323766326164383463346439/) ![キャプションを入力できます](https://camo.elchika.com/802076e8f6f39269ac36f7e8df37011db51b6ee3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34353963343863342d396266302d346137362d383737612d6535363366326365623735652f65373438653866352d613265362d343737392d626339312d326234396364373865386561/) 2. 仕様 - うさ耳カチューシャ型 - 側頭筋の筋電位で食いしばりを検出する - 食いしばりを検知するとその方のうさ耳を目に動かす。 - 食いしばりが5秒以上続いたらLINEに通知を送る。かつ両方のうさ耳を前後に動かす。 - JavaScriptを使用する。 - 髪がある部分で計測する - バッテリー駆動 3. 部品

+

| 品 名 | 個数| 備考 | |:---:|:---|:---| | obniz Board 1Y | D | Gifted| | サ ー ボ モ ー タ   SG90 | 2 |Amazon | | う さ 耳 カ チ ュ ー シ ャ | 1 |ダイソー | |筋 電 位 ア ン プ 自 作 | 1 |ADS1292 | | リ チ ウ ム バ ッ テ リ ー 3.7V 800 m Ah | 1 |携 帯 電 話 予 備 バ ッ テ リ ーAmazon | | 乾 式 電 極 自 作 | 2 | 3極構成 | 4. 配線 ![キャプションを入力できます](https://camo.elchika.com/814af4fbc5235ea7e41097accd9725cc02065c76/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34353963343863342d396266302d346137362d383737612d6535363366326365623735652f64653333396634632d663530362d343463342d383532372d353837663538623137636234/) • 0: サ ー ボ 1 • 1: サ ー ボ 2 • 10 :ADC1( 左 ) • 11 :ADC2( 右 ) 5. プログラム 食 い し ば り が発生し積分筋電位の上昇を 検 出 し た ら う さ 耳 を 動 か す 、 3 秒 以 上 な ら LINE 通 知 ```arduino:食いしばり防止 // うさ耳obniz食いしばり防止器 const fs = require("fs"); const request = require("request"); const Obniz = require("obniz"); const LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"; const TOKEN = "LINEのトークンコード"; const MESSAGE = "--食いしばりが発生しました--"; const HEADERS = { "Content-Type": "application/x-www-form-urlencoded", "Authorization": "Bearer " + TOKEN }; const OPTIONS = { url: LINE_NOTIFY_URL, method: "POST", headers: HEADERS, json: true, form: { message: MESSAGE } } var send = false; var obniz = new Obniz("obniz-ID"); var flag1 = false; var flag2 = false; var timer1 = new Date(); var timer2 = new Date(); var timer3 = new Date(); var count = 0; var timer = new Date(); var ad1 = 0; var ad2 = 0; //うさ耳のサーボ var Mid1 = 110; //サーボ中央位置 var Mid2 = 90; var Front1 = 00; //サーボ前位置 var Front2 = 180; var Back1 = 140; //サーボ後ろ位置 var Back2 = 10; var Th = 0.3; //しきい値 var Long = 3000; //継続噛み締め通知時間sec obniz.onconnect = async function () { var servo1 = obniz.wired("ServoMotor", {gnd:3, vcc:2, signal:0}); var servo2 = obniz.wired("ServoMotor", {gnd:3, vcc:2, signal:1}); obniz.repeat(async () => { obniz.ad10.start((voltage) => { //左側の筋電位 ad1 = voltage; }); obniz.ad11.start((voltage) => { //右側の筋電位 ad2 = voltage; }); // leftしきい値 if(ad1 > Th ){ console.log("ad1:"+ad1); if(flag1 == false){ servo1.angle(Front1); flag1 = true; timer1 = new Date(); console.log("left ON"); } //timer1 = Date(); timer = new Date(); console.log("time:"+(timer.getTime() -timer1.getTime() )); }else{ servo1.angle(Mid1); flag1 = false; } //rightしきい値 if(ad2 > Th ){ if(flag2 == false){ servo2.angle(Front2); console.log("righ ON"); flag2 = true; timer2 = new Date(); } }else{ servo2.angle(Mid2); flag2 = false; } if(ad1 <= Th && ad2 <= Th ){ //両方しきい値以下 servo1.angle(Mid1); servo2.angle(Mid2); send = false; flag1 = false; flag2 = false; } timer = new Date(); if((flag1 == true && (timer.getTime() - timer1.getTime()) > Long) || (flag2 == true && (timer.getTime() - timer2.getTime()) > Long)){ //噛み締めが継続した console.log("Long kamikami "+(timer.getTime() - timer1.getTime()) + " " + (timer.getTime() - timer2.getTime())); if(send == false){ send = true; count = 0; console.log("line tingth send!"); await request(OPTIONS, async(error, response, body) => { console.log(body); if(error){ console.log(error); } }); } //長い噛み締め 交互に耳を振る timer = new Date(); if(timer.getTime()-timer3.getTime()>800){ count++; timer3 = new Date(); if(count == 1){ servo1.angle(Back1); servo2.angle(Front2); }else if(count == 2){ servo1.angle(Front1); servo2.angle(Back2); count = 0; }else{ servo1.angle(Mid1); servo2.angle(Mid2); count = 0; } } } },300); } obniz.onclose = async function() { } ``` 6. 感 想 • Line の 通 知 は 思 っ た 以 上 に 簡 単 だ っ た 。 • 初 め て の JavaScript だ っ た の で そ こ は 苦 労 し ま し た 。 • Ambient に 食 い し ば り の デ ー タ を 保 存 し た か っ た が 時 間 切 れ • 髪 の 毛 が 生 え て い る 部 位 か ら 筋 電 位 が 取 れ る よ う に な っ た の は 大 き な 収 穫 で し た 。