CDIのパルス(CDI→タコメーターの波形)から回転数を検出するために、サンプルとして回路とスケッチを作ってみました。
1 arduinoで可変抵抗から読み取った電圧を読み取り、その値を周波数とするデューティー比50%のパルスをtone関数で出力
2 このパルスをトランジスタとバッテリーを使って12Vにする。
3 フォトカプラを使ってarduinoに入力
4 回転数を計算しシリアル通信でPCに出力
回転数はパルスの1周期と10周期の時間で計算しています。これは実機で試してみてバラつきが少なければ1周期でいいかもしれません。
回路図はそのうち載せます....

フォトカプラ TLP621-2
トランジスター 2SC1815
シリアルモニタの結果です。
input:実際の回転数 output:1周期での計算 mean:10周期での計算

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);
}