2010年08月01日
自作:PIC サイクルコンピュータ&心拍計
久しぶりの自作ネタです。 (^_^;
PICマイコンは、ずーーーーっと以前から興味があったのですが、「何に使うかな〜?」 っと考えると、ターゲットを何にしたら良いのか、
なかなか浮かんできませんでした。
2007年から自転車をはじめ、すっかりハマってしまった今日この頃。
家の中で練習ができるように、ローラ台まで買ってしまいました。 (^_^;
ローラー台トレーニングを効率的に行うのには、自分の心拍をモニターしながら、短時間に負荷をかけたり、休んだりすることを繰り返す
インターバルトレーニングを行うのが効果的だそうです。
そこで、ローラ台に固定した自転車の車速と移動距離、そして心拍が計測できる物を、PICを使って自作しようと考えました。
まずは、時間を正確に知る為に、時計を作り込む必要があります。
次に、車速/移動距離を知る為には、車輪の1回転を検出するセンサーが必要です。
そして、心拍を検出する為のセンサーも必要です。
これらの計算結果を表示する為に、LCD(液晶表示器)を使いました。
一応、これらの機能をPICにプログラムする事ができましたが、ここに至るまでには、色々苦労しました。
苦労話になりますが、・・・、、、
まず、PICがまったく動きませんでした。
書籍やネット上に参考になる資料がたくさんあるPICの品種を選んでおけば良かったのですが、A/Dコンバータを使ってみたかったので
16F819という物を選びました。 (今回作った物には、A/Dコンバータは使いませんでしたが・・・。)
この品種は、参考となる物があまりなくて、最初なっかなか動いてくれませんでした。
(6ヶ月程経過してやっと動かす事ができました。 途中でさじを投げてたので、、、、)
データシートはよく読め! って事ですが・・・。 苦手な英語やし・・・。
動かなかったのは、PIC(品種)特有の、「コンフィグレーションビット」の設定と、PICの機能を決める特殊な「レジスタ」の設定が理解できてなく、
間違った設定をしていたからでした。
今回苦労しましたが、その分、PICのしくみの勉強ができて、結果的には良かったと思います。
逆にネットにたくさん転がっている品種を選んでいたら、この辺の理解が無いままPICを使っていたと思います。
次に、開発環境の問題。
C言語のフリーのツールは、WinXPにはセットアップできるのですが、私の実験室のWin2Kにはインストールができませんでした。
その為、1階のXPパソコンでコンパイルしてPICに書き込み、それを2階の実験室のブレッドボードに差し込む、、、、、。
これを何回繰り返した事か・・・・。 トホホ・・・。
また、C言語を使いたかったので、最初にCで書き始めたのですが、うまく動かないので、しぶしぶアセンブラでテストプログラムを書く事に
なりました。
アセンブラで、PICの動かし方がわかったので、Cで同じ事を書いたらうまく動いたので、この点は良かったのですが、、、、
高級言語の欠点で、コードサイズがどうしても大きくなってしまい、何度もプログラムサイズオーバーでコンパイルが通らない事があり、
コードサイズを減らす工夫を余儀なくされる、、、の繰り返し・・・・。
なんだかんだありましたが、何とか形になりましたので公開します。
回路図はこちら。
ソースファイルはこちら。
![]() |
LCDに表示するプログラムが動作する事を確認しました。 |
|
Timer0を使って、24時間時計をプログラムしました。 今回は電源ONからスタートで、時刻あわせの機能はありません。 (^_^; |
|
入力の信号は車輪の回転検出センサーからではなく、丁度、1時間で15km走るタイミングの仮の信号を入れています。 1秒当たり、タイヤ2回転の信号を入れていますので、 2回転 × 3,600秒 = 7,200回転/時間 タイヤの周長は700×23Cで約2.1mなので、 7,200回転/時 × 2.1 =15.12km 写真の表示値もほぼ合っています。 V(^_^) しかし、ここでプログラム領域がいっぱいいっぱいになってしまい、試行錯誤するも、なかなか小さくする事ができません。 やはり、C言語をやめてアセンブラで書き直すしかないかなぁ〜。 最低でも、あと現在速度の表示を入れたいところです。 |
![]() |
ネットで色々調べているうちに、今使っているソフトを作る為のツールの中に、 「Memory Usage Gauge」 というものがあることを知りました。 これは、プログラムやデータがマイコンの中の器のどれくらいを使うか、、、が、一目でわかるものです。 これを使って、プログラムのどの行が容量を食ってしまうのか、怪しいところを1行1行コメントアウトして調べてみました。 すると、C言語の標準関数、「fprintf()」を、コメントにしたら、プログラムのサイズがグッと小さくなる事がわかりました。 「fprintf()」と言う関数の代わりになる物を、ネットで探し、それで書き直してみたところ、なんとか、サイズを小さくする事ができました。 そこで、「走行距離」部分に加え、新たに「現在速度」の計算&表示のプログラムを追加し、動作確認をする事ができました。 V(^-^) |
![]() |
左の写真は、手でペダルを回した時のものです。 LCDで、最高速度 85.9km を表示しました!! (^_^; 後ろに写っているのは、オシロスコープです(古いけど・・・)。 この測定器で、センサの信号(上:フィルタでなまらせてます)と、コンパレータ(下:ヒステリシスを持たせています)通過後の信号波形を確認しました。 フィルタでなまった波形を、コンパレータできれいに整形した後、PICマイコンに入力しています。 大丈夫!! 誤動作はしませんでした。 o(^-^)o ちなみに、センサー入力部分のフィルタ用コンデンサを外すと、時速900km以上を記録しましたぁ〜! ↑これ、誤動作です。 _| ̄|○ |
![]() ![]() |
V(^_^) これで、ソフトウェアは完成とします。 ブレッドボード上のハードウェアも回路が決まりましたので、ぼちぼち、プリント基板に回路を組んでいこうかと思います。 写真: @フォトセンサの赤外光をデジカメで撮影 赤外線なので、人の目では感じる事ができませんが、結構強烈な光です。 Aフォトセンサの上に指を乗せて、心拍数を測定しているところ 85回/分を表示。 いつもよりはやい・・・。 ん・・・? あ゙〜〜〜〜、、、単位間違ってる〜!!! ふらふら 誤:b/s → 正:b/m 早速、修正かけます。 (^_^; |
![]() ![]() ![]() |
動作確認もOKです。 心拍計は感度が良すぎて、センサーへの指の乗せ方次第で敏感に反応してしまいます。 誤検出の改善の余地がありそうです。 写真: @プリント基板にすべての部品を乗せて配線が終わったところです。 ブレッドボードで試している時には、この面積に乗せられるかどうか心配でしたが 意外とあっさり乗ってくれました。 ALCD(液晶表示器)を付けて、動作確認中です。 作りこんだ3つの機能はすべて動きました。 よかった・・・。 B次はこの基板をケースに収めなければいけません。 ケースの加工(丸や四角の穴あけ)に、結構時間がかかりそうです。 ぼちぼちいきましょう・・・。 |
![]() ![]() ![]() |
ケースの加工は苦手だな・・・。 σ(^_^; 四角い穴は四角にならんし、表面に傷は付けるし・・・。 ま、自分で使うんだからいっか・・・。 (^_^; (・・・っと、すぐ妥協してしまう悪い癖・・・。) ・・・で、防水加工など全く無しなので、雨の日に野外では使えませんな・・・。 ははは・・・。 (^_^; このあと、このケースをどうやってハンドルに取り付けるか、、、と、車輪に付ける回転検出センサー(リードスイッチ)を何とかせねば・・・・。 そこまでで、ひと段落としましょう。 写真: @こんな感じです。 明るめに撮影するとあらが目立つので、暗め暗めに撮影・・・。 (^_^; A車輪回転検出センサーをつなげたところ。 考え無しに穴あけをしたものだから、コネクタに対して穴が大きくなってしまいました。 (^_^; B正面 「LCD(液晶表示器)」 と 「モード切替スイッチ」 と 「心拍検出センサー」 です。 このセンサの上に指を置いて心拍数を測定します。 OMRONの家庭用血圧計と比較して、心拍数がほぼ同じなのを確認しました。 (・・・、ってか、自分で手首に指当てて測ればいいやん・・・。) |