第1回:ラズパイ・ゼロとローム・センサメダルで健康管理をサポートするデバイスを作ろう!
第2回:センサの値から歩数、距離、カロリーを計算して、LINEに送信!
第3回:ラズパイとセンサで作る小型健康管理ウェアラブルデバイス!
ディスプレイを付けて、ウェアラブル健康機器に仕上げる
こんにちは、ヨシケンです!
運動不足解消のための健康管理デバイスの制作もいよいよ最終回。今回はこれまで取得した歩数情報や心拍数などを小型ディスプレイに表示させてみたいと思います。ウェアラブルな時計型にして、いつでも情報を見ることができるようにしてみましょう!
今回の記事で必要な物一覧
Raspberry Pi Zero W
Seeed ReSpeaker Mic-2 Hat
Seeed Grove OLED Display
ハートレートセンサ
ローム・センサメダル (SensorMedal-EVK-002)
LiPoバッテリー
今回の記事の流れ
1. Seeed Grove OLEDを使って画面表示
前回はラズパイ・ゼロに心拍センサを接続しました。今回はさらにディスプレイを付けるため、ラズパイ・ゼロにぴったり合うSeeed ReSpeakerハットを使用します。
このデバイスにはSeeed Groveの端子に対応したソケットが2つ付いているので、とても便利です。それではこのハットをラズパイにセットして、電源を入れます。
以下のサイトからハットのソフトウェアを取得し、インストールします。
pi@raspizero:~/ $ git clone https://github.com/respeaker/seeed-voicecard.git pi@raspizero:~/ $ cd seeed-voicecard pi@raspizero:~/ $ sudo ./install.sh --compat-kernel pi@raspizero:~/ $ reboot
またこのハットに付いているLEDを使うためのライブラリもインストールします。これでPixelsサンプルプログラムを流すと、前回のようにハット上にある3つのNeoPixelsを光らせることができます。
pi@raspizero:~/ $ sudo pip install spidev pi@raspizero:~/ $ cd ~/ pi@raspizero:~/ $ git clone https://github.com/respeaker/mic_hat.git pi@raspizero:~/ $ cd mic_hat pi@raspizero:~/ $ python pixels.py
ハットの設定ができたところで、ここにディスプレイを追加します。Grove端子を使ったこちらの128 x 64のOLEDディスプレイを使います。
このディスプレイを、ハットの向かって左、端側のGrove端子につなぎます。この端子はI2Cという接続方式に対応しています。
このディスプレイを使うためのライブラリなどを含んだソフトウェアをインストールします。以下のコマンドをラズパイで打ってみてください。
pi@raspizero:~/ $ curl -sL https://github.com/Seeed-Studio/grove.py/raw/master/install.sh | sudo bash -s - pi@raspizero:~/ $ cd grove.py pi@raspizero:~/ $ python3 grove_oled_display_128x64.py
こうするとgrove.pyというフォルダが作られ、その中に多くのGroveを使ったライブラリが格納されています。その中でgrove_oled_display_128x64.pyを使います。
このプログラムを流すと、ディスプレイ上に”hello world”の文字が見事出力されるはずです。
2. 心拍センサをつないで心拍数表示
それではハットに心拍センサもつないで、その心拍数などもディスプレイに表示してみましょう。ハットの真ん中のGrove端子と心拍センサを接続してください。
このGrove端子はラズパイのGPIO12につながっています。また先ほどのOLEDプログラムをコピーして、grove_oled_heart.pyプログラムを作り、以下の記述を追加します。
pi@raspizero:~/ $ sudo cp ~/grove.py/grove_oled_display_128x64.pysudo ~/Programs/grove_oled_heart.py ---- #!/usr/bin/env python import time from collections import deque import RPi.GPIO as GPIO import datetime class HeartRateMonitor: INTERRUPT_PIN = 12 MAX_DETECTED_TIMES_COUNT = 20 MAX_PULSE_INTERVAL = 2.0 ... #print("HeartRate: {heart_rate}, Interval: {interval}".format(heart_rate = heart_rate, interval = interval)) return heart_rate def execute(self): display = GroveOledDisplay128x64() display.set_cursor(0, 0) display.puts("RasPi Health") print('Please ready your heart rate monitor.') time.sleep(3) while True: display.set_cursor(1, 1) time_str = datetime.datetime.now().strftime("%H:%M:%S") display.puts(time_str) GPIO.wait_for_edge(self.INTERRUPT_PIN, GPIO.RISING) heart_rate = self._interrupt() if heart_rate is not None: display.set_cursor(3, 1) hr = round(heart_rate) print(hr) display.puts("HR: "+str(hr)+" BPM") from grove.i2c import Bus ... class GroveOledDisplay128x64(object): ... def main(): monitor = HeartRateMonitor() while True: monitor.execute() if __name__ == "__main__": main()
このプログラムを流すと、このように心拍数が中央に表示されるようになりました。
3. ウェアラブル・ウォッチにして完成!
最後に外装などを作ってウェアラブルなものにしましょう。まず、小型のリチウムポリマーバッテリを使って、ラズパイ・ゼロに給電できるようにします。
ハットにディスプレイと共に心拍センサもつなぎ直します。ディスプレイが見えるような外装や時計バンドなども付けてみます。
最後にセンサメダルのBLE計測プログラムと心拍センサを並列して動かすようなシェルスクリプト(ble_steps_heart_oled.sh)を作ります。nohupで指定したOLED画面表示プログラムはバックグラウンドで動くようになり、センサメダルのプログラムと並行で実行しています。
#!/bin/bash nohup sudo python3 /home/pi/Programs/grove_oled_heart.py & sudo python3 /home/pi/Programs/ble_steps_line.py
これを「. ble_steps_heart_oled.sh」のように実行します。センサメダルの電源を入れ、心拍センサも指などに付けます。
そうすると、20秒ほどしてから心拍数がディスプレイに表示され始めます。また、センサメダルの数値も取り出し、ある特定の歩数を歩くとLINEにその結果を送信してくれます。
4. まとめ
今回は、1日の歩いた歩数を測ったり、心拍数を計測して、それをウェアラブルデバイスの小型ディスプレイに表示させる方法を紹介してきました。センサメダルからは様々な数値が取れ、これを小型のラズパイ・ゼロに送信して、データを表示したり、LINEに投稿したりする方法がご理解頂けたのではないでしょうか?
このウェアラブルデバイスを使うと、「ずっと家の中にいるけど、何歩くらい歩いたかな?」とか、「緊張したミーティングの時は結構心拍数上がっているな…」といったように、自分の体の情報を簡易に取得することができます。今回の方法を使って、他にもさまざまなセンサで自分の体の状態を計測し、運動不足解消や健康管理に役立ててみるのも面白いかもしれないですね!
今回の連載の流れ
第1回:ラズパイ・ゼロとローム・センサメダルで健康管理をサポートするデバイスを作ろう!
第2回:センサの値から歩数、距離、カロリーを計算して、LINEに送信!
第3回:ラズパイとセンサで作る小型健康管理ウェアラブルデバイス!
第4回:ディスプレイを付けて、ウェアラブル健康機器に仕上げる(今回)