ピックワールド(PIC World)

インフォメーション

この記事は 2017年11月19日 に以下のカテゴリに投稿されました Arduino Blog.

この記事のタグ

, , , , , , , , , , , ,


Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その2)

こんなに簡単でよいのかなぁと思うほど便利な Arduino なんだけどね。

前回までで、これ、見方を変えると周波数カウンターなんだけど、まぁちゃんと動いてる。

さて、予告した通り、表示部を作るのだけれど、実は前に作ってまだ完成していないものが、流用できるだろうということで、これを使うことにした。

何桁表示しようかなと、考えたんだけれど、バイクによってもエンジンの回転数は異なる。

カブ(リトルカブ)系のエンジンだと、アイドリングは 1700 RPM、最大回転数は 9500 RPM 程度らしい。

ん~。

4桁にするか、5桁にするか迷うところなんだよね~

なんかさ、1万回転っていうと、夢ありそうな感じするし、回っちゃったら嬉しいだろうなぁということで、少し大変なのだけど、5桁の仕様にすることにした。

先に行った実験で、Arduino とあの回路で測定できるのは、20KHz ぐらいだったので、2万回転ぐらいが測定できるタコメーターってことになる。

十分でしょ。

さて、素子が増えれば配線もた~いへんなことになるのが普通ではあるが、ここで工夫ってのが生きるわけ。

世の中には便利なものがあってさ、この場合には、シフトレジスタってのを使うと、電源を除いて、たった3本の線を Arduino に繋ぐだけで 7セグ LED(など)を制御できちゃうというものがある。

いくつかのメーカーから出ているけれど、一番入手しやすいのは、SN74LS595 ってシフトレジスタ。

これ、手元にあるから、これを使う。

さて、シフトレジスタの仕様を確認する。

これは、8ビットのシフトレジスタだね~

う~ん。

7セグの LED を 4個まとめたダイナミック接続の LED アレイを使うと、信号は桁の指定に4本、LED の点灯に 7本。5桁の仕様にするには、加えて1桁の7セグ LED をダイナミック接続しちゃえば良いので、桁の指定に5本が必要となるから合計で12本。

74HC595 が2個必要になるねぇ。

こういうところもちゃんと考えられていて、74HC595は、直列に接続することができるの。

これはスペース(大きさ)の問題以外は、2個使うことで回避できるね。

で、サクッと書いたのがこちらの回路図。

7SEG5DIGIT(74HC595)_回路図

7SEG5DIGIT(74HC595)_回路図

Arduino 側で使うピンは、スケッチに合わせればよいと思うけれど、5 / 6 / 7 としてみた。(これは変更可能)

※調子に乗って線引いてたものだから DP も引いてあって8本となってるけど、実際にはいらない。(まぁいいんじゃない?)

さて、スケッチだけれど、今はインターネットにたくさんサンプルがあるので、それらをもちろん使わせてもらって、こんな感じとしてみた。(参考にさせていただいたページはこちら


//7セグLEDカウンタ-シフトレジスタ75HC595N

#include <Metro.h> // タイマー処理のために Metro ライブラリをインクルード

Metro metro1 = Metro(250); // metro1 タイマーを 250ms にセット

#define DATAPIN (5) // 74LC595の(14)SIへ
#define LATCHPIN (6) // 74LC595の(12)RCKへ
#define CLOCKPIN (7) // 74LC595の(11)SCKへ

#define FREQPIN (3) // 周波数測定用の入力ピン

// パルスの幅を測定する変数

unsigned long l_time = 0;
unsigned long t_time = 0;
unsigned int h_time = 0;

struct PTN{
int nOut;
};

struct PTN ptn[11] // 7seg LED のパターンを設定
{
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01100111, // 9
B00000000  // Space
};

void setup() {

pinMode(DATAPIN, OUTPUT); // 7seg LED 制御用(1)
pinMode(LATCHPIN, OUTPUT); // 7seg LED 制御用(2)
pinMode(CLOCKPIN, OUTPUT); // 7seg LED 制御用(3)

pinMode(FREQPIN, INPUT); // 周波数測定用のピンを入力用に設定

Serial.begin(9600); // シリアルポートを 9600bps で開始
}

long FREQ1 = 0;

void loop() {

if (metro1.check() == 1) { // Metro を使って 250ms 毎に下記を実行し、周波数を求める

h_time = pulseIn( 3, HIGH ); // まずは3番ピンが High 状態になっている時間を p_time に格納
l_time = pulseIn( 3, LOW); // 次に3番ピンが Low になっている状態を l_time に格納

t_time = h_time + l_time ; // 足し算してパルスの幅(周期)にする

Serial.print( (1.0 / t_time) * 1000000 , DEC ); // シリアルポートに周波数に換算して10進数で出力する

Serial.println( "Hz");

FREQ1 = (1.0 / t_time) * 1000000;

Out5Digit(FREQ1); // 7seg LED に出力 値を 250ms ごとに更新

}

Out5Digit(FREQ1); // 7seg LED に出力 こっちは同じ値を出しておくため(チラついちゃうから)

}

void Out5Digit(long nValue)
{
for(int i=0;i<5;i++){
int amari = nValue %10;
Out(i, amari);
nValue = nValue / 10;
}
}

void Out(int nKeta, int nValue)
{
if(nKeta==4 and nValue==0) { // 最上位の桁を0(ゼロ)の時、どうしても消したいから
nValue=10; // カブのアイドリングは1700RPMだから最上位桁だけでよいの
} // (時間があるときにもう少し書けば、頭に 0 出さなくできる)
digitalWrite(LATCHPIN, LOW);
ShiftOut8( DATAPIN, CLOCKPIN, ~(B00000001 << nKeta));
ShiftOut8( DATAPIN, CLOCKPIN, ptn[nValue].nOut);
digitalWrite(LATCHPIN, HIGH);
delay(1);
}

void ShiftOut8( int dataPin, int clockPin, unsigned long val )
{
for( int i = 7; i >= 0; i-- ){
digitalWrite(dataPin, !!(val & (1L << i)));
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}

参考にさせてもらったページのスケッチだと 5桁目に 0(ゼロ)が表示されてしまうので、それが嫌で、5桁目の時だけだけど、0 が来たら Space(何も光らない)にした。

※もう少しまともにかけよといわれそう。そのうちちゃんと書くよ。

でも、ちゃんと動くからよい。だから先にアイドリングは 1700 RPM って書いたじゃないの。(3桁目はまぁ良いかと)(画像はちょっとしたちらついてるけどね4桁目、目には見えない)

7SEG5DIGIT(74HC595)

7SEG5DIGIT(74HC595)

1万回転を超えるると、ちゃんと表示するんだよ~

7SEG5DIGIT(74HC595)

7SEG5DIGIT(74HC595)

 

Metro ライブラリを使っているけれど、これは、loop の中でグルングルン回していると、表示がちらついてしまって、数字が読みとれないから。

250ms ごとに波形を測定することにしてみた。

このループの中で、あまり重い処理をするのはどうかと思うけれど、今のところはこれで問題となることはないみたい。

こんな感じで、表示部はプロトタイプだけれど、これで完成としよう。

実際には、かなり小型化しないといけないんだけどね。

さて、お次はいよいよリトルカブに搭載する準備を始めることにして、まずはコイルの一時側の信号を計測してみようかなぁ。(って手持ちの機材でできるのか?)

Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その1)

Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その2)- この記事

Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その3)

 

 


コメントを残す

最近の投稿

最近のコメント

アーカイブ