工作してみる
一昔前にゲームセンターに通っていた人にとって、「ペダルを漕ぐ」といえばプロップサイクルですよね!
当初はプロップサイクルのように空中を飛び回るものを作ったり、
サイクリング映像と同期させたりできたらいいな、と想像を膨らませていました。
技術的に難しいのは勿論ですが、スピンバイクの構造上、負荷を外部から把握することが困難なんですよね。
前後左右に傾けることができないとしても、負荷を調節することができれば疑似的に坂道を表現できるかと思ったのですが、ちょっと難しそうです。
いずれ可能性が見えてきたらチャレンジしてみるとしても、ひとまずは断念することにしました。
(高価なモデルであればパソコンから負荷の制御ができるものもあるようです)
そこでまずは実現できたらいいなーレベルも含めて以下を目標にします。
- 回転数を拾う
- 回転数メーターを作る
- 回転数に応じて風を吹かせる
- 心拍数を計測する
- 計測データをクラウドに上げる
- 計測データをグラフ表示
- トレーニングの進み具合・サボり具合に応じてLINE通知を送る
スピンバイクAeには元々回転数や心拍数など便利な表示気が付いているので必要性があるかは疑問ですが・・・まあ何事も経験。楽しければいいのです。
Step1. 回転数メーターを作る
方針を決める
まずはどのようなメーターを作っていくか方針を決めていきます。
- NeoPixel LEDを使用する
- 最大の回転数を120回転/分と想定する
- メーターの表示色について
以前秋葉原のShigezoneさんに行った際に手頃な価格で販売されていたのを見かけましたので、それを使用してみることにします。
60LED/mで980円でした。
ペダルの回転数から1分間あたりの回転数を算出し、10回転ごとに1つずつ点灯させていくことにします。
(120回転/分を超える場合でも12LEDの点灯とする)
NeoPixelは切断もできますのでLED12個(約19cm)でカットします。
NeoPixelはフルカラーのLEDなので綺麗にグラデーションさせることも可能です。
しかし回転数の高/低さえわかればよいため、4,5段階くらいで色分けした方が把握しやすいかもしれません。
実際に試しながら決めていくことにします。
回転数メーターの色分けは、ペダルを漕ぐ速度を一定の回転数に保つための目安にしたいという意図があります。
そのため、おおよその回転数がわかれば良いので数字での表示は行いません。
(元々付いている多機能メーターで数値はわかりますし)
備え付けの回転数計がないモデルの場合は7セグLED等で表示させるときっと便利でしょうね。
仮組みする
パソコンとスピンバイクの設置場所は少し離れているので、まずは机の上でできるところから進めていくことにします。
一分間あたりのペダルの回転数として0-120の値を得られた前提で、仮コーティングを進めていきます。
NeoPixelをArduinoで制御するためにはNeoPixelライブラリまたはFastLEDライブラリを使用すればよいようです。
参考
Adafruit_NeoPixelgithub.com
どちらも素晴らしくカッコいいサンプルが提供されています。
使用するライブラリはどちらでもよかったのですが、今回はFastLEDを使用することにしました。
使用するマイコンはコストパフォーマンスが良く使い慣れていることと、部品棚に在庫があったことからArduino UNOにします。
さて、実際にサンプルソースが動くことを確認し、色指定を変えたりと実験してみたのですがどうも色がおかしい。
下記リンクを参考に、R(赤),G(緑),B(青)の順序を変えてみたところ、指定した通りの色で光るようになりました。
- Arduino IDEにNeoPixelライブラリ or FastLEDライブラリを導入する
- RGB calibrationを行う
- 消灯させたい時は色指定をBLACKにする
- FastLED.show()を行うまで反映はされない
(各LEDの色指定を行った後、最後に1度FastLED.show()を行えばよい)
Arduino IDEにNeoPixel/FastLEDライブラリを導入してプログラムする際のノウハウについては、わかりやすい解説が書かれているサイトが多数見つかりましたので、具体的な解説については割愛します。
ぜひGoogle検索してみてください。
動作確認
ペダルの回転数が0(停止)~120回転/分(Max)と変わっていく際を想定し、
forループで値を変えてみてLEDの点灯が正しく動作することを確認しました。
シリアルモニタに表示している値は、回転数(RPM)/デューティ比/LED点灯カウントです。
LED点灯カウントは回転数の1/10の値で、0より大(0.1など)なら1つ目のLEDを点灯させるようにしています。
同様に、2つ目のLEDが点灯するのはLED点灯カウントが1.0~1.9の時です。
(デューティ比は次の項目でPWMファンを制御する際に使用します)
LEDの色を数個ごとに変えていくコーティングは非常に汚い物になっています。。
もっとシンプルに記述したいところですが…ひとまず動けば正義と言うことで先に進みます。
Step2. 風を吹かせてみる
プロップサイクルで遊んだ際に驚いたのは 筐体前面(モニター下)から実際に風が吹いてきたことです。
あのような爽快感は出せなくとも、漕いだ回転数に応じて風を吹かせることができたら、回転数メーターの点灯だけよりも漕いでいる実感が湧くのでは、と考えました。
ファンを買ってくる
部屋にあるサーキュレーターを回すことも考えたのですが、そのまま使う限りAC100Vで動かすことになるため、さすがにハードルが高いかとやめました。
回転数制御ももっと電子回路に詳しくならないと難しそうですし、なにより危なそうなので。
そこで大きくてコストパフォーマンスが良いファンがないか秋葉原を物色してきました。
店頭でよく見かけるのはDCファンですが、ペダルの回転数に応じてリニアにファンの回転数を制御したいため、PWMファンを探すことにしました。
参考
PWM制御ファン用ファンコントローラーの製作 (1)PWM制御とは?風変わりなPC物語 -スズメさんち-
電子部品屋さんではなかなか大型のPWMファンは見つけられず、PCパーツショップで購入。
できるだけ安く、風量(CFM)が多いもの、という観点で商品を選びました。1つ1000円の物を2つ購入。
12cmファンマウントに取り付けられる14cmファンということで8角形っぽくなっています。
PCケースのようにネジ穴が開いているところに取り付けるのなら問題ないのでしょうけど、今回の用途のように適当につけようと考えている場合は意外と苦労するかもしれません。
配線する
PWMファンには4pinコネクターが出ています。
ピンアサインついては下記サイトの「PWM 4ピンコネクタタイプ」の項目にわかりやすく記載されていました。
今回購入したファンは12Vファンなので、電源として+12Vが必要です。
+12VはArduino UNOから直接出力することができないため、大型7セグLEDをテストしたときと同様に、DC-DCコンバーターを使用してみました。
Arduino UNOからGND/+12V/PWMピンの3ピンを接続すればPWMファンを回転数制御しつつ回すことができます。
ピン配置図に「sense」あるいは「パルス」と書かれている3番ピンは接続した機器側からファンの回転数を検出するために使用するものなので、ファンの回転数を制御するだけであれば必要ありません。
なおPWMピンにはどんな信号を入れればよいのか調べてみると、+3.3Vレベルで25KHzのPWM信号を入れれば良いようです。
+3.3Vレベルに降圧するには74HC4050を使用すればよいとして、25KHz周期のPWM信号をどうやって出すのかが問題です。
25KHzのPWM出力
当初はArduino UNOならanalogWrite()でPWM信号を出せるじゃないか、と軽く考えていたのですが・・・
976.5625Hzと490.1961Hzしか出せないようです。
(まだ深くは理解できていないため、ArduinoによるTimer周りについてはいずれ理解しておこうと思います)
さて、それでは25KHzのPWM信号を出せないのか?というとそうではありません。
諸先輩方が素晴らしい情報をまとめてくださっています。
参考にさせていただきました。
参考
ArduinoのTimerを初心者が1からなんとなくわかるためのメモQiita @suzukinoriさん
参考
GM70シングル シャーシ冷却用ファンのコントローラ作成(2)趣味関係のメモ帳
参考
Arduino CPUファン (PWM)を回してみたmeyon’s STUDY
参考
CircuitPython 10行プログラミング (10) FANコントロールDIY環境
動作確認
NeoPixelの時と同様に、ペダルの回転数が0-120の値を取るとして、回転数に応じて0-40のDuty比をセットし、ファンの回転数を0-100%と変化させてみました。
ファンは2つとも接続し、Neopixelも接続したままです。
この状態でシリアルモニターの表示を見てみると、Duty比に応じてファンの回転数が変わっていくのが確認できました。
これでPWMファン部分に関してはこれで完成!・・・と思いきや、念のため各所の電圧を測ってみるとおかしいことに気づきました。
ファンの回転数が上昇するにしたがって、+5Vが下がり、+3.3Vが上がっていきます。
そしてしばらく経つとPCからシリアルポートが認識されなくなり、NeoPixelの点灯も正常に動作しなくなりました。
Arduino UNOは壊れてしまったようです。
ファンはモーターですから消費電流も高く、直接駆動せずに別電源を用意すべきでした。
プログラムソースは問題ないと思いますので、回路の方を修正します。
また長くなってしまいましたので、一度ここで区切ってまた別の記事にします。
※一通り作り終わって確認がとれたら回路図とソースを掲載する予定です。