IoTプラレールを作ってみました（その3：IoTサイクルメータの作成）


# はじめに

こんにちは。(株) 日立製作所の [Lumada Data Science Lab.](https://www.hitachi.co.jp/New/cnews/month/2020/03/0330d.html) の松本茂紀です。

IoTプラレールを作ってみましたシリーズの第３弾です。

今回はフィットネスバイクをハックしてオリジナルのIoTサイクルメータを作ります。


> その他の記事は以下から参照できますのでよろしければどうぞ。
>
> [IoTプラレールを作ってみました（その1：IoT電池の作成 前編）](https://qiita.com/shi-matsumoto/items/368ba2002a9c0410e3ed)
>
> [IoTプラレールを作ってみました（その2：IoT電池の作成 後編）](https://qiita.com/shi-matsumoto/items/35b3f7b8e53ac47f0aa4)

>
> [IoTプラレールを作ってみました（その4：IoTサイクルメータを作ろう 後編）](https://qiita.com/shi-matsumoto/items/173a86deeda743fe0990)
>
> [IoTプラレールを作ってみました（その5：プラレールとフィットネスバイクを電波でつなごう 前編）](https://qiita.com/shi-matsumoto/items/7c3584f0d3ec1f380660)
>
> [IoTプラレールを作ってみました（その6：プラレールとフィットネスバイクを電波でつなごう 後編）](https://qiita.com/shi-matsumoto/items/8931aefaf8edb4080bdb)



# 要件定義

データサイエンティストにとって、要件定義は最も重要なプロセスです。今回の記事では、顧客は自分です。手頃な価格で手に入るフィットネスバイクをIoT化していくので、折角なら欲しい機能を追加したいと思います。欲しい機能はこんな感じです。

1. 運動の目安としてケイデンスメータがほしい
2. 消費カロリーがおおよそ知りたい
3. 日々の履歴を残しておきたい

第１の要件は、ロードバイクに乗っている方はわかるかもしれませんが、運動強度を維持するために回転速度（ケイデンス）を意識しながら漕ぎたいという要求からきています。自分の場合、サイクリングをするときには80～120rpm（１分間の回転数）を意識しながら漕いでいます。フィットネスバイクでも回転速度がほしいところですが、我が家のフィットネスバイクには残念ながら表示がない！ということで、なければ作ればいいのです。

第２の要件は、フィットネスバイクのディスプレイに表示されている一般的な目安の消費カロリーではなく、もう少しもっともらしい値を知りたいという要求からきています。消費カロリーは体重や年齢、運動の仕方、体の状態などによっても異なり、昨今ではウェアラブルデバイスのような生体情報などを駆使した測定も一般的になってきているようです。そこで、比較的手軽に測定できそうな心拍数を活用してみたいと思いました。

第３の要件は、日々の頑張りを記録してモチベーションアップに繋げたいという要求からきています。消費カロリー見ながら、昨日より頑張れたとか、ちょっと疲れたから昨日より軽めにしておこうなど、日々の小さな目標に活用できれば継続もしやすくなりそうです。

# ⽤意するもの

材料は以下の通りです。

**必要な材料**

| 名称                 | 詳細                                         | 参考価格（購入当時）                                              |
| -------------------- | -------------------------------------------- | ------------------------------------------------------- |
| Raspberry  Pi Zero W | 小型で無線通信ができるタイプのラズパイ       | 1,320円                                                 |
| 液晶ディスプレイ     | SSD1306を使用                                | 580円                                                   |
| パルスオキシメータ   | MAX30102を使用                               | 1,600円                                                 |
| タクトスイッチ       | 赤と黒の２個を使用                           | 20円                                          |
| ユニバーサル基板     | 56.5x32mmを切って使用                        | 80円                                                    |
| モノラルジャック     | Φ3.5mmモノラルミニプラグのメス               | 100円                                                   |
| 収納ケース           | フリスクの空ケースを再利用                   | 0円                                                     |
| 歯ブラシキャプ       | ・100円ショップの２個入りシリコン歯ブラシキャップ<br/>・色違いのセットなので同色にしたい場合は2つ購入   | 100円                                                   |
| スズメッキ線         | 基板の配線用に少し                           | 実質数十円                                              |
| 配線コード           | 複芯の細めのワイヤーが柔軟性があり扱いやすい | 実質数十円                                              |
| ピンヘッダ           | 7本分を使用                                  | 実質数十円                                              |
|                      | 合計                                         | 約3,800円<br>※マイコン・電子基板を除けば<br>300円くらい |



**必要な工具**

| 名称               | 詳細                                                         |
| ------------------ | ------------------------------------------------------------ |
| ハンダとハンダゴテ | 新たに購入する場合は温度調整可能な精密機器用のハンダゴテがおすすめ |
| ニッパー           | ・基板を切る場合は大きめのよく切れるものがおすすめ<br/> ・また細かい配線をカットするときには小さいのもあると便利 |
| ペンチ             | 配線を曲げたり、コネクタをつけるのにラジオペンチのようなものがあると便利 |
| USBケーブル        | 給電用                                                       |



**あると便利な材料**

| 名称           | 詳細                                                         | 参考価格（購入当時）   |
| -------------- | ------------------------------------------------------------ | ------------ |
| 熱収縮チューブ | ・Φ1.5やΦ3ほどの太さ<br>・複数配線をまとめておくのに便利 | 実質数十円   |
| 絶縁材         | ・基板・マイコンの接触防止<br>・少し厚みのある両面テープなどでもOK | 実質数十円   |
| 単芯配線コード | 複芯だと力がかかったときハンダ付け部分が切れる場合があるので、少し硬いが単芯配線コードがあると便利 | 実質数十円   |
|                | 合計                                                         | 約 100円程度 |



**あると便利な工具**

| 名称           | 詳細                                                   |
| -------------- | ------------------------------------------------------ |
| ホットナイフ   | フリスクケースを加工するのにあったほうがいいかも       |
| オシロスコープ | 周期的な電気信号を見るのに便利。簡易的なもので十分使える。       |
| ヘアアイロン   | 熱収縮チューブを収縮させるのに便利。火で炙るより安全。 |
| 圧着ペンチ     | コネクタの金属部（コンタクト）を固定するのに便利       |
| テスター       | 電圧・電流・抵抗値などをチェックするために一つはあると便利         |



# フィットネスバイクの動作を知ろう 

我が家のフィットネスバイクには、写真のように本体のペダル部から液晶ディスプレイのあるメータ部とを繋ぐプラグ（モノラル）が接続されています。おそらく、ペダルを漕いだときに出る電気信号を、メータ部でキャッチして速度や消費カロリーなどが表示されるのだと思われます。

![2-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/bac4d339-4fcc-b89e-9e7b-5911efef67d2.png)



まずは、フィットネスバイクからどんな信号が出ているかを調べてみます。ペダル部からモノラルプラグのオスが出ているので、プラグの根本と先端をオシロスコープに繋ぎ、漕いだときにどんな変化が起こるかを調査しました。すると、ペダルを漕いでいる最中に、図のような波形が現れました。ギザギザした波形は何もしてない状態でも発生しているので、ノイズと考えられます。右足が一番低い位置にきたとき、中央に見える横線状の信号が現れました。ｙ軸の中心はGNDに調整しているため、オシロスコープのプラスとマイナスが繋がったことを意味しています。

![2-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/7d9fece8-b623-8c71-4f03-6b1c1c6c7615.png)

実はこの挙動は、機械スイッチを押したときと同じです。つまり、フィットネスバイクのペダルを１回転させることは、スイッチを１回押すのと電気的には同じであるということがわかりました。ここからは、プログラムの動作確認をするのに毎回漕ぐのは大変なので、スイッチを押しても動作するデバイスを作っていこうと思います。ちなみに、原理がわかってしまえば、フィットネスバイクを漕ぐ以外の方法でもプラレールを動かす仕掛けが作れそうですね。



# Raspberry Pi Zero Wで開発環境をつくろう

 

フィットネスバイク側のデバイスは、色々と計算させたりデータを保存したりしたいので、Raspberry Pi Zero Wを使って開発することにしました。そこで、簡単に開発環境を作成するまでの流れを紹介します。

１．SDカードにRaspberry PiのOSをインストール

  公式サイトに用意されているRaspberry Pi Imagerを使って簡単にインストールができます。今回は、Raspberry Pi OS （32-bit）を選択しました。詳細なインストールについては、公式サイトなどをご覧ください。

https://www.raspberrypi.com/software/

２．初期設定

  WiFi設定を行い、SSH経由でログインできるように設定します。Raspberry Piはヘッドレス（キーボードやマウスを使用しない方式）での設定ができます。多くの方が解説してくれているのでここでは詳細を割愛します。


３．I2Cを有効にする

  モニタやセンサとRaspberry Piとの間で、I2Cと呼ばれるシリアル通信を行います。この設定を有効にするために以下のコマンドを実行します。

```shell
$ sudo raspi-config
```

  そして、「3 Interfaceing Options」→「P5 I2C」の順に項目を選択し、有効にするか尋ねられるので「Yes」を選択します。

４．シャットダウンボダンを追加

  Raspberry Piには終了ボタンがありません。毎回SSHでログインしてシャットダウンは面倒なので、シャットダウンボタンを作成します。なおボタンの実装自体は後ほど行います。

シャットダウン用のプログラム、shutdown.pyを以下のように作成します。

```python
#!/usr/bin/python
# coding:utf-8
import time
import RPi.GPIO as GPIO
import os
GPIO.setmode(GPIO.BCM)

pin = 4

GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True:
    GPIO.wait_for_edge(pin, GPIO.FALLING)
    s_time = time.time()
    while GPIO.input(pin)==0:
        if time.time() - s_time > 2:
            os.system("sudo shutdown -h now")
            print("shutdown start")
            break
```

このプログラムでは、シャットダウンボタンは４番ピンに繋がれている想定で、２秒より長く押された場合にシャットダウンコマンドが実行されます。

作成したファイルに実行権限を与え、起動時に実行されるように設定をします。なお、ホームディレクトリにプログラムを作成したと想定します。

```shell
$ chmod +x /home/pi/shutdown.py
$ vi /etc/rc.local
  (以下の行を追加)
  /home/pi/shutdown.py &
````

以上で、基本的な設定ができました。以降は実際にデバイスを作成していきます。



# デバイスを組み⽴てよう

**※注意**

**一度組み立てると、後で手直しが大変なので、もし先にサイクルメータの動きを見たい方は、ブレッドボードを使ったプロトタイピングを行うことをおすすめします。**

今回基板に実装していくのは、液晶ディスプレイとタクトスイッチ、フィットネスバイクを繋ぐモノラルプラグ、心拍を測るパルスオキシメータです。前回同様に、配線にあたって、ユニバーサル基板の裏表を使いますので、次の様に表記します。

![2-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/91c69ac1-c0d6-aeec-2dfd-97270dbe77b1.png)


Raspberry Pi には40本のGPIOピンが配列していますが、今回使うのは図中の赤枠で囲った７本です。


![2-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/d8c82389-d633-7171-9d4d-dc4e01f71c40.png)


各パーツとユニバーサル基板の配線の模式図は以下のとおりです。Raspberry Piの上にユニバーサル基板を重ねるように実装します。ユニバーサル基板への配線は、前述の表と裏面にスズメッキ線を上手く折り曲げて加工していきます。９０度に曲がっている部分は、適宜ハンダ付けして基板に固定しておくと便利です。

![2-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/c5382c91-1e9d-d65b-e11c-cf8a7394edf9.png)

次に、あらかじめ配線したユニバーサル基板に、液晶ディスプレイとタクトスイッチを図のように配置し、ハンダ付けしていきます。また、フィットネスバイクに向けて伸びる２本の線は、モノラルプラグを先端に繋いであります。長さは取り回しの良いように十数センチ程度の長さがあれば良いと思います。なお、前回のIoT電池同様、２本の配線コードを熱収縮チューブでまとめておくと便利です。パルスオキシメータへ伸びる配線については図のように最終的には基板と繋げますが、ここで少し工夫が必要なので後で説明します。

Raspberry Pi側には今回利用する７箇所にピンヘッダを予めハンダ付けしておきます。なお、長い方が上（基板を重ねる側）に来るようにします。

![2-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/d31646f2-be1f-1c71-6aa8-d667896b3af5.png)


ユニバーサル基板とRaspberry Piを図のように重ねます。

![2-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/7f0942ce-3ad8-1501-b476-d520f7fbc27b.png)



ピンヘッダがユニバーサル基板の下から突き抜ける形で出てきますので、ピンヘッダの突起部とユニバーサル基板の配線とをハンダ付けします。なお、ピンヘッダが長いので、ペンチでカットします。また、配線の仕方によっては、HDMIのコネクタと赤いタクトスイッチに伸びる配線が接触してしまいます。そこで、予めHDMIコネクタに絶縁物（少し厚手のテープなど）を貼っておくと回避できます。組み上がった状態は写真（上面図、側面図）の通りです。破線で囲った部分で配線の接触が起こったので、ユニバーサル基板とRaspberry PiのHDMIコネクタ部分の間に両面テープを貼ってあります。


![2-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/79ed272b-8195-3bb1-7ffd-48db8ccca04b.png)

 

続いて、パルスオキシメータ部分の組立の詳細を説明します。パルスオキシメータは、心拍や酸素飽和度を測定できるセンサで、コロナ禍で耳にする機会が増えた単語の一つではないでしょうか。今回使用するセンサは、基板中央の黒い長方形部分のガラス面に指を乗せて測定するもので、正しく測定するためには、指を軽く押し当て、ズレないように一定時間固定する必要があります。市販のものは、クリップで指を挟むタイプや、スマートウォッチと一体化しており、腕に括り付けるタイプがありますが、手軽かつ安価な方法で、自作できないかと考えました。

そこで思いついたのが、１００円ショップで売っている歯ブラシのシリコンキャップです。指にはめると何とも言えないフィット感があります。これを使ってオリジナルパルスオキシメータを作成したいと思います。

２個入のキャップのうち１つに、配線を通す穴を空け、歯ブラシを入れる側の口を半分くらいまで切り取ります。後々これはカバーになります。パルスオキシメータの基板に配線をハンダ付けする前に、キャップの穴に配線を通しておきます。ハンダ付けしたあとは図のような形になります。

![2-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/6445625d-ced4-9111-401f-265354cd940a.png)


なお、ここでハンダ付けに関するポイントは、パルスオキシメータ基板には単芯のコードを使うことです。複芯は柔軟性が高く取り回しが便利ですが、一本一本の銅線は細く、指を抜き差しする際にハンダ付け部分に力が加わり切れてしまいます。そこで、図のようにRaspberry Pi側の基板からは取り回しやすい複芯のケーブルを伸ばし、パルスオキシメータの基板に繋ぐ手前で単芯のケーブルで中継しました。


![2-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/210f01ee-7a18-98d9-813b-7284bfd77642.png)


なお、複芯コード５本は熱収縮チューブでまとめ、複芯コードと単芯コードの繋ぎ目はそれぞれ個別に熱収縮チューブで絶縁処理をしてあります。

次に、実際に指をはめる部分を作成します。２つ入のキャップのもう一方を用意し、中央付近に大きめに穴を空けておきます。もともとキャップには小さな穴がいくつか開いてるので、そこを広げる形で切りました。この穴に、パルスオキシメータの長方形の突起部を宛てがうように置き、先程配線を通した半分に切られたキャップを被せます。これで、パルスオキシメータはキャップの間に挟まれ固定されました。


![2-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/e41c5561-672b-4d5f-3326-2573af8e5110.png)


中から見ると図のようになっています。ちゃんと、長方形の突起部が穴から見えていれば大丈夫です。あとは、このキャップに指を差し込んでセンシングする事ができます。

※パルスオキシメータの処理については次回の記事で説明します


![2-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/ac339440-75c8-6047-1bd4-a6f4712c935b.png)



最後に、作成したデバイスを収納するケースを作ります。Raspberry Pi Zeroがすっぽり入るちょうどよいケースとして人気の、フリスクの空箱を利用しました。蓋側には、ディスプレイを出す穴、タクトスイッチを出す穴、USBポートを出す穴をそれぞれ空けました。本体側は、突起部分を削り、USBポートを出す穴、ケーブルを通す穴、micro SDが出る穴を空けてあります。穴の位置は実際にデバイスを宛てながら決め打ちで空けてあります。なお、フリスクケースは硬いプラスチック素材であるため、カッターナイフなどで開けるのは難しいです。ホットナイフなどを利用することをおすすめします。


![2-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/4e22654c-bc42-ae44-69fc-dd0d0ca62339.png)


![2-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/b413ac52-4d10-e238-8caa-83f54749fd34.png)



Raspberry Piのmicro SDやUSB端子部分を穴に差し込む形で入れると、図のようにちょうど収まりよく収納できます。最後に蓋を締めて完成です。蓋とディスプレイやタクトスイッチが干渉しなければ、ピッタリと蓋をすることができます。蓋が締まれば完璧です。    

![2-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642018/71068e9b-903a-b20f-f858-f3d2a3a8a218.png)


**注意事項**
* 作業時は、ケガのないよう十分ご注意ください。
* 異常が発生した場合は、直ちに使用を中止してください。（異常例：びりびり電気を感じる、熱い、焦げくさいなど）
* お子様の手が届かないところに保管してください。


# おわりに

次回の記事では、作成したデバイスにプログラムを書き込んでフィットネスバイクに繋げたいと思います。

普段フィットネスバイクを漕いでいたときは、表示される速度やカロリーを見ても疑問に思わなかったのですが、いざサイクルメータを作ろうと思うと、「どうやって回転速度検出してるんだろう？」「カロリーはなんで計算できるんだ？」と色んなことが気になりはじめました。

実際に調べてみると原理はシンプルですが、少ないデータから色々と有益な情報を表示し、しかも電池一本で長期間安定して機能しているフィットネスバイクは、良く出来てるんだなぁと、改めて関心が深まる体験でした。

一見するとシンプルで単純そうに見えても、少ないデータから多くの価値を生み出し、安定して機能提供できる、そんなスマートなデータ分析が実際の案件でも重要ではないかと思いますので、通じるものが何かしらあるのではと思います。

なお、ここで紹介しているデバイス作り、一見すんなり組み立てているように書いてますが、蓋に空けたスイッチの穴を見てもらえば分かるように、失敗しては修正を繰り返しているので、スマートに創るには道のりが長いです（笑）

#### 商標

フリスクは、ペルフェッティ バン メーレ ベネルクス ベスロートン ベンノットシャップの登録商標です。