センサメダルで縄跳びの回数を計測し表示させる
こんにちは、ヨシケンです!
第1回では今回の工作の概要紹介と準備をおこないましたが、今回から早速運動不足解消のための縄跳びデバイスを作り始めます。まず、縄跳びにセンサメダルを付けて、跳んだ回数を計測してみましょう。その回数を4桁ディスプレイに数値表示させて、いつでも跳んだ回数をチェックできるようにします。
今回の記事で必要な物一覧
縄跳びジャンプロープ
ロームセンサメダル(SensorMedal-EVK-002)
ラズパイ・ゼロ(Raspberry Pi Zero W)
4文字LEDハット
今回の記事の流れ
1. センサメダルで縄跳びカウント
縄跳びデバイスを作るにあたって、もちろんですが、何でも構いませんので縄跳びを用意しましょう。できれば持ち手が太く長めのものが工作しやすいです。
次に、縄跳びの回数をカウントする方法を考えます。一番直感的なのが、縄跳びの回転する部分が一周する毎にカウントするものです。これは縄跳びの回転する末端に磁石などを付け、ホールセンサでそれを計測すればできるかもしれません。ただ、この回転部分にホールセンサを取り付け、その結果を取得する回路を組むのは、スペースの問題もあり難易度が高いです。
今回は、センサメダルの加速度センサを使って、縄跳びのグリップ部分の加速度を計測し、それを跳んだ回数としてカウントします。こうすれば、二重跳びやはやぶさ跳びの動きも捉えることができ、跳び方の測定もできるかもしれません。
それではまず、センサメダルにコイン電池CR2450をセットして、電源を入れます。電源を入れたセンサメダルを、縄跳びの持ち手の所に結束バンドなどでつなぎます。センサメダルは軽いですし、サイズもそこまで大きくないので、縄跳びを持っても邪魔にならないように付けられると思います。
次に、このセンサメダルのセンサの値を受信するために、ラズパイ・ゼロを用意します。さらに、ラズパイとセンサメダルをBluetoothでつなぐために、bluepyというライブラリをインストールします。
そして、こちらのGithub(http://github.com/bokunimowakaru/SensorMedal2)にある便利なプログラムを使用し、センサメダルから受信した数値を表示できるようにします。git cloneでプログラムをダウンロードします。
サンプルプログラムble_logger_SensorMedal2.pyを実行します。
pi@raspizero:~ $ sudo pip3 install bluepy Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting bluepy Installing collected packages: bluepy Successfully installed bluepy-1.3.0 pi@raspizero:~ $ sudo git clone http://github.com/bokunimowakaru/SensorMedal2 Cloning into 'SensorMedal2'... Unpacking objects: 100% (78/78), done. pi@raspizero:~ $ cd SensorMedal2/ pi@raspizero:~/SensorMedal2 $ sudo python3 ble_logger_SensorMedal2.py Device c5:xx:yy:zz::d0 (random), RSSI=-65 dB Short Local Name = ROHMMedal2_0107_01.00 Flags = 06 Incomplete 16b Services = 0000180a-0000 Manufacturer = 0100c86abcdef ID = 0x1 SEQ = 188 Temperature = 27.99 ℃ Humidity = 71.52 % Pressure = 998.578 hPa Illuminance = 93.3 lx Accelerometer = 1.453 g ( 0.062 0.844 1.181 g) Geomagnetic = 92.6 uT ( -15.8 -58.0 -70.4 uT) Magnetic = 0x3 Steps = 8 歩 Battery Level = 90 % RSSI = -65 dB
センサメダルでは加速度として、Accelerometerでx, y, z軸の加速度と共に、合成の重力加速度(g)を出力しています。先ほどのグラフで縄跳びの際の重力加速度は、2〜4gですが、これに近い形で、一定の重力加速度を検知して、Stepsとしての値も出力しています。今回はこの数値を縄跳びの回数として使います。
また、縄跳びした時のカロリーも計算して見ましょう。前回記事のカロリー計算で、1分間に100回ほど30分跳んだ時のカロリーが270kcalとあったので、この数値を使います。
(縄跳び1回あたりの消費カロリー = 270 kcal / 30 * 100回 ≒ 0.1 kcal / 回)
これを使ったPythonプログラム ble_jump.pyは以下のようになります。
pi@raspizero:~/SensorMedal2 $ sudo cp ble_logger_SensorMedal2.py ../Programs/ble_jump.py --- 以下、5〜7、12、16〜18、42〜55行目が変更・追記部分 --- interval = 1 #動作間隔 start_seq = 0 jump_cnt = 0 --- # 受信データについてBLEデバイス毎の処理 for dev in devices: # print("\nDevice %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi)) isRohmMedal = False sensors = dict() for (adtype, desc, val) in dev.getScanData(): # print(" %s = %s" % (desc, val)) if desc == 'Short Local Name' and val[0:18] == 'ROHMMedal2_xxxx_xx': # xxxx_xxには自分で使うセンサメダルの番号を入力 print(“JUMP!”) isRohmMedal = True if isRohmMedal and desc == 'Manufacturer': --- # 画面へ表示 print(' ID =',sensors['ID']) print(' SEQ =',sensors['SEQ']) “”” print(' Temperature =',round(sensors['Temperature'],2),'℃') print(' Humidity =',round(sensors['Humidity'],2),'%') print(' Pressure =',round(sensors['Pressure'],3),'hPa') print(' Illuminance =',round(sensors['Illuminance'],1),'lx') print(' Accelerometer =',round(sensors['Accelerometer'],3),'g (',\ round(sensors['Accelerometer X'],3),\ round(sensors['Accelerometer Y'],3),\ round(sensors['Accelerometer Z'],3),'g)') print(' Geomagnetic =',round(sensors['Geomagnetic'],1),'uT (',\ round(sensors['Geomagnetic X'],1),\ round(sensors['Geomagnetic Y'],1),\ round(sensors['Geomagnetic Z'],1),'uT)') print(' Magnetic =',sensors['Magnetic']) print(' Steps =',sensors['Steps'],'歩') print(' Battery Level =',sensors['Battery Level'],'%') print(' RSSI =',sensors['RSSI'],'dB') ””” SEQ = sensors['SEQ'] jump_cnt = sensors['Steps'] if SEQ in [0,1] and jump_cnt == 0: start_seq+= 1 print(“START!") else: last_cnt = jump_cnt if start_seq >= 1: cur_cnt = jump_cnt cur_cal = round(cur_cnt*0.1,1) jump_text= str(cur_cnt)+" Jump "+str(cur_cal)+" Cal" print(jump_text) ''' for key, value in sorted(sensors.items(), key=lambda x:x[0]): print(' ',key,'=',value) '''
このプログラムをsudo python3 ble_jump.py のように流した後に、センサメダルのスイッチを一回押します。そして縄跳びを跳んでみましょう。以下のように縄跳びの回数と消費カロリーが表示されたでしょうか?
2. 4文字ディスプレイに表示させる
跳んだ回数が取得できたら、それを手元で表示してみましょう。今回はラズパイ・ゼロにぴったり合う、Pimoroniの4文字ディスプレイを使います。これは1文字ずつの表示部と基板で成り立っているので、それぞれをはんだ付けします。
少し雑ですが、写真のようにはんだ付けできました。
はんだ付けできたら、ラズパイにPimoroniから提供されているライブラリをインストールします。こちらのGithubにアクセスしてみてください。
[ Pimoroniの4文字ディスプレイのGithub https://github.com/pimoroni/fourletter-phat ]
またはシンプルに以下コマンドをラズパイで流して、インストールをおこないます。
$ curl https://get.pimoroni.com/fourletterphat | bash
このインストールが完了すると、Pimoroniというディレクトリ下にfourletter-phatという、このディスプレイのサンプル・プログラムが格納されます。`このサンプルのうち、時計として今の時間を表示するプログラム(clock.py)を流してみます。
$ python ~/Pimoroni/fourletter-phat/examples/clock.py
このように現在時刻を表示することができました。
3. 縄跳びを跳んで回数を表示してみる
4桁表示ができるようになったので、縄跳びの回数を表示してみましょう。ble_jump.pyをコピーして、ble_jump_4d.jpyとして、以下水色の部分を追加するだけです。
pi@raspizero:~/Programs $ sudo cp ble_jump.py ble_jump_4d.py --- 以下、4、11、12行目が変更・追記部分 --- import fourletterphat --- if start_seq >= 1: cur_cnt = jump_cnt cur_cal = round(cur_cnt*0.1,1) jump_text= str(cur_cnt)+" Jump "+str(cur_cal)+" Cal" print(jump_text) fourletterphat.print_number_str(cur_cnt) fourletterphat.show() ''' for key, value in sorted(sensors.items(), key=lambda x:x[0]): print(' ',key,'=',value) '''
それでは最後に、縄跳びに細工をして、センサメダルやラズパイを取り付けましょう。まず、縄跳びの上部の平らな部分に付けることにします。そこに大型のカッターなどで上部にラズパイ・ゼロの端子がはまるような穴を開けます。そこに裏側からラズパイ、表側から4桁ディスプレイを挟んで留まるようにします。
ラズパイと4桁ディスプレイを裏面から挟んで留めて、ロープ部分に干渉しないようにセットしたら、縄跳びデバイスのできあがりです!
それでは、ble_jump_4d.pyを走らせて、縄跳びしてみましょう。
4. まとめ
これでラズパイとセンサメダルを使って、縄跳びをデジタル化、IoTすることに成功しました。手軽な縄跳びで運動不足を解消する手助けをするデバイスになる予定です。
まずは基本の跳んだ回数の計測と、その表示ディスプレイを縄跳びに取り付けました。実際跳んでみて、ちゃんとカウントされているか試してみてください。
次回は、縄跳びをインターネットにつないで、これまでの回数やカロリーなどを保存、表示したり、モチベーションアップにつなげる仕組みを作ります。
お楽しみに!
今回の連載の流れ
第1回:縄跳び計測デバイスで、目指せ運動不足解消!
第2回:センサメダルで縄跳びの回数を計測し表示させる(今回)
第3回:Google Driveと連携して縄跳び結果を保存・チェック
第4回:デバイスにディスプレイを付けてモチベーションアップ!