GPSロガーについてアレコレ その5
ルニヲロガー2のタコメータ動画をyoutubeに上げたところ、回路図とかスケッチを見たいというコメントがありました。
大したものではありませんが、載せておきます。
ハードウェア構成
fritzingで描いてみました。
回路図はこんな感じになります。
正直、ハードウェアは詳しくなく、手探りで作りましたので、保障は致しかねます。m(_ _)m
仕組み的には、NSR50のパルサーからの点火信号を、シュミットトリガで矩形波にして、マイコンに取り込んでいます。
電流と電圧を下げる為に、抵抗で分圧していますが、適当です。
開発にあたり、以下のサイトを参考にさせて頂きました。
ソフトウェア(ソースコード)
スケッチのうち、タコメータに関するところだけ載せておきます。
#include <M5Stack.h> #define PLSIN (3) // パルス入力ポート unsigned long rpm = 0; // エンジン回転数 hw_timer_t *pls_timer = NULL; // タイマオブジェクト int mode = HIGH; // 信号監視モード int pulse_cnt = 0; // パルス数 // 250msec割り込み処理 void IRAM_ATTR pls_cnt() { // 1回転あたり2パルスなので // pulse_cnt * (60 / 0.25) / 2 がrpmになる rpm = pulse_cnt * 120; pulse_cnt = 0; } // 初期化処理 void setup() { // 初期化処理 M5.begin(); // タイマ設定(タイマ0, プリスケーラ80(1μsec), 割込カウンタのインクリメント) pls_timer = timerBegin(0, 80, true); // 割り込みハンドラ設定 timerAttachInterrupt(pls_timer, &pls_cnt, true); // タイマ値設定(250000*1μsec=250msec) timerAlarmWrite(pls_timer, 250000, true); // タイマ割り込み開始 timerAlarmEnable(pls_timer); } // メインループ void loop() { int port; // タコパルス信号取得 port = digitalRead(PLSIN); // モードによる信号検出処理 if ((mode == LOW) && (port == HIGH)) { pulse_cnt++; mode = HIGH; } else if ((mode == HIGH) && (port == LOW)) { mode = LOW; } }
メインループでは、パルス信号のON/OFFを監視して、パルス数をカウントしています。
エッジ割り込みでカウントするようにもしたのですが、チャタリングが起こったので、ベタでカウントしています。
シュミットトリガを使っているから、割り込みでも大丈夫だと思うんですが。
ブレッドボードのせいかもしれません。
で、250msecのタイマ割り込みで、パルス数から回転数を計算しています。
NSR50の場合、1回転で2パルスが発生するので、250msecあたりのパルス数を、1分あたりの回転数(rpm)に変換するには、120を掛ければ良いことになります。
あと、注意するのは、レーシングプラグは使わないことです。
ノイズがすごくて、マイコンがリセットしますので。