坂道を判断するためになぜ高度計なのか?

飛行機には自分の姿勢を確認する水平儀の他に、気圧の変化で動作する高度計と昇降計があります。 昇降計とはその瞬間の上昇・降下の度合いを示す計器で、1分間に高度が何フィート変化するかを知ることができます。 つまり高度を一定間隔で測定し、前回からの差分を求めると上昇降下が分かることになります。
使用した高度センサ MPL3115A2

ハードウエア
メインの処理には毎度おなじみのPIC 16F88を3Vのリチウム電池(CR123A)で駆動します。
高度センサはI2Cで通信しますが、16F88にはマスターI2Cの機能が無いためソフトウエア制御になります。
I2Cのプルアップ抵抗は省電力のために高めの10kΩとしていますが、問題なく動作しています。
表示部にはNokia5510の84×48ドット白黒液晶を使い、数値表示やグラフで連続的な変化を表示できるようにしています。 この液晶はPICのハードウエアSPIで制御します。
画面操作にはプッシュスイッチ付きロータリーエンコーダを使いました。 このプルアップ抵抗も極力高い抵抗値を選び、チャタリング防止のためにシュミットトリガのポートに入れています。 PICの割り込みピンに入っているのでPICをスリープにした時にウェイクアップさせることが可能ですが、スリープ中の電流消費を防ぐためロータリーエンコーダがプルダウンにならない位置でスリープに入るようにしました。
表示部にはNokia5510の84×48ドット白黒液晶を使い、数値表示やグラフで連続的な変化を表示できるようにしています。 この液晶はPICのハードウエアSPIで制御します。
画面操作にはプッシュスイッチ付きロータリーエンコーダを使いました。 このプルアップ抵抗も極力高い抵抗値を選び、チャタリング防止のためにシュミットトリガのポートに入れています。 PICの割り込みピンに入っているのでPICをスリープにした時にウェイクアップさせることが可能ですが、スリープ中の電流消費を防ぐためロータリーエンコーダがプルダウンにならない位置でスリープに入るようにしました。
ソフトウエア
ソースリスト Ver.0.62
高度は1秒間隔で計測し、0.1m単位か1ft単位で表示します。小さなサブ文字で両方の単位の表示も可能。昇降計は0.01m/秒単位か1ft/分単位の数値と、左側のバーグラフで視覚的に表示させます。
下に表示されている"30.24in"というのは気圧高度計の規正値です。気圧を計測しているので、周囲の気圧が高い時は高度は低く、気圧が低い時は高度は高く指示してしまいます。
そのため、現在いるエリアの基準気圧をセットすることで同じ高度が表示されるように補正します。規正値はロータリーエンコーダを使ってhPaと水銀柱インチのどちらでも設定が可能。
高度グラフモードでは現在高度とともに過去60計測分のグラフが表示されます。設定画面でドット間の計測間隔が設定可能で、最大60分のグラフが表示できます。
実際の走行では瞬間的な数値を表示する昇降計よりもグラフの方が使い勝手がよく、なんだかさっきから変だなぁという具合の変化を確認するのに非常に便利です。
右の写真では1ドット3秒間隔で3分間の表示になっています。
この高度センサには気圧と気温を出力する機能も備わっています。
気圧はhPaと水銀柱インチを表示できるので、ここに表示されている数値を高度計の高度計規正値に利用するとゼロメートルを指示してくれます。
気温は摂氏と華氏の両方を表示しますが、日本では華氏があっても馴染みが無いのでほとんど役に立たないですね。
過去のグラフは最大96時間まで計測間隔を延ばせるので、お天気の傾向メーターとして使うこともできます。
設定画面ではスリープに入ったりEEPROMに保存されている単位やグラフ設定の変更機能があります。
一度設定したら二度と変更しないようなパラメータもあって無駄なプログラムだなぁと思うのですが、いろいろ変更できる方が楽しいんです。
Sleepと表示されている項目はロータリーエンコーダの位置によって"スリープ"と"測定画面に戻る"のどちらかが表示され、スリープ中の電力消費を抑えるようになっています。
高度計


気圧計



設定画面


グラフを使いやすくする工夫

また、無いと意外に困るのがY軸のガイド数値です。 グラフのエリアを広げたくて横幅いっぱいまでグラフを描画してた時期もあったのですが、雰囲気だけのグラフになってしまいがちで実際にどれくらい上下しているのかさっぱりわかりません。 この辺りを盛り込む事で見栄えがぐっと良くなりました。
使ってみて分かった事

- 窓を開けると空気の出入りが多くなるので誤差が大きくなる。昇降計は振り切れて役に立たない。
- 窓を閉めてエアコンを外気取り入れにすると、車内の気圧が高まるため高度が低く表示される。 風量が一定なので高度計規正値を変更してうまく調整することも可能だが、風量を変えると当然ずれる。
- トンネルに入ると気圧で耳が痛くなるのと同様に、窓を閉めていても高度がバタバタ暴れて誤差が増え、昇降計も役に立たない。 グラフを見ると誤差が大きいものの、全体としてはきちんと表示している。右の写真のY軸は1ドット2mなので、結構ふらついているのが分かる。
- 全然電池が減らない。電流を測ってみるとスリープ中は30μA、起動中は0.5秒ごとに250μAとA/D変換の2mAを繰り返す。 PWMで点灯させているバックライトLEDは最大で5mAだった。バックライトを点灯せず1日4時間使ったとしても約1年は電池が持つ計算になる。
- バックライトを75%で点灯させた状態で1回目の電池が2015年12月14日に切れた。 バックライトを点灯せず気圧計モード、更新周期は64秒間隔、24時間稼働で2回目の電池が2016年5月2日に切れた。予想通り長持ちしている。
- よく考えると高速道路の上り坂は登坂車線があるので、左を見ればよいことが分かった。
製作過程で苦労した点
- PORTAのI2Cと関係ないビットをBSFやBCFで変更すると、I2Cのビットが勝手にHレベルに書き換わってしまった。 Read Modify Write命令を使っていたので、プルアップされたI2CのビットをHレベルで読み込んで再出力していたのが原因。
- PORTB変化割り込みの対象では無いピンをBTFSCやBTFSSでテストすると、PORTB変化割り込みが発生しなくなる。 BTFSCは特定ビットだけを読むわけではないので、意図せずPORTBの状態ラッチが更新されてしまったのが原因。
- 8bitの石で多バイト長のデータ処理を行うのはつらい。特に乗除算のルーチンのサイズやステップ数が大きくなりすぎる。
- 3種類のフォント(16x8、8x6、8x5)容量が思ったより大きく、プログラム領域を圧迫している。 プログラムエリアは数ワードしか残っておらず、プログラムを見直しても数バイトしか増えないため、新たな機能を追加できないし、バグがあっても直せない可能性が高い。
- 固定小数点の演算を初めて使ったが、慣れると簡単だった。小数点は8bitまたは4bitの境界に持ってくると処理しやすい。
- ロータリーエンコーダを操作しても基板に物理的なストレスがかからないようにしたり、基板を立体的に配置して組み込んだところ。





