マイコンマニヤックス/スピード・タコメーター製作編
とりあえず取り掛かります。
マイコン部と表示部は分けたほうが賢明だろうから、半田付けがマンドクセー7セグLED部から作ります。
・・・4桁ダイナミック駆動の完成品とか買ったほうがいいんだろうか・・と思う今日この頃。
とりあえずマイコン部の仕様とかは何も考えてません。たぶんAVR2313で作ると思いますが・・・
スピードにするか、タコにするかもかんがえてません。
なんとなく、バーグラフLEDもつけて、普段は7セグが速度、タコがバーグラフ。スイッチ押したらタコが7セグに・・みたいな感じがいいのかなー?
めんどくさいからタコとスピードはマイコン別ですね。
あとサブ表示に液晶もつけたい。
・・・2セグメント分半田付けしたところで電池きれました。寝ます。
やっと5セグメントまで半田付け終わる。
最高にマンドクセー・・・
・・・盆休み、義実家で暇やったんやからもって行ってコレやればよかった・・・と心が折れる俺であった。
やっと全セグメントとコモンの配線が終わりました。
とりあえずブレッドボードに接続してみます。
手配線で全セグメントをテスト点灯させてみる。
DMC映画公開記念!獣の数字666で点灯。
表示部ができたので、マイコン基盤を作ります。
今回は、本番用は別に作ることにして、書き込み機能とブレッドボードへ差し込めるピンヘッダつきのソフト開発基盤をまずつくります。
たいして難しい回路じゃないので、1時間くらいでできました。
とりあえずLEDをつないで点滅するだけのソフトを書き込んで見ます。
動いたからOKとしましょう。
とりあえず、LED基盤とCPU基盤をブレッドボード上で結合!!
まず動作確認をしてみます。
簡単なプログラムを書いて数字を各桁に表示してみましょう。
数字じゃおもしろくないので・・・
こんなことしてみました。
ついカっとなってやってしまった。
今は後悔している。
というか、この時点ですべて出来たつもりになって、モチベーションが凍結されているのは公然の秘密だ(w
さて、タコメーターを作るなら避けては通れないのがタイマー処理と割り込み処理です。
ボードにスイッチをつけて、タイマ1のキャプチャ入力に割り込みをかけて制御してみます。
unsigned int jj; ISR (TIMER1_CAPT_vect) { jj++; if (jj > 8){ jj = 0; } } void main(){ TCNT1 = 0x0000; TCCR1A = 0x00; TCCR1B = 0x85; TIMSK = 0x08; sei(); 7seg(jj);
みたいにして、スイッチを押すたびに変数jjをカウントアップして、パターンをソレ使って順番に切り替えてみようとしたのですが・・・
ピクリともパターンが変わりません
デバッガつかってみてみると割り込み自体はかかってるみたいなんですが・・・
うーーん、、割り込みがかかってて変数もカウントアップされているのに、この簡単なロジックでなぜに動かないのだ??
というか、、、変数が、、メインループの外でカウントアップ、、って
volatile int jj で修飾しないとダメじゃないですか!
うーん、そうか、こういうマイコンのCコンパイラでもまともに最適化とかしてくれるんですね。
とりあえず外部割込みはかかるようになりました。
同じ要領でタイマ割り込みもかかりました。
次は外部割込みの間隔を計測してRPM表示にしてみます。
・・・やる気が次に出たら・・・・
グタグタとやってましたが、ようやくタコメーター製作にちょっと近づきました。
スイッチ1回押すのをエンジン一回転と見立ててます。
一応、オープニングに例の画像が何秒か見えるようにしてます。
動画の中身。
1.まず、入力パルスの数を数えます>できた
2.じゃあ、入力パルスの幅をms単位で数えてみます>これもできた
3.では、パルス幅から回転数(RPM)を逆算してみましょう>これもできました。
人力エンジンは500RPMくらいが限界のようです(たぶん半分はスイッチのチャタリ ングです・・・)
次はこないだ作ったDDS回路を入力にして、0から10000RPMくらいまで較正してみないといけませんが・・・
あとはCDIからの信号を拾えば??
問題はそれですね。入力のアナログ回路を作らないといけません。
あと電源部と・・・