デジタル回転計 制作:2006-01-04〜2006-01-08

旋盤用DROを造って疲れたので、息抜きにデジタル回転計を作ります。部品点数が少ないので¥3000でおつりが来ます。ソフトは2Kワード以下に収まるはずなので無料のmikroBASICが使えます。今回はプリント基板を使わずにユニバーサル基板で制作します。


センサーは反射形のフォトリフレクターを使います。秋月電子で10個¥300で売っていました。この素子は赤外線LEDと赤外線を感知するフォトトランジスターが内蔵されていて、赤外線LEDから発した光が反射して返ってきたところをフォトトランジスターで検知する仕組みです。 素子の反応速度は、データシートによると50〜150マイクロ秒です。3000rpmで回転しているとき150マイクロ秒の間に進む回転角は、2.7度なので旋盤やフライス版の回転数計測には十分です。

(2008-10-01追記)
 このセンサーは売り切れで現在入手できなくなっています。デジタル回転計キットのようにホールICと磁石を使用する方が回路は簡単になります。

回路図はこんなです。センサー部分の回路はフォトリフレクターに付いてきたデータシートに掲載されていた物をそっくりいただきました。このデータシートのピン配置図は素子を裏(足が出ている方)から見た物で、それが確認できるまでちょっと悩みました。左下のコンデンサーはパスコンです(普通は回路図に書きません)


上のセンサー部分をブレッドボードで組んで電圧を計測してみました。白い紙をセンサーの上に置くと5V、黒い紙(マジックで黒く塗った物)をのせると0.1Vです。旋盤のプーリー等に黒い印を付けた紙を貼り付けるだけで、回転を検知できそうです。センサーの焦点距離はデータシートによると4mmです。


回転数を正確に測るためには、発信周波数も正確でなければなりません。いつもは村田製作所のセラロックを使いますが、精度が必要なので水晶発振モジュールを使用します。これも秋月電子で売っている1個¥200のものです。波形は右の通りですがこのオシロスコープで測定できる限界を超えているはずなので周波数以外はあてになりません。


パーツリスト(これはプリント基板バージョンのパーツリストです)
    数量 単価 価格 購入場所
CPU PIC16F648A 1 250 250 秋月電子
ソケット 18PIN 1 100 100 秋月電子
センサー GP2S05 1 300 300 秋月電子
トランジスタ 2SC1815Y 6 20 120 千石電商
LED PARA LIGHT C-551SR 5 100 500 秋月電子
R19 4.7k 1/6W 1 5 5 千石電商/秋月電子
R18 330Ω 1/6W 1 5 5 千石電商/秋月電子
R17 3.3k 1/6W 1 5 5 千石電商/秋月電子
R16 68k 1/6W 1 5 5 千石電商/秋月電子
R15 33k 1/6W 8 5 40 千石電商/秋月電子
R14-R8 330Ω 1/6W 5 30 千石電商/秋月電子
R7-R3 4.7k 1/6W 7 5 35 千石電商/秋月電子
R2-R1 10k 1/6W 2 5 15 千石電商/秋月電子
C1パスコン 0.1uF 積層セラミック 1 5 5 千石電商/秋月電子
クリスタルモジュール 12.8MHz 1 200 200 秋月電子
基板 感光基板 サンハヤト40k 1 400 400 千石電商
ケース プラスチック 1 500 500 千石電商
ACアダプター 5V 1A 1 650 650 秋月電子
DCジャック   1 30 30 秋月電子
合計 3195


ソフトの開発に取りかかる前に仕様を決めておきます。
 1.精度は1rpmとする。1000rpmも回転していれば下一桁など何の意味もないが凝ってみたいので。
 2.計測範囲0〜9999rpm。これはLEDが4桁からくるもの。CPUの足が1本余っているので5桁までいけるが実用性に乏しいので。
 3.回転数の計測は回転体が1回転する時間からもとめる。つまり 回転数[rpm]=60秒/1回転の所要時間[秒] の式で回転数を求める。
 4.表示は0.5秒置きに更新する。これをあまり早くすると下一桁が激しく変わってしまい見づらくなる(たぶん)。
    もちろん1回転する時間がこれより長い場合はこの限りにあらずです

時間間隔の計測はPICのタイマ1(16ビットタイマ)を使います。タイマ0とタイマ2は8ビットタイマなので精度1rpmを達成するためにはオーバーフローの回数を数えなければならずソフト側の処理が面倒です。高速で動作するCPUは短い時間間隔の測定より、長い時間間隔の測定が苦手です。タイマ1のプリスケーラーに設定できる最大値は8なので、計測できる最大時間は以下の式の通りになります
 1[秒]/(12800000[Hz]/4[Cycle]/8[Prescale])×65536=0.16384[秒]
これをrpmに直すと
 60[秒]/0.16384[秒]=366.21[rpm]
となり367[rpm]までは16ビットのタイマで素直に計測できますが、366[rpm]以下はタイマがオーバーフローしてしまうため、オーバーフローの回数も数えなくてはなりません。これについては逃げ道がないので、汚いプログラムになりますがオーバーフローの回数を数えることにします。
高回転を計測するときはプリスケーラーの設定値は小さい方が有利です、実際プリスケーラー値「8」では、最大4912[rpm]以上の回転数で精度1[rpm]を達成できません。結果、以下のロジックで計測することにしました。

Step1.センサーから信号が来たらプリスケーラーに「8」をセットしてカウントを開始する
Step2.センサーから次の信号が来たときにタイマ1の値が4885以下(=回転数4912rpm以上)ならStep3へ、それ以外はなら
      オーバーフローの回数も含めて1回転の所要時間を計測し、その値を表示してStep1へ
Step3.センサーから信号が来たらプリスケーラーに「1」をセットしてカウントをやり直し、計測したらその値を表示してStep1へ

基板はこれを使います。サンハヤトのICB−503。紙エポキシ基板です。LEDがちょうど5個乗るので5桁に設計変更します。


実体配線図です。蛇の目基板を使うので病的なまでに2.54mmピッチにこだわった配線をしています。EAGLEを使って手動でルーティングしました。回路図から生成された配線なので、誤配線があり得ないところがEAGLEのいいところです。赤い線が部品面にあるジャンパー線、青い線がハンダ面の配線です。これは部品面から見たところです。LEDの下に抵抗と配線がありますが、これは小数点表示用の配線なのでCPUに繋がっていません。回転計が不要になったら実験用の回路として流用するための物です。回路図は完成してから再度掲載し直します。


EAGLEは反転印刷やハンダ面だけの印刷も出来るのでこれを見ながら配線します。左が部品面、右がハンダ面を印刷した物です。抵抗は全て1/6Wの物を使います。写真に写っている物が1列ICソケットに挿した1/4W抵抗です。1/6Wの抵抗はこれよりかなり小柄でICピッチ1本分狭いピン間隔に挿すことが出来ます。5V以上の電源を使用しないデジタル回路では1/4W抵抗はあまり出番がありません。電源が5Vなら抵抗の両端にかかる電圧は最大5Vなので、1/4Wの電力を消費させるためには 0.25[W]/5[V]=50[mA] の電流を流す必要があります。このときの抵抗値は5[V]/50[mA]=100[Ω]となります。実際1/4Wの定格の抵抗に1/4Wの電力を消費させると発熱が大きくなるので、たいていは、定格の1/5程度で使用します。このとき流せる電流も1/5になり、抵抗値は逆に大きくなって500[Ω]です。従ってデジタル回路では500Ωより小さい抵抗を使うときだけ、抵抗のワット数を計算すればいいことになりますが、これだけ低い抵抗を使うことはあまりありません。上の回路でも330Ωというのがありますが、LEDに接続されているために抵抗両端の電圧は3V程度に落ちているため1/6Wでも余裕があります。


ここで最低限の動作確認をしておきます。今回目新しいのは発信器に水晶発振モジュールを使うところとフォトリフレクターです。フォトリフレクターからの信号を受け取って7SEG_LED光らせる簡単なプログラムをmikroBASICで作って動かしてみました。電源を逆接したらPICに2A近い電流が流れてあわてましたが、死ななかったようです。保護回路でも入ってるんでしょうか?。それと新しい発見、PIC16F648AはMCLRピンにリセット用の抵抗を接続しないでいいようです。回路図上のR3が不必要になります。付けておいても悪さをしませんが不要なので取り去ってしまいます。


メイン基板完成。ICソケットの隣の3ピンソケットはセンサーを取り外せるようにするための物です。電源コネクタがまだ付いていません。


センサー基板です。ちょっとひびが入ってしまいました。ギロチンカッターで切るときに基板をドライヤーで暖めておくと割れにくくなります。センサーはハンダ面に配置。抵抗は1/6Wの物がなかったので1/4Wを使用しました。ケーブルは壊れたマウスの物を使用。


電源はこんなに小さくても5ボルト2アンペアの出力があります。秋月電子で購入。無負荷時の電圧は約5.2V。


いつもの環境で開発です。これはLEDの全セグメント点灯の実験をしているところ。5桁目が表示されず、2桁目も6の逆さまのような変な表示です。5桁目は抵抗を1つ入れ忘れているため(オープンドレインのRA4に接続されているのでプルアップ抵抗が必要)、2桁目はハンダ付け不良でした。


ボール盤のチャックに紙を巻いてマジックで黒く印を付けて動作確認しているところです。


これが完成したところ <−MOVIE
MOVIEの物は2回転に1回表示を更新しているので下2桁まで何を表示しているのかわかりませんが、下に添付したプログラムのほうは仕様通り0.5秒に1回表示を更新しています。マウスのケーブルを使ったので本体からセンサーまで1m近くありますが問題ないようです。

ソフトがかなりいいかげんなので回転していないときは表示が変わりません。ご参考までに掲載しておきます。ソフトをいじるときはRB0を出力設定にしないように注意してください。ポートを出力設定にして、出力をHIGHにすると過電流が流れます。
mikroBASICで書いたソフト一式
EAGLEで書いた回路図と基板のパターンファイル一式

最終形の回路図はこれ。トランジスタは全て2SC1815Yを使用しました。


完成した姿


とにかく散らかります。後かたづけは面倒。


謎だったフライス盤の回転数調べてみました、最小回転数120rpm、最大回転数2700rpmでした。高速側はもっと回っているように思ったのですが3000回転を超えていませんでした。高速側は音を聞いただけでわかるのですが回転速度が安定しません300rpm程度変化します。

これは小型のことだけあって最高速20096rpmで回ります。本体には8000〜20000rpmと書いてあります。回転していないときは計測をしないので表示はホールドしたままになります。センサーを遠ざけてしまうとこのように計測値を保持できます。(意図してそうしたわけではありませんが...)。現時点のソフトは計測誤差のことをあまり考慮していません。
・センサーがマークを検知してから計測をスタートするまでの時間
   その後、回転体がぐるっとひとまわりしてから次に
・センサーがマークを検知して計測をストップするまでの時間
両者が等しくないと計測値が正しいとはいえません。また、計測中にも表示のちらつきをなくすためLEDの桁表示を切り替えなければならず、その切り替えにかかる命令数も計測誤差になります。計算していませんが2〜3rpmの誤差があるかもしれません。


プリント基板も作ってみました。片面基板だとこれくらいの実装密度が限界です。EAGLEで設計するなら基板を起こしてしまった方が手っ取り早いようです。上のユニバーサル基板用のパターンを作るのにかかる時間も、これを作るのにかかる時間もたいして変わりありません。
・左上のLED基板は全て手動配線(これくらいの配線密度になると自動配線できません)
・左下のCPU基板は自動配線したところ1本だけ配線できなかったのでそれを手動配線した物
・右上のセンサー基板は全て自動配線

tachometer2.zip 
<−プリント基板バージョンのEAGLE回路図&基板パターン

せっかく作ったので、何かのついでに作ってみます。ソフトも誤差が大きいのでそのうち変更します。

センサーのレンズはこじると取れます。レンズは測定物からの距離を伸ばすためにあるので、レンズを取るとセンサーを近づけないと検知できなくなります。レンズを取ると2mm程度に近づけないとダメでした。


計測誤差を計算してみました。計測誤差の種類は以下のものがあり、これらの総和が誤差になります。
仕様だけが知りたいという人は青い文字の部分だけを見ればOK

誤差A.センサーからの信号をとらえてからタイマーを止めるまでの時間。
 センサーからの信号が来てから計測を開始する時間と、次に信号が来てから計測を終了するのに要する時間との差
 誤差になるのは時間差です。開始に要する時間と終了に要する時間が同じであれば誤差は0です。
 また、何もしない命令(NOP命令)を入れたりして命令数を合わせる工夫するとこの誤差は0に出来ます。

誤差B.LEDの表示を切り替えるのに要する時間。
 同時に点灯しているLEDは常に1つだけです、これを高速(1ミリ秒)で切り替ることにより全て点灯しているように見せかけています。
 この1ミリ秒ごとに発生する切替時間の間に運悪くセンサーからの信号が来ると、信号の処理は切替に要する時間だけ待たされるので、それが誤差になります。
 この誤差は計測開始と終了の双方に出くわす可能性があるため、最悪この時間を2倍した物が誤差になります。

誤差C.センサーの反応時間の差。
 反応時間が同じであれば誤差は生じません。しかし1回転毎に反応時間が全く同じということはありえません。
 この誤差は計測することにより求めることが出来ますが制度よく計測するのは難しいので今回は無視します。

誤差D.CPUクロックの時間
 計測はCPU1クロックの4倍の時間単位でしか実行できません。(1クロックの4倍は、ちょうど1命令の実行に要する時間と同じです)
 そのため1命令に要する時間が誤差になります。この誤差も計測開始と終了時に発生するので、この時間を2倍した物が誤差になります。

誤差E.水晶発振モジュールの誤差
 12.8MHzの水晶発振モジュールを使用しましたが、実際は12.8MHzちょうどではなく誤差があるはずです。
 このモジュールには12.8000MHzとかかれているので有効数字から考えて必要十分な精度があるとして誤差は無視することにします。

誤差F.タイマーのオーバーフロー回数を数える時間
 この処理をしている間はLEDの表示切り替え同様、センサーからの信号の処理が待たされます。
 LEDの場合は2倍しましたが、計測開始時にタイマーをリセットするのでこれは2倍する必要はありありません。

誤差が大きくなるのは回転数が大きいときです。仮に上記誤差A〜Fが150命令だとすると(今のプログラムは実際これくらいの命令数があります)
この回転計の最大計測可能回転数である99999rpmでの誤差は...

最高回転数における誤差[rpm]=最高回転数×誤差命令数÷1回転の命令数
              =最高回転数×誤差命令数÷(1秒間の命令数÷1秒間の回転数)
              =99999×150÷(3200000÷(99999÷60))
              =7812[rpm]

となりちょっと大きすぎます。2〜3rpmどころではありませんでした。
1回転にかかる時間から回転速度を求めずに7812回転にかかる時間から回転速度を求めると誤差はちょうど1rpmになります。
7812回転にかかる時間は4秒にもなります。つまり4秒待たなければ回転数の表示を更新できないことになります。さすがにこれは長すぎます。但し10万rpmの回転体などお目にかかることはほとんどないでしょうから(直径10cmの物体が10万rpmで回転すると外周部の速度が音速を超えます。衝撃波出るのか???)現実的な2万rpmのときの誤差を計算すると

20000rpmにおける誤差=20000×150÷(3200000÷(20000÷60))
              =312[rpm]

312回転にかかる時間は約0.9秒です。従って表示の更新間隔も0.9秒となり、これでもちょっと長すぎます。
アセンブラーで書いて命令数を少なくすればいいのですが、プログラムが読みにくくなるので0.5秒の表示更新間隔を確保できる精度を計算してみることにします。
0.5秒間計測したときの誤差を式で書くと...

0.5秒間計測したときの誤差[rpm]=誤差命令数÷(0.5秒間の回転数×1回転の命令数)×1分間の回転数

となり表にするとこんな値になります。10000rpmまでは1rpmの精度があり、最大回転数でも10rpmの誤差となり実用上十分な精度を確保できます。

高精度版プログラムの測定精度
回転数 rpm 精度 rpm
1000rpm以下 0.1rpm以下
2000 0.19
3000 0.28
4000 0.38
5000 0.47
6000 0.56
7000 0.66
8000 0.75
9000 0.84
10000 0.94
20000 1.88
30000 2.81
40000 3.75
50000 4.69
60000 5.63
70000 6.56
80000 7.50
90000 8.44
100000 9.38

ということで、0.5秒の時間計測枠を目一杯使って計測する方式に改めたプログラムがこれです。但し低回転では0.5秒では1回転してくれないので今までの1回転にかかる時間から回転数を計測します。もちろん低回転域では今までの方式で1rpmの精度を確保できます。
高精度版プログラム <-バグってたので差し替えました(2006-07-19)

今までのプログラムは回転数の計算を以下の式で実行していました。
 rpm=1分間のタイマーカウント数 div 1回転のタイマーカウント数

今度は0.5秒間のタイマーカウント数で計算するので式は...
 rpm=(1分間のタイマーカウント数 × 0.5秒間の回転数) div 0.5秒間のタイマーカウント数

この式には問題があり括弧の中がmikroBASICで取り扱える32ビット変数に収まりきりません。上の式を変形して
 rpm=(1分間のタイマーカウント数 div 0.5秒間のタイマーカウント数) × 0.5秒間の回転数

と書くと、今度は括弧の中が32ビット以内に収まるものの、divするときに小数点以下が切り捨てられるため、最大で「0.5秒間の回転数rpm」だけの誤差を生じます。

そこで、何とか32ビットに値が収まるように
 rpm=(1分間のタイマーカウント数 div 0.5秒間のタイマーカウント数) × 0.5秒間の回転数
     +(1分間のタイマーカウント数 mod 0.5秒間のタイマーカウント数) × 0.5秒間の回転数 div 0.5秒間のタイマーカウント数

として計算します。mikroBASICは括弧付きの長い計算式を正しく計算してくれないので、この式を演算子一つずつに分解して計算しています。
0.5秒間の回転数は小数点以下の値を持つ数値になりますが、センサーが検知する黒印は1つしかないので整数の値しかとりません。したがって厳密には

 0.5秒間の回転数=0.5秒間の回転数の小数点以下を切り捨てた値
 0.5秒間のタイマーカウント数=0.5秒間の回転数だけ回転するのに要するタイマーのカウント数
                    =1600000−(65536−0.5秒間の最後の回転を検知したときのTMR1の値) <−間違ってます(2007-12-09追記)
                    =65536×0.5秒間の回転数+0.5秒間の最後の回転を検知したときのTMR1の値
となります。

div:整数同士の割り算の商
mod:整数同士の割り算の余り

今までは
回転体が加速、減速している時は表示が切り替わる瞬間の回転数を表示していましたが、今度は0.5秒間の平均回転数を表示していることになります。

基板を作りました。


2段重ねで完成です。ケースに入れるならこれくらいの大きさじゃないとね...。片面基板を強引にスルーホール加工しましたが強度が?なので電線で上下基板をつないだ方が無難です。但し、長めに配線しないとPICが抜けなくなります。




何も考えずにICSPコネクターを付けて書き込んだらPICライターを壊してしまいました。5桁目(最上位桁)のLEDを制御しているトランジスターがRA4ポートのプルアップ抵抗でONするので過電流(たぶん20mA程度)が流れたようです。右の写真はICSPでプログラムしているところではなく、壊しているところです。LEDが下を向いているので点灯していることに気が付きませんでした。(5桁目の2つのセグメントが光ります)。秋月電子のPICライターは メイン回路−>トランジスターアレイ(MC1413)−>アナログスイッチ(4066) という接続回路になっていますがアナログスイッチは定格10mAなので、これが壊れた物と思われます。でも、なぜかPIC16F877は書き込めます。なぜでしょう? とりあえずアナログスイッチを交換してみます。
今度何か作るときはRA4がオープンドレインじゃないものに乗り換えようと思います。秋月で売っていて、RA4がオープンドレインでない18PINのPICで探すとPIC16F88しかないみたいです。


両面基板も作ってみました。基板一枚の裏表両面に部品を配置しています。ハンダ付けの順番を守らないと組み立てられなくなりますが、基板屋に発注するなら2段重ねのような贅沢仕様には出来ません。これは自転車走行ロガーの基板を発注する時に余った場所(余る場所のほうが大きい)に面付けするために作ってみました。


両面基板はこのケースに楽にはいるようにサイズを決めました。


周波数の違う発信器を使う場合は、プログラムの中の以下の値を変更すると違う周波数の発信器でも大丈夫です。また、発信器の出力が「TTLコンパチ」と謳っているものは、出力端子に付いている10kΩは取り去ってしまってください。

CONST_1)
   192000000
   これは12.8MHzの時の1分間の命令数(=タイマーカウント数)です
   20MHzなら20/12.8倍すればOKです
CONST_2)
   1600000 <-
間違えていました 1638400 が正解です。0.5秒はタイマー1が25回オーバーフローする回数を使用して生成しているのでちょっと誤差があります
   12.8MHzの時の0.5秒間のタイマーカウント数です
   20MHzなら上記同様、20/12.8倍すればOKです
CONST_3)
   24000000
   1)の192000000÷8です
   プリスケーラーで1/8にしたときの1分間のタイマーカウント数です
   これも同様に 20MHzなら20/12.8倍すればOKです   

この値が出現するのは全部で5カ所です。20MHz以外の周波数でも同じ理屈で変更すればうまくいくはずです。計算めんどうという人は添付のEXCELファイルの12.8の部分を変更してみてください。赤くなっている部分が上の値です。ちなみに緑の部分が精度です。
定数の計算EXCELワークシート <−EXCELをもっていないひとは無料のOpenOfiiceを使って開いてください。
<-このシート間違いあります
上のシートは間違いあるので
これを使ってください

◆ICSP問題の結果
PICライターは壊れていませんでした。壊れていたのは対照実験に使った予備のPICのほうでした。ソケットからPICを抜いてプログラマーのZIFソケットに挿して書き込んだらうまくいきました。ICエキストラクターの爪が入る隙間すらないので抜くのは大変。アナログスイッチの定格は10mAではありませんでした、もっと流せます。25mAのようです。


抜くことを考えて設計していなかったときは、こうなります。
書き込めない原因はおそらく、単独で動くXTALを使ったためプログラマーからの電源が供給されるだけで発信してしまいPICがプログラムモードに入ったことを検知できないためです。XTALを切り離すことはパターンをカットする以外に方法はないので、この回路、ICSP対応不能ということになります。秋月電子のプログラマーはNGですが、microchip純正のICD2は外部発信回路でも大丈夫なようになっているらしいのですが、現物がないので確認できません。上の両面基板、ICSP用の5ピン端子を付けましたが、これもXTALモジュールを使用しているので同じ結果になるはずです。要設計変更です。自転車走行ロガーは同じXTAL使っているのにICSPがうまくいっているのでPICの種類によって差があるということでしょうか?


ABSは切削性がいいのですが、それでも大穴をあけるときは0.5mmほど小さめに切り抜いてから、仕上げ加工をするほうがうまくいきます。使っているエンドミルは3mmです。


ブラウンアクリル板で窓にはめ込むパネルを作っているところです。バイスの上に強引に固定してます。かなりいいかげんな固定方法ですが、これでも問題ない精度が出ます。これも一度に寸法を出してしまうのではなく荒削りのあと仕上げ削り(切り込み0.05mm程度)をして、無理な力がかかって変形しないようにします。横長の物は固定し直すと位置決めが面倒なので、一度の固定で両側面を加工してしまいます。短辺はバイスに銜えて片側ずつ加工します。角のRは紙ヤスリを貼った木の板を使って丸めます。


廣杉計器でスペーサーを購入しました。全部で250個、¥2993です。ついでに無料のカタログも頼んでおきました。¥2000以上だと送料無料。企業相手に商売しているようですが、会社名のところに個人と入れて発注すれば受け付けてくれるみたいです。50個が最低発注量ですがスペーサーは4個単位で消費するので案外あっという間になくなります。秋葉原のパーツ屋では5mm単位でしか品揃えしていませんが、ここは1mm単位で長さが選択できます。今年の7月から実施なのでRoHS対応も進んでいるようです。RoHSはロハスだと思っていましたがローズと読むそうです。


ボスは邪魔なので削り落としました。大穴があいてしまうので少し座具ってワッシャーを埋め込みました。


中身はこんなです。


完成状態裏と表。


取り付けたところは旋盤のページを見てください。

回転計のキットは売店で売ってます。