動機
趣味でロードバイクをやっており、GPSによる高度情報は精度が低いようで、走りながら高度情報を正しく把握したくなりました。
特に獲得高度といわれる、通算でどのぐらいの高度上がったかという情報は負荷の目安になるため、走りながら把握したいと思っていました。
Garminを購入すればいいのでしょうが、予算超過ですので、自分で作成してみることにしました。
要件
要件をまとめてみました
- 小型であること(ロードバイクのハンドルに取り付ける想定)
- コイン電池(CR2032)で一定時間持つように低消費電力動作
- できる限り精度の良いセンサを利用する
- 視認性の良い表示デバイスを利用する
上記を満たすものとして、自分で開発環境があることから、マイコンはPIC(18F14K50)を利用し、気圧センサはLPS25HBを利用して作成することにした。表示デバイスは小型のグラフィック液晶を利用することにしました。
#回路図
PICとセンサとLCDをSPI接続している程度の簡単なものです。スイッチは2つ設けて、表示内容の切り替えや、高度補正用の操作を可能としています。
バッテリ電圧監視のためにADコンバータを利用し電池電圧を分圧して監視します。
下段のコネクタはPIC kit3と接続するプログラム書き込み用のコネクタです。
主要部品リスト
- PIC18F14K50-I/SO
- 超小型グラフィックLCD AQM1248A
- LPS25HB使用 気圧センサーモジュールDIP化キット
いずれも秋月電子で入手しました。小型にするために、PICはSOP20パッケージです。LCDのピンも1.28mmピッチの為、ユニバーサル基板は1.28mmピッチのものを利用します。
これらを配線し、CR2032用の電池ホルダを組み合わせてタカチのケースPS-65に入れます。
写真
プログラム
流れはこのようになります。1秒毎にループしてデータを表示しています。
獲得高度ですが、気圧センサの誤差影響を避けるため、一定量以上の差が出たときだけ高度を加算するロジックになっています。
- 各種初期化実施
- ループ開始
- 気圧・温度測定
- 高度計算
- 気圧が前回測定値と比較して下がっている場合、獲得高度を計算して加算
- バッテリ電圧確認
- 結果表示(気圧・温度 または 高度・獲得高度 電池状態は3段階でアイコン表示)
- スリープ
- WDTでウエイクアップ(1秒毎)
- ループ開始に戻る
動作確認
近くを散歩して高度を評価しました。
地図上の標高差は32mあるはずの坂道を歩いて上ったところ、この高度計での獲得高度は26mと表示されました。
どうやら、上のロジックの中の一定量以上の差が出た時だけ高度を加算する仕掛けの部分が悪さをして、実際よりも低めに出るようです、アルゴリズムの見直しが必要ですね。
PICで作成する場合、浮動小数点計算をおこなうと、どうしてもメモリサイズの制限が出てきます。その為Arudinoを利用したものを別途製作予定です。加速度センサを利用して、移動していることを検知し、その際だけ高度を加算する方法でこの誤差の問題を解消できないかと検討中です。