LoginSignup
1
1

obnizで反射神経を鍛えておばあちゃんの健康寿命を延ばす

Last updated at Posted at 2023-05-02

昨年末90歳の大叔母が寝たきりになってしまいました

原因は転倒による大腿骨骨折でした。
高齢者にとって足の骨折は命取り。寝たきりになると、認知症が進行するケースが多いと病院で聞かされました。以前は一人暮らしをするほど元気でしたが、施設に入所することが決まりました。

すると今度は80歳のおばあちゃんも転倒により骨折。転んだ時にうまく手をつけず、腕の骨が折れてしまいました。

腕の骨だったのが不幸中の幸いでしたが、おばあちゃんもいつ足の骨を折るかわかりません。老化による骨の劣化までは止められませんが、せめて転んだ時にすぐに手をつけるよう、おばあちゃんの反射神経を鍛えて健康寿命を延ばすことはできないか。

そんな思いで作ったプロダクトがこちら:information_desk_person:

反射神経鍛える君

使ったもの

今回はユーザの使用感を見てプロダクトの改善を図りたいと考えているので、簡単にIoTプロトタイプを作ることができるobnizを使用しました。
使用したパーツはスピーカーLED信号です。
S__38354948.jpg]

プログラミングはローコードツールのNode-RED(Railwayでデプロイ)を使用しています。

実装!

Node-REDにて以下のようなフローを作成しました。インポートして利用できるJSONも併せて載せておきます!

フロー図

image.png

JSON

JSON
[{"id":"b89aa97ba32885de","type":"tab","label":"フロー 1","disabled":false,"info":"","env":[]},{"id":"cb1d6d3a.017e1","type":"debug","z":"b89aa97ba32885de","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":490,"y":320,"wires":[]},{"id":"11a346f0.5a4c19","type":"obniz-function","z":"b89aa97ba32885de","obniz":"","name":"","code":"function beep_finish() {\n    obnizParts.Speaker.play(1661);\n    obniz.wait(100);\n    obnizParts.Speaker.play(1397);\n    obniz.wait(100);\n    obnizParts.Speaker.play(1661);\n    obniz.wait(100);\n    obnizParts.Speaker.play(1397);\n    obniz.wait(100);\n    obnizParts.Speaker.play(1661);\n    obniz.wait(100);\n    obnizParts.Speaker.play(1397);\n    obniz.wait(100);\n    obnizParts.Speaker.stop();\n}\n\nmsg.payload = \"finish\"; \nbeep_finish();\nawait obniz.wait(1000); \nobniz.close();\n\nreturn msg;","x":320,"y":320,"wires":[["cb1d6d3a.017e1"]]},{"id":"76e43759.3dff68","type":"inject","z":"b89aa97ba32885de","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":140,"y":320,"wires":[["11a346f0.5a4c19"]]},{"id":"5fa9057f.f2e0ac","type":"obniz-repeat","z":"b89aa97ba32885de","obniz":"","name":"スピーカーを鳴らす処理","interval":"500","code":"msg.payload = await obniz.switch.getWait();\nvar color = flow.get('light_color');\n\nfunction beep_ok() {\n    obnizParts.Speaker.play(1760);\n    obniz.wait(100);\n    obnizParts.Speaker.play(1397);\n    obniz.wait(200);\n    obnizParts.Speaker.stop();\n    obniz.display.clear();\n    obniz.display.print('OK');\n}\n\nfunction beep_ng() {\n    obnizParts.Speaker.play(554);\n    obniz.wait(400);\n    obnizParts.Speaker.stop();\n    obniz.display.clear();\n    obniz.display.print('NG');\n}\n    \nif (msg.payload == 'left' && color == 'green') {\n    beep_ok();\n} else if (msg.payload == 'push' && color == 'yellow') {\n    beep_ok();\n} else if (msg.payload == 'right' && color == 'red') {\n    beep_ok();\n} else {\n    beep_ng();\n}\n\nreturn msg;","x":130,"y":100,"wires":[["a9f13b125adf7385"]]},{"id":"ebafa559.00b978","type":"obniz-function","z":"b89aa97ba32885de","obniz":"","name":"緑を0.5秒光らせる","code":"obnizParts.Keyestudio_TrafficLight.green.on();\r\nobniz.wait(500);\r\nobnizParts.Keyestudio_TrafficLight.green.off();\r\nreturn msg;","x":630,"y":160,"wires":[["7e05459ad3fd30f2"]]},{"id":"a9f13b125adf7385","type":"function","z":"b89aa97ba32885de","name":"0~2の乱数生成","func":"msg.num = Math.floor(Math.random() * 3);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":200,"y":200,"wires":[["0edca2863cfb8b09"]]},{"id":"0edca2863cfb8b09","type":"switch","z":"b89aa97ba32885de","name":"0:緑、1:黄色、2:赤","property":"num","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"num"},{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"2","vt":"num"}],"checkall":"true","repair":false,"outputs":3,"x":410,"y":200,"wires":[["ebafa559.00b978"],["056a6b688ad59698"],["4924219050bcb73a"]]},{"id":"056a6b688ad59698","type":"obniz-function","z":"b89aa97ba32885de","obniz":"","name":"黄を0.5秒光らせる","code":"obnizParts.Keyestudio_TrafficLight.yellow.on();\r\nobniz.wait(500);\r\nobnizParts.Keyestudio_TrafficLight.yellow.off();\r\nflow.light_color = 'yellow';\r\nreturn msg;","x":630,"y":200,"wires":[["f1482d093f396868"]]},{"id":"4924219050bcb73a","type":"obniz-function","z":"b89aa97ba32885de","obniz":"","name":"赤を0.5秒光らせる","code":"obnizParts.Keyestudio_TrafficLight.red.on();\r\nobniz.wait(500);\r\nobnizParts.Keyestudio_TrafficLight.red.off();\r\nflow.light_color = 'red';\r\nreturn msg;","x":630,"y":240,"wires":[["fc7f328505e1a928"]]},{"id":"7e05459ad3fd30f2","type":"change","z":"b89aa97ba32885de","name":"light_color変数代入(緑)","rules":[{"t":"set","p":"light_color","pt":"flow","to":"green","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":840,"y":160,"wires":[[]]},{"id":"f1482d093f396868","type":"change","z":"b89aa97ba32885de","name":"light_color変数代入(黄)","rules":[{"t":"set","p":"light_color","pt":"flow","to":"yellow","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":840,"y":200,"wires":[[]]},{"id":"fc7f328505e1a928","type":"change","z":"b89aa97ba32885de","name":"light_color変数代入(赤)","rules":[{"t":"set","p":"light_color","pt":"flow","to":"red","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":840,"y":240,"wires":[[]]},{"id":"decfb1e918d894a0","type":"comment","z":"b89aa97ba32885de","name":"↓ノードを停止させる処理","info":"","x":170,"y":280,"wires":[]}]

ルール

以下の操作をしたときを「正解」とし、「ピンポン!」音を鳴らします。

  • 緑信号が光ったときにobnizのスイッチをに倒す
  • 黄信号が光ったときにobnizのスイッチを押す
  • 赤信号が光ったときにobnizのスイッチをに倒す

それ以外の操作は「不正解」とし、「ブー」音を鳴らします。

ロジック

  1. 012をランダムに生成
  2. 0だったら緑1だったら黄2だったら赤の信号を光らせ、光った信号の色をlight_colorフロー変数に保持させる
  3. 以下の場合「ピンポン!」音を鳴らし、それ以外は「ブー」音を鳴らす
    • light_color変数がgreenのとき、スイッチがに倒されている
    • light_color変数がyellowのとき、スイッチが押されている
    • light_color変数がredのとき、スイッチがに倒されている

obnizのスイッチの値を受け取る処理はobniz-repeatノードで行う必要があったため、本来フローの最後にあるべきロジック3の処理をフロー冒頭のスピーカーを鳴らす処理内で行っています。

スピーカーを鳴らす処理のコードはこちら:information_desk_person:
JavaScript
msg.payload = await obniz.switch.getWait();
var color = flow.get('light_color');

function beep_ok() {
    obnizParts.Speaker.play(1760);
    obniz.wait(100);
    obnizParts.Speaker.play(1397);
    obniz.wait(200);
    obnizParts.Speaker.stop();
    obniz.display.clear();
    obniz.display.print('OK');
}

function beep_ng() {
    obnizParts.Speaker.play(554);
    obniz.wait(400);
    obnizParts.Speaker.stop();
    obniz.display.clear();
    obniz.display.print('NG');
}
    
if (msg.payload == 'left' && color == 'green') {
    beep_ok();
} else if (msg.payload == 'push' && color == 'yellow') {
    beep_ok();
} else if (msg.payload == 'right' && color == 'red') {
    beep_ok();
} else {
    beep_ng();
}

return msg;

おばあちゃんの反射神経は鍛えられるのか!?

今回は実際に御年80歳のおばあちゃんに反射神経鍛える君を使ってもらいます:older_woman:
S__38313987.jpg

おばあちゃんの反射神経が鍛えられたかどうかは、棒落とし(反射神経)テスト(大阪府警察HP)の結果で確認します。
反射神経鍛える君を使う前と後で結果が向上すれば、反射神経鍛える君のトレーニング効果を実証できたといえるでしょう!

実験!

1. 棒落としテスト(挑戦前)

3回挑戦したうち、2回は失敗してしまいました。
成功した1回の23cmを挑戦前の記録とします。
S__38313991.jpg

2. 反射神経鍛える君に挑戦:older_woman:

数回に分けて5分間ほど挑戦してもらいました。

3. 棒落としテスト(挑戦後)

3回のうち2回成功!記録も8cmと、挑戦前の23cmから15cm向上しました:raised_hands:
S__38313989.jpg

実験の結果より、反射神経鍛える君には一定程度反射神経を鍛える効果があることがわかりました:clap:

被験者(おばあちゃん)の感想

:older_woman:結構面白かった」とのことでした!
プロダクトのサービス向上のため、改善点のフィードバックをいただきました!

:older_woman:「スイッチが動かしにくかった」

高齢者になると手が乾燥するため、obnizのスイッチが滑って動かしにくかったようです。スイッチ部分に高齢者が動かしやすくなる工夫をする必要がありそうです。

:older_woman:「ゲームの結果によって脳年齢がわかるとよい」

スコアが出て自分の成長がわかると良いのではないかとのことでした。
正解数に応じてスコアを出す機能は検討しましたが、うまく実装することができませんでした。ゲーム性があれば楽しく続けてもらえると思うので、引き続き実現できる方法がないか調査を進めます!

ユーザ:older_woman:の生の声を聞く

プロトタイプを作り、ターゲットとするユーザに使ってもらうことで、作っているときには気が付かなかったユーザのニーズを知ることができました。
今後も机上のアイデアだけでものづくりをするのではなく、ユーザの生の声を聞く姿勢を大切にしたいと思います!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1