磁気センサー割り込みサンプル-arduino
arduinoのloop()で通常の処理をしながら急ぎの仕事をこなす特別なコマンドattachInterrupt(割り込み処理)についての備忘録です。
外部割り込み
モーターの回転を計測する必要があってどうしたらいいものか調べていたらattachInterruptという関数が用意されていました。
外部割り込みが発生したときに実行する関数を指定します。すでに指定されていた関数は置き換えられます。呼び出せる関数は引数と戻り値が不要なものだけです。ピンの割り当てはボードによって異なります。
構文
attachInterrupt(interrupt, function, mode)
【パラメータ】
interrupt: 割り込み番号
function: 割り込み発生時に呼び出す関数
mode: 割り込みを発生させるトリガ
割り込みに使えるピンです。代表的なarduino UNOとarduino megaの割り込み番号とピンです。
interrupt | 0, | 1, | 2, | 3, | 4, | 5, |
---|---|---|---|---|---|---|
arduino UNO | 2, | 3, | ||||
Mega2560 | 2, | 3, | 21, | 20, | 19, | 18, |
モード(mode)の指定は次の通リです。
LOW ピンがLOWのとき発生
CHANGE ピンの状態が変化したときに発生
RISING ピンの状態がLOWからHIGHに変わったときに発生
FALLING ピンの状態がHIGHからLOWに変わったときに発生
磁気センサー(ホールセンサー)
回転数の計測にはフォトリフレクタによる計測と磁気センサーによる計測が一般的なようです。
フォトリフレクタは赤外線を回転物に照射し反射した赤外線を感知、計測するもので手軽に使える利点があります。
アマゾン等で販売されている計測器はこの方式が多いようです。
一方、磁気センサーによる計測は回転物に磁石をセットしておく必要がありますがきわめて正確な計測が出来ます。
ここでは磁気センサー(ホールセンサー)を使って計測してみます。
サンプルスケッチ
割り込みのサンプルスケッチです。ダウンロードをクリックすればarduino IDEで記述したコードをダウンロード出来ます。
[wpdm_package id=’317′]
[php]int SUM = 0;
int rotation_Count = 0;
int hallsensor_Pin = 19; //Interrupt 4
void setup()
{
pinMode(hallsensor_Pin, INPUT_PULLUP) ;
attachInterrupt(4, CNT, RISING) ;
Serial.begin(19200) ;
}
void loop(){
if (SUM != rotation_Count) {
Serial.print(rotation_Count) ;
Serial.println(" 回転") ;
SUM = rotation_Count ;
}
delay(1000) ; //実際の運用を想定
}
void CNT(){
++ rotation_Count ;
}[/php]
hallsensor_Pin を19番としていますが多分使うことがないからです。 (^^;
割り込みで指定する番号は「4」になります。
配線
磁気センサーは文字が書いてある方を上にして、左からVCC,GND,出力の順になります。
とても簡単な配線ですね。
磁気センサーに磁石を近づけて離すと….
変化のない時には極性が反対ですので裏返ししてやってみてください。
delayで1秒間遅延させていますので表示がオカシイ部分もありますがちゃんとカウントされています。
実際の運用に近いように遅延させただけですので勿論必要はありません。