CDIのパルス(CDI→タコメーターの波形)から回転数を検出するために、サンプルとして回路とスケッチを作ってみました。  
1 arduinoで可変抵抗から読み取った電圧を読み取り、その値を周波数とするデューティー比50%のパルスをtone関数で出力
2 このパルスをトランジスタとバッテリーを使って12Vにする。
3 フォトカプラを使ってarduinoに入力
4 回転数を計算しシリアル通信でPCに出力

回転数はパルスの1周期と10周期の時間で計算しています。これは実機で試してみてバラつきが少なければ1周期でいいかもしれません。


回路図はそのうち載せます....

イメージ 1


フォトカプラ TLP621-2
トランジスター 2SC1815

シリアルモニタの結果です。
input:実際の回転数 output:1周期での計算 mean:10周期での計算

 

イメージ 2

 


2000rpm以下の回転数だと正しい値が出ないようなので実機でテストするまでに直しておきます。
→tone関数だと31Hz(1860rpm)以下の周波数が生成できないことが原因でした。

以下プログラム

void setup(){
  Serial.begin(9600);
  pinMode(13,INPUT_PULLUP);
  pinMode(8,INPUT);
}

void loop(){
 unsigned long nowtime,beforetime1,beforetime2,beforetime3,
 beforetime4,beforetime5,beforetime6,beforetime7,beforetime8,
 beforetime9,lasttime,
 rpm1,rpm2,rpm3,rpm4,rpm5,rpm6,rpm7,rpm8,rpm9,rpm10,rpm11;
 int val,val2;
 int n=0;
 
 val2=analogRead(0);
 tone(8,val2);
 val2=val2*60;
 
 while(n==0) {
    val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1; 
    }
 }

 do{
    val=digitalRead(13);
 }while(val==1);
 
 nowtime=micros();  //パルスON
//1
n=0;
while(n==0) {
    val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime1=micros();  //パルスON
//2
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime2=micros();  //パルスON
//3
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime3=micros();  //パルスON
//4
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime4=micros();  //パルスON
//5
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime5=micros();  //パルスON
//6
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime6=micros();  //パルスON
//7
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime7=micros();  //パルスON
//8
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime8=micros();  //パルスON
//9
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 beforetime9=micros();  //パルスON
//10
n=0;
while(n==0) {
   val=digitalRead(13);
    if(val==1){    //OFFまで待つ
      n=1;
    }
 }
 
 do{
   val=digitalRead(13);
 }while(val==1);
 lasttime=micros();  //パルスON
 

 
 rpm1=60000000/(beforetime1-nowtime);
 rpm2=60000000/(beforetime2-beforetime1);
 rpm3=60000000/(beforetime3-beforetime2);
 rpm4=60000000/(beforetime4-beforetime3);
 rpm5=60000000/(beforetime5-beforetime4);
 rpm6=60000000/(beforetime6-beforetime5);
 rpm7=60000000/(beforetime7-beforetime6);
 rpm8=60000000/(beforetime8-beforetime7);
 rpm9=60000000/(beforetime9-beforetime8);
 rpm10=60000000/(lasttime-beforetime9);
 rpm11=60000000/((lasttime-nowtime)/10);
 
/*
 Serial.println(beforetime1-nowtime);
 Serial.println(beforetime2-beforetime1);
 Serial.println(beforetime3-beforetime2);
 Serial.println(beforetime4-beforetime3);
 Serial.println(beforetime5-beforetime4);
 Serial.println(beforetime6-beforetime5);
 Serial.println(beforetime7-beforetime6);
 Serial.println(beforetime8-beforetime7);
 Serial.println(beforetime9-beforetime8);
 Serial.println((lasttime-nowtime)/10);
*/
 Serial.print("input ");Serial.print(val2); Serial.print("rpm"); Serial.print("\n");
 Serial.print("output ");
 Serial.print(rpm1); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm2); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm3); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm4); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm5); Serial.print("rpm");Serial.print("\t");
 Serial.print(rpm6); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm7); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm8); Serial.print("rpm");Serial.print("\t");
 Serial.print(rpm9); Serial.print("rpm"); Serial.print("\t");
 Serial.print(rpm10); Serial.print("rpm"); Serial.print("\n");
 Serial.print("mean ");Serial.print(rpm11); Serial.print("rpm");Serial.print("\n");Serial.print("\n");
 Serial.flush();
 
delay(5000);
 
}

 

 

追記

充電器に関して記事を書きました。

SCサイズ電池の充電

またこちらでも触れていますが、タブ付きのSC電池やニッケル水素電池を使用したほうがより安全で高性能なバッテリーを作れると思います。2000mAhだと容量が少ないです。

 

 

オシロスコープのバッテリーがだめになっていたので作りました。

イメージ 1

分解すると単2充電池4個と電極が入っています。実際に市販の単2充電池で作っている方がいるので真似します。
単2充電池は安いもので1個800円と高価なので少し工夫しました。

単3充電池とダイソーのスペーサー

イメージ 2

 

イメージ 3

蓋が閉まりません。どうやら規格によると単3の方が単2より長いようで、このような使い方だと入らないようです。また容量も足りないようで電源が入りません。(純正は2800mAh)
いろいろと調べたところ、長さや形状は製品によっても違うようです。最近の高性能な充電池だと容量を稼ぐため全長が長く、+電極が低い傾向があるとか。電池BOXによっては使用できないという声も。
また単2並に短いものもありましたが、これはどれも容量の少ない中国製のものばかりでした。これも形状のせいで使えないというレビューがあります。(なんのための規格なんだか...)
最近の高性能な単3充電池で長さの短いものがあったら教えてください。


結局使ったのはSCサイズ電池です。

 

 

イメージ 4


単2より少し小さい規格のようです。純正と同じNiCdで、この容量なら使えると思います。ついでに注文するパーツもあったので、一番安い秋月で注文します。

 

 

SCサイズ ニッケルカドミウム電池(NiCd) KR2000SC


直径はそれほど差がないので薄いシートを巻き、電極を付けてテープを巻きます。

 

イメージ 5

 

イメージ 7

 


スペーサーはコルクで作りました。これは後で作り直しましょう。

 

 

 

イメージ 6

 

無事起動できました。

SCサイズの充電器を持っていないのですが、オシロで充電すると20時間かかると説明書に書いてありました。(説明書を確認したら9時間でした。20という数字をどこで見間違えたのだろう.....2020年4月追記)

またNiCdなので使い切ってから充電する必要があります。素直に充電器を買った方がよさそう。
確実にメーカー保証対象外の行為ですし、最悪事故の原因になるので十分に気を付けて自己責任で作ってください。

ガンマのタコメーターはCDI駆動です。
CDIからタコメーターへ1回転1パルスの波形が行っていると思いますが、これが何かに使えるのではと思い、オシロで観測してみました。

配線はCDIの13極カプラの黒青線です。
 

イメージ 1


電圧12Vで一回転1パルスでした。画像は1800rpmでしょうか。
ちなみにタコメーター内部には入力されたパルスを電流に変換するICが入っているようです。

今のところこれで回転数を検出し、エアソレノイドと排気デバイスコントローラが作れないかと考えてます。
電子制御CDI自体も先駆者の方のサイトで勉強していて、すでにパーツも買ったのですが、まずは点火以外の部分を制御しようかと思います。(純正CDIがだんだんと入手困難になっているので、自作できれば安心かな程度の気持ち)