さて、今回もちょっとやってみている。
今回は超簡単なレシピになっている。超簡単だけれども、なぜか簡単な方が上手く行く。割込みも何も手の込んだ事はやってない。
アイデアとしては単にパルスとパルスの間の時間計測。その計測値から回転物の回転数を計算し、予めわかっている周長を掛けて周速(回転物の外周のスピード)を計算しているだけ。パルスは1回転あたり1回出ると言う想定。
センサーは以前、1年前から考えていた赤外線式ライントレースセンサー。子供がロボットに使うもので赤外線を出す発光部とそれを受ける受光部のペアになっているもの。
//Time checking
unsigned long time_m = 0; //時間計測するための変数1
unsigned long time_n = 0; //時間計測するための変数2
unsigned long time_length = 0; //上記2つの差の時間
//Signal checking
int sig01 = 4; //センサーからの入力(デジタル)
//Speed calculation
const float circm = 0.7536; //外周長:Φ0.24mxπ
int rpm = 0; //回転数
int sp = 0; //スピード(周速)
void setup() {
pinMode(sig01, INPUT);
Serial.begin(9600); //後でLCDに変更したいと思っている
}
void loop() {
//Sensor pulse checking nは前回ONになった時の時刻
time_n = time_m;
if (digitalRead(sig01) == HIGH) { //入力がONになったら時刻計測
time_m = micros(); //Time signal turn ON mに入れる
delayMicroseconds(20); //Chattering proof チャタリング防止(効くかわからない)
time_length = time_m - time_n;
//Speed calculation
rpm = 60E6 / time_length; //回転数=60秒÷パルス間隔時間
sp = rpm * circm; //回転数からスピードを計算
//Serial output for debug
Serial.print("n= ");
Serial.println(time_n);
Serial.print("m= ");
Serial.println(time_m);
Serial.print("Cycle time = ");
Serial.print(time_length);
Serial.println("ms ");
Serial.print(" RPM = ");
Serial.println(rpm);
Serial.print(" SPEED = ");
Serial.print(sp);
Serial.println(" m/min");
while (digitalRead(sig01) == HIGH) {} //Do nothing while stay ON
}
}
※1 チャタリング防止のところはセンサーの種類によるし、やってみないとわからないので適当に調整する事が必要。
※2 回転数を計算するときに小数点以下を切り捨てるために整数型の変数rpmに入れている。
四捨五入するほどの事もないし、計算が速くなった方がメリットがあるから。
※3 上記と同じ意味で変数sp、スピードも整数型にしている。
※4 最後の"while (digitalRead(sig01)...{}"は、信号がONであり続ける間は何もしないと言う意味。ONである間にloop(){...の中を回してしまうと同じONで何回もカウントしてしまうのでOFFになってから回すようにしている。
シリアルへの出力の結果は下記。
time_n= 945672
time_m= 1112620
n= 945672
m= 1112620
Cycle time = 166948ms
RPM = 359
SPEED = 270 m/min
time_n= 1112620
time_m= 1610788
n= 1112620
m= 1610788
Cycle time = 498168ms
RPM = 120
SPEED = 90 m/min
time_n= 1610788
time_m= 1787184
n= 1610788
m= 1787184
Cycle time = 176396ms
RPM = 340
SPEED = 256 m/min
計算は合っているみたいだ。
一番最初はtime_nがゼロだからいい加減になってしまうけれど、まあ最初だけなので良い事にする。計測値はどんどん更新されてしまうわけだし。
また、このスケッチの特徴はパルスが入って来ないと計測値が更新されないと言う事。つまり回転物が止まると出力が無くなる。これもまあ良しとしよう。止まっている時に計測値は必要ないので。
気になるのは、micros()が無限に時間計測しないと言う事。いつかはリセットしてゼロになると思うのでもしかするとtime_lengthの計算がマイナスになってしまう。でもそこにはプラスの値しか入らないので計算値が変になるだろう。が、それもたまになので良いことにしよう。
mがnより大きかったら計算するみたいにしても良いかと思うけれども、たまに来るそれのために毎回チェックしなくてもたまに変な値が出る方がマシかもしれない。どうせ自分で使うわけだし。
さて、今後残る問題は、これをどう表示するかと言う事。
LCDに数字で書くのが簡単なのだけれど、グラフにして表示した方が実用的にはズレがわかって良いようにも思う。が、それをすると(1)グラフィック表示のできる液晶を使うか(2)PCを1台占有してシリアルで信号を送り続ける、あたりを考えないといけない。
どちらもちょっと面倒臭い。コストの問題もある。
グラフを諦めてLED数個でやると言うのもある。なぜならスピード計測が必要な回転物がいくつかあるので、時間で変化するのでなくてそれらの相対的な変化を見ると言うのも目的にかなっているから。
なのでできれば1個のArduinoで数か所同時に計測できれば良いのだけれど、そうするともうちょっと凝ったスケッチにしないといけないだろうし、複数LEDの出力をどうするか考えないといけなくなる。ピンが足りなくなる可能性もある。
となると1個で1計測で並べるのが一番良いかもしれない。パーツ代が安い(センサーはRM5、LCDがRM10、ArduinoUno互換がRM15 合計760円)のでそれもできる。ちょっと考えよう。
最新の画像もっと見る
最近の「ABCのAはArduinoのA」カテゴリーもっと見る
最近の記事
カテゴリー
- 日本でニャー2024(245)
- 猫の治療(34)
- 猫の引越(17)
- 癌になる(23)
- 日本でニャー2023(333)
- 日本でニャー2022(98)
- マレーシアでニャー2022(244)
- マレーシアでニャー2021(355)
- マレーシアでニャー2020(277)
- マレーシアでニャー2019(280)
- マレーシアでニャー2018(238)
- マレーシアでニャー2017(241)
- マレーシアでニャー(321)
- 長いようで短い5年目マレーシア(5)
- どうにか4年目マレーシア(157)
- 3年目に突入マレーシア(358)
- 2年目のマレーシア(428)
- まさか、マレーシア!(409)
- 英語やるぞ!(140)
- いい歳して大学へ(13)
- 台湾-非観光的(78)
- 備忘録バリとインドネシア(24)
- Vespa? Yes, but LML !(218)
- カンガルーじゃないKangoo(108)
- Photo Photo(117)
- 日本脱出(140)
- 美食満腹(104)
- 映画って !(292)
- いろいろ雑記帖(394)
- これってスゴイ!(92)
- Puppy で Go!(20)
- ABCのAはArduinoのA(68)
バックナンバー
人気記事