こんなに簡単でよいのかなぁと思うほど便利な 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個使うことで回避できるね。
で、サクッと書いたのがこちらの回路図。
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桁目、目には見えない)
1万回転を超えるると、ちゃんと表示するんだよ~
Metro ライブラリを使っているけれど、これは、loop の中でグルングルン回していると、表示がちらついてしまって、数字が読みとれないから。
250ms ごとに波形を測定することにしてみた。
このループの中で、あまり重い処理をするのはどうかと思うけれど、今のところはこれで問題となることはないみたい。
こんな感じで、表示部はプロトタイプだけれど、これで完成としよう。
実際には、かなり小型化しないといけないんだけどね。
さて、お次はいよいよリトルカブに搭載する準備を始めることにして、まずはコイルの一時側の信号を計測してみようかなぁ。(って手持ちの機材でできるのか?)
Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その1)
Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その2)- この記事
Arduino で周波数を計測する – バイクのタコメーターを作りたいんだよ!(その3)
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。