完成しました。パルス発生器

イメージ 11

 先日から雪が降り始めまして、玄関先に出してあるジョルノとビーノを早くかたづけろと
実家の親から言われてますけど、寒いのが大嫌いなのでそのまま、放置しています。

 さすがに出しっぱなしじゃ不味いよなぁって様子をうかがっているのですが
休みの日は、大抵天気の悪い地域ですのでなかなかかたづける事が出来なくて
かなり困っています。

 平日に仕事休んで片づける程の事でもないのですけど、ちょっとサボるぞって
言えない状況ですので折りを見て片付けようと思っております。

 って事で先回に続きまして、今回も電気ネタです。
書庫まで作ってしまったので本人のやる気がえらく感じられるような気がしてますけど
飽きるのも速いのでその辺は、あー辞めたのは、飽きたのかぁって位に笑って下さい。

 中途半端に上げるのも何ですのでちょっとだけ本気出してしばらく掛かってました。
殆どがNETで情報を探すのが殆どでしたけど、触ってるウチに何となくわかるような気が
してきましたので少しは、成長してるような気がします。

 先回、回転数が出るようになったarduinoの表示器ですけど、何とか形になりました。

イメージ 1

 最近のこの手の趣味用液晶は、2行のやつが多くて1行のものを探してみたのですけど
結局無かったので、上に回転数。下にバーグラフって仕様にしました。
取りあえず、arduinoの回転数の表示が出来ましたのでプログラムは、一旦終了です。

 こっからは、arduinoのコピーを作る事になります。
製品版arduinoは、3000円くらい、自分が使っているちびでゅーの2って互換品は、1000円くらいです。
このまま、箱に入れてしまうのもいいのですけど、動きが限定された回転数表示器なので
機能限定したarduinoを作ってしまうわけですね。

 必要な機能は、本体(CPU)と液晶表示くらいですのでそれに限定して作る事にします。
arduinoは、内部の回路がオープンなのでNETで探せば、誰でもコピーを作れますので
それにならって、本体の最低回路を本家arduinoのサイトから探って持ってきました。
そこに液晶表示の配線を足せば、あっという間に回路図が完成します。


イメージ 2

 印刷したモノを撮影したので写りは、かなり悪いですけど概ねこんな具合です。
右側が液晶表示部になるのですけど動く最低部品に配線を繋いだだけって具合です。
今回は、+-逆繋ぎなんかした時のための保護回路を入れてないので
ちょっと見ただけで誰でも作れそうな具合になってます。
っていうか、大体余所様の回路も同じようなモンですのでここで見るよりも他に行った方が
絶対に良いに決まってますって先に書いておきます。

イメージ 3

 必要な部品は、こんなもんです。CPUとその他で500円も掛かってないんじゃないかと思います。
秋月ってその筋じゃ有名なパーツ屋さんのNETサイトに行くとそれこそ100本とかって単位で
抵抗やら何やら売ってますので恐らくは、都合50台くらい作れそうなパーツが在庫になってしまってます。

 その内、増産して遊ぼうかとも思っていますけど、とりあえず形にしていきます。

イメージ 4

 すでに発生器本体は、基板に乗ってますのでケースのスペースがそれほど無くて
コンパクトに作らないと駄目って具合です。
80x50くらいの基板の半分までサイズを落とさないとケースに入らないのでちょっとだけ
頭を使って組み立てました。

イメージ 5

 完成したarduino互換(コピー)機は、こんな感じに仕上がりました。
部品少ないのでそれほど時間掛かってませんし、見たら作れそうって誰でも思いそうですね。
(;´Д`) 
 実際、作れてしまいますのでかなり難易度が低いです。
自分の場合、PICとかだと真似するくらいで終わりなのでarduinoは、楽でいいなぁって思いますが
書いてる本人の探したサイトでもみなさん似たようなのを作られてますので
真似って言えば真似ですね。って事でコピー品って事になりますね。


イメージ 6

 裏側は、こんな感じです。配線の交差が多かったので今回は、ウレタン線使いました。
先回に続いて思いますけど裏側見せるのは、恥ずかしいですねぇ。
穴の開いたパンツ見られるのと同等に恥ずかしいって気がしてます。

イメージ 7

 液晶は、今回、回転数のみ見れればいいので超小型って秋月電子で売っていたヤツを使ってます。
大きいとケースに入りませんのでこの辺は、仕方がないです。
あまり余裕を考えていませんでしたし・・・

イメージ 8

配線を確認して取りあえず動きだけ確認しておきます。
当初、このケースがアルミ製で電気が通っておかしな動きをしてましたけど
絶縁をしっかりさせて再度組み立ててます。

イメージ 9

 基板が2個になってますのでケース内パンパンって状態になってしまいました。
形の良いケースを探してみましたけど、余り良いのが見つからずに結局タカチの
既製品ケースを購入してしまいました。

 今回の工作の一番高い所がこのケースです。1000円超えて二千円ちかくまで
行ってしまいますのでかなり高い部類かも知れません。

イメージ 10

 で、ケースに入れて完成です。
回転数は、常用範囲からかなり上でして余裕があっていいです。

 ちなみにプログラムが出来上がった時に家にあるKR250のタコメータ3個全て
確認して見たら、殆どクセがあって6000回転にならないと安定ししないとか
3つ有って3つともわずかな範囲でバラバラの回転数を示してましたので
正確さを考えたらぁゃιぃ気がしますけど、これは、これでいいかもしれません。
時間を見て、公正する方法を探ろうと思っています。

元々は、CDIの疑似波形を再現するの家でやりたいって思っての作成でだったのですが
結局、表示の正確性は、ともかく電気式タコメーターって事になりますので
これは、これで単体で使えそうな気がします。ジョルノは、付いてるから
ビーノ辺りで試してみようかとも思いますね。

 ちなみにこのメーターですがまだCPU本体には、余裕がありますので
センサーを加えて温度、やら水温、電圧、時間って確認出来るマルチメーター的なモノも
再現は、出来そうです。
ウチのバイクは、一律に時計付いてないので折を見て作りたいですね。

 また、今回も面倒な電気関係でしたけど、今後は、ウインカーリレーやら
自分には、鬼門のLED化とかもやってみたいです。
外に出れない期間が長いので丁度良いような気もしています。


最後に作ったプログラムですがこんな感じです。
玄人の方が見たら笑いそうですけど、取りあえず動いたのでこれからまた
煮詰めるかもしれません。動くからいいかぁって思ってますけど、正直。

後、回転数でセットポイント作ってますのでLEDを回転数に合わせて光らすとか
シフトポイントの設定とか弄ったら出来そうな気もしてますので、それもその内作りたいなぁって
思ったりも・・・たぶんもっと簡単なやり方あるんだろうけど、これで精一杯だし(;´Д`) 


 最後に多数のサイトを参考にしてプログラム内で転用しています。
参考にさせて戴いたブログ、サイトのみなさまどうもありがとうございます。


ここから--------------------------

#include <MsTimer2.h> //タイマーライブラリー読み込み
#include <LiquidCrystal.h> //LCDライブラリー読み込み

LiquidCrystal lcd(5,6,9,10,11,12); //LCDピン設定WM-C2002M
unsigned long cnt = 0; //パルス変数4バイトリセット(符号無整数)
volatile long state = 0; //変数リセット
int val = 0; //パルス入力変数リセット
int set1 = 20; //セットポイント2000rpm
int set2 = 40; //セットポイント4000rpm
int set3 = 60; //セットポイント6000rpm
int set4 = 80; //セットポイント8000rpm
int set5 = 100; //セットポイント10000rpm
int set6 = 120; //セットポイント12000rpm
int set7 = 140; //セットポイント14000rpm
int set8 = 160; //セットポイント16000rpm


void REV() {
static boolean output = HIGH;
digitalWrite(13, output); //monitor LED
output = !output;
cnt = cnt*2; // cnt*200 = rpm

//Serial.print(", ";);
//Serial.print(cnt);
//Serial.println("00 rpm";);

lcd.setCursor(0,0);

lcd.print(cnt);
lcd.println("00rpm ";);


lcd.setCursor(0,1); //
if(cnt > set1){ //digitalWrite(#, HIGI);回転数でLED点灯
lcd.write(0xff);
if(cnt > set2){
lcd.write(0xff);
if(cnt > set3){
lcd.write(0xff);
if(cnt > set4){
lcd.write(0xff);
if(cnt > set5){
lcd.write(0xff);
if(cnt > set6){
lcd.write(0xff);
if(cnt > set7){
lcd.write(0xff);
if(cnt > set8){
lcd.write(0xff);

} //else digitalWrite(#, LOW);で消灯
}
}
}
}
}
}
}
lcd.print(" ";); //表示したキャラクターを上書きクリアー
cnt = 0;
}

void setup() {
//Serial.begin(9600);
lcd.begin(2,8);
lcd.clear();
int i,t;
for(i=16;i>0;i--){
lcd.setCursor(0,0);
for(t=0;t<i;t++) lcd.print(" ";);
lcd.print("TAKUMI ";); // display 1st line
delay(300);
}

for(i=8;i>0;i--){
lcd.setCursor(1,1);
for(t=0;t<i;t++) lcd.print(" ";);
lcd.print("ARM`S ";); // display 2nd line
delay(200);
//lcd.setCursor(0,1);
//lcd.print(" ";); // erase 2nd line
delay(100);
}

{
delay(2000);
}
for(i=8;i>0;i--){
lcd.setCursor(1,1);
lcd.print("PROJECT";); // display 2nd line
delay(500);
lcd.setCursor(0,1);
lcd.print(" ";); // erase 2nd line
delay(300);

}






lcd.begin(2,20); // set lib for display size (8x2)
lcd.clear(); // clear the screen


MsTimer2::set(300, REV); // 300ms period
MsTimer2::start();
}

void loop() {
val = analogRead(1);

if (val > 600 && state == 0)
{
state = 1;
cnt++;
}
if (val < 400 && state == 1)
{
state = 0;

}

}


ここまで------------------------------
 
wiki文法入ってしまってますけど )閉じカッコです。修正して下さい。