kuroの覚え書き

96の個人的覚え書き

タコメーター(回転数ロガー)



とある筋からステッピングタコメーターを貰ったのだが、これが動作不良品。(解っててもらった)

まあステッピングモーターでお遊びが出来ればいいかってことで。

f:id:k-kuro:20091202234712j:image

せっかくなのでArduinoタコメータプログラムを作ってみた。

300msのパルスをカウントして200倍すると1minあたりのカウントになる。Vmaxは1回転1パルスなのでコレでRPMが計算できる。

あとはこの値を元にステッピングモータを制御する必要があるのと折角なのでシフトライトも組み込みたいな。


#include <MsTimer2.h>

volatile long cnt = 0;
volatile long state = 0;
int val = 0;
int set1 = 60;
int set2 = 80;
int set3 = 90;
void REV() {
static boolean output = HIGH;
digitalWrite(13, output); //monitor LED
output = !output;
cnt = cnt*2; // cnt*200 = rpm
// Serial.print(val);
Serial.print(", ");
Serial.print(cnt);
Serial.println("00 rpm");
if(cnt > set1){
digitalWrite(12, HIGH);
if(cnt > set2){
digitalWrite(11, HIGH);
if(cnt > set3){
digitalWrite(10, HIGH);
}else digitalWrite(10, LOW);
}else digitalWrite(11, LOW);
}else digitalWrite(12, LOW);
cnt = 0;
}

void setup() {
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(10, HIGH);
delay(500);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
delay(300);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
delay(300);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
delay(300);
digitalWrite(12, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, HIGH);
delay(300);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
MsTimer2::set(300, REV); // 300ms period
MsTimer2::start();
}

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

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

}