睡眠管理できる「IoT枕」を作ったよ! ArduinoとLoRaWANモジュールで傾き検知:高町咲衣のカワイイ♡IoT

f:id:yujihsmt:20190426210632j:plain

こんにちは! 歌手声優&エンジニアのさきです。普段は歌手や声優、IoT女子としても活動しています! カワイイ、女性が使いたいIoTをコンセプトに発信していきます。

睡眠管理アプリの弱点

さて、ついつい開発に夢中になってしまい、就寝時間が遅くなって寝不足……という人はあまりいないかもしれませんが、毎日を健康に過ごすために睡眠はとっても大切です。女性は美容のためにも!

最近はスマホアプリで睡眠時間を管理できるものがあります。これらは、布団やベッドの上にスマホを置いておき、傾き検知などによって睡眠を管理しますが、私は眠るときにスマホをなるべく遠くに置くので、そういったアプリが使えません。だってスマホが手の届く範囲にあると、なんと私、眠りながらアラーム止めてしまうんです……。恐ろしい。

そうじゃなくても、眠る前にスマホを所定の位置に置き忘れると睡眠の計測ができないので、寝落ちしがちな人や寝相が悪い人も、これらのアプリを利用しにくいのではないかと思います。そこでいろいろ考えた結果、「そうだ、枕自体をIoT化すればいいんだ」という結論にたどり着きました!

「IoT枕」の仕組み──ArduinoとLoRaWANモジュールで傾きを記録

f:id:yujihsmt:20190426210739j:plain
今回自作したIoT枕

仕組みはとても簡単です。ジャイロセンサーの値を「Arduino」で取得し、「LoRaWANモジュール」でデータを送信します。以下で詳しく説明します。

ジャイロセンサー

別名、「角速度センサー」「傾きセンサー」などとも言います。X、Y、Z軸の3方向の傾き具合を検知し、数値でデータを取得できるセンサー。現代のスマートフォンにはほぼ必ず、というか、まず間違いなく搭載されています。

IoT枕を作る上で、「枕に頭が乗っているかどうか」を検知するために、ジャイロセンサーを使いました。枕に頭を乗せると、当然枕は沈み込みます。このときの傾きを検知して、「頭が乗っているかどうか」を検知しています。

何度か実験した結果、私の使っている枕だと、ちょうど眠る態勢になったときに「初期位置に対して3%以上(平均5%)の傾き」が発生することがわかりました。なので、プログラム側では傾き変化率3%を目安として、条件分岐するように設定します。

ちなみに、そのまま枕に仕込んでしまうと、何かの拍子に部品の足などでケガをする恐れがあるので、写真のようにケースに入れた状態で枕に仕込みました!

f:id:yujihsmt:20190426210845j:plain
ジャイロセンサーをケースに入れて枕の中へ

マイコンボード「Arduino」

デバイス開発でおなじみのマイコンボード「Arduino」。ラズパイ(Raspberry Pi)などでも同じような処理はできるのですが、使っているジャイロセンサーの信号がアナログであること、データ送信にセンスウェイのLoRaWAN*1モジュールを使うことから、今回はArduinoを採用しました(ラズパイはアナログ信号をそのままでは扱えません)。

主な役割は、次の2つです。


1. ジャイロセンサーの傾き具合から「枕に頭が乗っているか」を判断する
2. 「枕に頭が乗っているか」が変化したときに、LoRaWANモジュールで現在の状態を送信する

これらに加えて、「ジャイロセンサーの初期位置」のリセットもしています。毎日寝ていると枕の位置がズレたり、中の綿がヘタって傾き具合が変わったりするので、定期的に位置のリセットをかけないと、いずれ「常に傾き変化率5%以上」などとなってしまうためです。

Arduinoのタイマーライブラリを使って、確実に私の寝ていない時間帯、毎日14時ごろに位置をリセットするようにしました。

LoRaWANモジュール

センスウェイの「LoRaWAN Shield for Arduino」を使いました。LoRaWAN方式の電波通信でデータを送信しています。送信コマンドなどはすべてArduino側から制御する形です。

詳しくは後述しますが、データはMQTTで取得できるので、Node-REDのMQTTノードを使ってデータを取得しています。

f:id:yujihsmt:20190426211050j:plain
ArduinoとLoRaWANモジュールを接続し、ジャイロセンサーも接続した状態

使用するソフトウェア

簡単に使うソフトなどを説明します。今回私はVPS上に用意しましたが、ラズパイを24時間稼働させておいても実現可能です。

Node-RED

とっても便利なソフトウェアです。簡単な動作ならば、コーディングなしでプログラムを組めます。データベースソフトとの連携もできるので、かなり応用が利きます。

今回は、


  • MQTT*2でデータを取得
  • Mysql(データベース)との連携
  • 自動メール送信
  • Googleスプレッドシートへの自動書き込み(HTTP POST)


などの目的で使っています。

Mysql
データベースソフトのひとつです。WEB系で使用されることが多いイメージがあります。「今寝ているのか寝ていないのか」という情報を常に保持しておきたいのですが、Node-REDで変数を保持し続けるのはちょっと大変です。なので、Mysqlに状態を保存し、適宜Node-RED側で読み出すような形で使っています。

数値の変化で寝ているかを判断、「寝なさい」メールを送信

厳密に言うと、Arduinoとジャイロセンサーで微細な傾きの変化を取得しているので「レム睡眠」と「ノンレム睡眠」の判別もできると思うのですが、それにはけっこうなデータサンプルが必要(少なくとも私ひとり分のデータでは難しい)です。なので、今回取得するデータはずばり、「寝ている」か「寝ていない」かだけ。1か0かです。

「寝なさい」メール

Node-REDを使うと簡単にメールを送信できます。これを利用して、たとえば毎晩22時に「寝ていない」状態だったならば、「もう遅いですよ~!お布団に行って寝なさい!」というようなメールをスマホに送ることもできます。

私の場合、集中すると1回や2回のメール程度では気が付かないことがあるので、寝るまでずっと「寝なさい」メールを5分間隔で送り続けるようにしました!さすがにうるさいので気がつきます…。

睡眠時間をGoogleスプレッドシートに自動記録

Node-REDからGoogleスプレッドシートに自動で書き込めるので、これを利用して、毎日の睡眠を記録してみました。


  • 就寝時間
  • 起床時間
  • 睡眠時間


をすぐに見れます。

記録を取ることで、今月は忙しすぎたなあ、寝てないなあとか振り返って生活習慣を見直せます! 私は日々の体調をスマホアプリに5段階評価でつけているのですが、自動記録したスプレッドシートと見比べてみると、思っていたよりもずっと、私の体調は睡眠時間に左右されているようです。

5時間以下の睡眠しか取れていない日だと、体調は「普通~とても悪い」なことが多く、8~10時間眠った日はいい体調なことが多いです。しかし、逆に10時間以上眠った日は体調がかえってよくないようです。たくさん寝ればいいというわけでもなく、最適な睡眠時間(例えば私なら8~10時間)というものがあるということがわかりました。

今まではお仕事のある日だけアラームをかけていましたが、お休みの日も、自分の適性睡眠時間内で起きれるようにアラームをセットしたほうが、1日を快適に過ごせそうです。

もっと改良して、レム睡眠とノンレム睡眠の検知もできるようになるといいなあ!

文・写真:高町咲衣(Twitter:@takamachi1saki

福岡県出身の、歌手・声優、兼エンジニア。IoTの開発が好きで、よく電子工作したりArduinoスケッチを書いたりしています。 「IoT女子」としても活動中。趣味はアニメ鑑賞、美味しい物めぐり。紅茶の美味しいお店が大好きです。 最近の悩みは、冬場ならではの静電気。うっかりArduinoに触ると……。

こちらも合わせてご覧ください
edge.tsumug.com

*1:LoRaWAN...... LPWA(Low Power Wide Area Network) と呼ばれる無線通信規格のひとつで、省電力で広域をカバーすることが目的のサブギガHz帯の無線通信規格。基本だれでも使える。

*2:MQTT...... Message Queuing Telemetry Transportの略で、軽量で短いメッセージを高い頻度で送受信するのに適したTCP/IPで利用可能なプロトコル。IoTのように常にデータを送るような場合によく使われる。(詳細は前回記事を参照)

株式会社 tsumug | 〒810-0041 福岡市中央区大名 2 丁目 6-11 FUKUOKA growth next 301