ルニヲ’s diary

NSFとNSRでミニバイクざんまい。

GPSロガーについてアレコレ その5

ルニヲロガー2のタコメータ動画をyoutubeに上げたところ、回路図とかスケッチを見たいというコメントがありました。
大したものではありませんが、載せておきます。

www.youtube.com

ハードウェア構成

fritzingで描いてみました。
f:id:runio:20200224214507p:plain

回路図はこんな感じになります。
f:id:runio:20200224214520p:plain

正直、ハードウェアは詳しくなく、手探りで作りましたので、保障は致しかねます。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を掛ければ良いことになります。

あと、注意するのは、レーシングプラグは使わないことです。
ノイズがすごくて、マイコンがリセットしますので。