市販のレブカウンターより自作品のほうが、エンジン特性に合わせた補正で誤差が1/3以下になるケースがあります。
レブカウンターの自作を始める前に、まず「どうやってエンジン回転数を電気信号として取り出すか」を理解することが出発点になります。市販品でも自作品でも、回転数計測の原理は変わりません。エンジンが1回転するごとに発生する何らかの周期的な信号を数え、それを毎分換算(RPM)に変換するのが基本的な仕組みです。
信号の取得方法は大きく3種類に分かれます。
点火パルス方式は配線が比較的簡単ですが、プラグ1本あたりの点火回数がエンジン仕様によって異なります。4ストローク4気筒エンジンなら「クランク2回転で1気筒が1回点火」し、4気筒合計で「1回転あたり2パルス」発生します。これが正確に把握できていないと、表示RPMが実際の2倍・半分になるという典型的な失敗につながります。つまりパルス数の設定が精度の命です。
ホールICセンサー方式では、代表的なICとして「SS49E」や「A3144」が挙げられます。A3144はデジタル出力タイプで、マグネットが近づいたときにLOW信号を出力します。Arduinoとの組み合わせでは、この出力を割り込みピン(INT0/INT1)で受け取るのが定石です。SS49Eはアナログ出力タイプなのでアナログピンに接続してAD変換経由での処理になりますが、精度より構成の簡便さを重視する場合に使われます。
光学センサー方式は屋外・屋内環境による光の影響を受けやすいのが弱点です。直射日光下でフォトトランジスタが誤動作する事例は珍しくなく、屋外で使う自転車のサイクルコンピューター自作では遮光対策が必須になります。これは意外と見落とされがちなポイントです。
部品選びで悩む人は多いですが、構成はシンプルに絞れます。Arduinoベースで作る場合の標準的な部品リストと費用目安は以下の通りです。
| 部品名 | 用途 | 費用目安 |
|---|---|---|
| Arduino Nano | メインマイコン(処理・計算) | 500〜800円 |
| ホールICセンサー(A3144) | 回転検出 | 50〜100円 |
| 7セグLEDまたはOLEDディスプレイ | RPM表示 | 200〜600円 |
| 分圧抵抗(10kΩ・1kΩ) | 信号電圧の保護 | 10〜30円 |
| ツェナーダイオード(5.1V) | 過電圧保護 | 20〜50円 |
| ユニバーサル基板・ケース | 実装・保護 | 200〜500円 |
| 電源(DC-DCコンバーター) | 車両電源からの降圧 | 200〜400円 |
合計で概ね1,200円〜2,500円程度で揃います。これはカーショップで売られている市販のデジタルタコメーター(5,000〜15,000円程度)と比較して、1/2〜1/6の費用です。いい意味でコスパが高いですね。
ディスプレイの選択は用途によって分けるのがおすすめです。OLEDディスプレイ(0.96インチ、I2C接続)は解像度が128×64ピクセルで視認性が高く、バーグラフや数値を同時表示できます。一方、7セグLEDはシンプルですが明るい場所での視認性に優れており、直射日光下で使うバイク向けには向いています。
Arduino Nanoを使う場合、注意すべきは動作電圧です。Arduino Nanoの動作電圧は5Vですが、車両の点火パルスは12V以上になる場合があります。分圧抵抗だけで落とす構成では電圧スパイク(点火時の瞬間的な高電圧)への耐性が低く、IC破損の原因になります。ツェナーダイオードを並列に入れてクランプする構成が必須と考えてください。これが基本です。
Arduinoで割り込みを使ったRPM計測の基本的な処理の流れを理解しておきましょう。実装の肝は「パルス間の時間を計測してRPMに変換する」または「一定時間内のパルス数を数えてRPMに変換する」の2方式です。
前者は「周期計測法」と呼ばれ、1パルスあたりの時間(μs単位)を`micros()`で計測し、以下の計算式でRPMを求めます。
RPM = 60,000,000 ÷ パルス間隔(μs) ÷ 気筒数補正係数
後者は「カウント法」で、100msや500msといった固定区間でパルスをカウントし、それを毎分換算します。カウント法は高回転域の安定性が高い一方、低回転域(アイドリング付近)での更新レートが遅くなるという弱点があります。一般的なエンジン回転計では周期計測法のほうが応答性が優れています。
```cpp
volatile unsigned long lastPulseTime = 0;
volatile unsigned long pulseInterval = 0;
void pulseISR() {
unsigned long now = micros();
pulseInterval = now - lastPulseTime;
lastPulseTime = now;
}
void setup() {
attachInterrupt(digitalPinToInterrupt(2), pulseISR, FALLING);
}
void loop() {
if (pulseInterval > 0) {
float rpm = 60000000.0 / pulseInterval / 補正係数;
// ディスプレイ表示処理
}
delay(100);
}
```
補正係数の設定が精度に直結します。4ストローク4気筒なら1回転で2パルス出るため、補正係数は2.0です。4ストローク単気筒なら0.5(クランク2回転で1パルス)になります。この係数を間違えると表示が2倍・4倍のずれた値になります。気筒数とストローク数の確認を最初に行うのが原則です。
ノイズ対策として、`pulseInterval`が極端に小さい値(例:1,000μs以下 = 60,000RPM以上)になった場合はその値を捨てる処理も重要です。点火ノイズや電源ノイズによるゴーストパルスが混入すると、一瞬で表示が異常値に跳ね上がります。ローパスフィルターを数値処理で実装する(直近5回の移動平均を取るなど)のも有効な手段です。
回路図の構成としては、ホールICの出力をArduinoのデジタル2番ピン(INT0)に接続し、プルアップ抵抗(10kΩ)をVCCとの間に入れるのが基本です。電源ラインには100μFの電解コンデンサと0.1μFのセラミックコンデンサを並列に入れてデカップリングすることで、電源ノイズによる誤動作を大幅に減らせます。
自作レブカウンターの最大の課題は「組み上がった後の誤差修正」です。これを適当に済ませると、6,000RPMを指しているつもりが実際は5,200RPMだった、という状況が起きます。精度の確認が必要です。
キャリブレーションの手順はシンプルです。
OBD-IIアダプター(Bluetooth接続タイプは1,500〜3,000円程度で入手可能)と「Torque」などのスマホアプリを基準として使う方法は、コストパフォーマンスが高くおすすめです。OBD-II対応車(概ね2000年以降の国産車・輸入車)であれば、この組み合わせで0.1%以下の精度で基準値を取得できます。
アイドリング域(700〜900RPM)での精度と高回転域(5,000〜8,000RPM)での精度は別々に確認することが重要です。周期計測法では低回転ほど1パルス間の時間が長くなるため、`pulseInterval`変数が32ビット整数のオーバーフローを起こさないかも合わせて確認してください。`unsigned long`型を使えばオーバーフロー限界は約71分なので問題になりませんが、`unsigned int`型を使うと65,535μsすなわち約915RPM以下で桁あふれします。この点は見落としやすいポイントです。
自作レブカウンターを車両に恒久設置する場合、日本の車検では「後付け計器類は計測精度に関する規定の適用外」ですが、配線処理が既存の電装系に悪影響を与える場合は整備不良として指摘される可能性があります。点火系(イグニッションコイルの一次側)に接続する際は、必ずインピーダンスを高く保ち(測定回路が点火系に電流を引っ張らないよう)、並列接続でも影響が出ないよう高抵抗値で接続する設計にしてください。
自作レブカウンターの応用先は多様ですが、乗り物ごとに設計上の注意点が異なります。これは市販品の解説ではあまり言及されない部分です。
バイクへの搭載では、振動への耐性が最大の課題になります。自動車と比較してバイクのエンジン振動は2〜5倍程度大きく、ユニバーサル基板の半田付け部分がクラックしやすい環境です。車両搭載を前提とする場合、基板は必ずシリコン系ポッティング剤でコーティングするか、基板固定用のスペーサーをゴム素材にしてダンピングを入れるかの対策が必要です。接触不良が起きやすいです。
また、バイクの電装系は車に比べてアース(グランド)が貧弱なケースが多く、車体アースと電装アースを別系統にしないと数百mV〜2Vのグランドノイズが乗ることがあります。これがパルスカウントの誤動作に直結します。専用のアースラインを引く、もしくはフォトカプラ(PC817等、20〜50円)でイグニッション信号をマイコン側と電気的に絶縁する設計が効果的です。
旧車(ポイント点火式エンジン)への搭載は注意が必要です。ポイント点火はトランジスタ点火と比べて信号のエッジがなまりやすく、チャタリング(接点がバウンスする現象)が発生します。チャタリングがあると1点火あたり複数のパルスとして検出され、RPM表示が実際の2〜5倍に跳ね上がることがあります。ハードウェア側にRC回路(例:330Ω+0.1μF)でローパスフィルターを組み込むか、ソフトウェア側でパルス間の最小間隔(例:1ms以下は無視)を設定する対策が必要です。
自転車・電動アシスト自転車への応用では、磁気センサーをスポークに固定した磁石で検出する方式が主流です。この場合は「1回転1パルス」が基本なので気筒補正が不要で計算はシンプルです。ただし自転車のホイール径は26インチ・700Cなど複数あり、速度表示を兼ねる場合はホイール周長をパラメーターとして設定できる構成にしておくと応用範囲が広がります。自転車用には屋外使用を想定した防水処理(IPX4相当:水の飛沫に耐える程度)が求められます。
独自視点として見落とされがちなのが「電源電圧変動への対処」です。エンジン始動時にはバッテリー電圧が12Vから9V台まで一時的に落ち込みます。この電圧変動がマイコンのリセットを引き起こすことがあります。Arduino Nanoの場合、内部レギュレーターで7〜12Vの入力に対応していますが、9V以下に落ちた瞬間に外部5V電源から直接供給する回路構成にすると安定します。もし車載用DC-DCコンバーター(出力5V固定型、入力範囲6〜36V)を使えば、この問題はほぼ解決します。費用追加は200〜400円程度です。コスパが高い対策ですね。
以下のリンクでは、Arduinoの`attachInterrupt`と`micros()`を用いた正確なパルス計測の実装例と、オーバーフロー対策の詳細が公式ドキュメントで確認できます。
Arduino公式リファレンス:attachInterrupt(割り込み関数の使い方・注意事項)
また、車両搭載向け自作電装品の安全な配線設計については、以下が参考になります。
日本自動車整備振興会連合会(JASPA):後付け電装品に関する整備上の取り扱い情報の確認に