説明
指定したピンのパルスの長さ(時間)を取得する pulseIn()の代替え関数として新しく用意された関数です。
パルスとは、ピンの状態がLOWからHIGHになりまたLOWに戻るまでの信号のうごき、または、HIGHからLOWになりまたHIGHに戻るまでの信号のうごきを示します。
この関数は便利なのですが、プログラム領域を圧迫し、プログラムの動きを停止する動きになるため、使用には注意が必要です。
使用するピンはあらかじめpinMode関数でINPUTに設定しておきます。
pulseInとpulseInLongの違い・比較
pulseInは返されるパルス幅の時間(マイクロ秒)を取得するため、内部ではプログラムループで命令のクロック数から時間換算している処理でしたが、pulseInLongではmicros() を使って時間測定をしています。
プログラム内で割り込みを停止する処理 noInterrupts関数を使用している場合、正しく動作しません
構文
pulseInLong(pin, value)
pulseInLong(pin, value, timeout)
pin : int
value : HIGH (LOW->HIGH->LOW)/ LOW ( HIGH->LOW->HIGH)
timeout : unsigned long タイムアウトまでの時間(マイクロ秒)
※デフォルトは1秒です。
※タイムアウト時間を設定すると処理は速くなります。
戻り値
unsigned long
パルスの長さ(時間 :マイクロ秒)
取得できなかった場合は0
プログラム例
//距離センサー HC-SR04で距離データを取得するサンプル #define Echo A3 int Duration; float Distance; void setup() { Serial.begin(9600); while (!Serial) { ; } //Leonardoの場合にはこの部分が必要 pinMode(Trig,OUTPUT); pinMode(Echo,INPUT); } void loop() { digitalWrite(Trig,LOW); //まずLowにする delayMicroseconds(1); //1μ秒まつ digitalWrite(Trig,HIGH); //トリガー信号をあげる delayMicroseconds(11); //10μ秒だが念のため11μ秒HIGHを出す digitalWrite(Trig,LOW); //信号を落とす Duration = pulseInLong(Echo,HIGH);//パルスがHIGHの間の時間を測る if (Duration>0) { //パルスの秒から距離を計算する Distance = Duration/2; Distance = Distance*340*100/1000000; Serial.println(Distance);//シリアルに書き出してみる } delay(1000); }
クムクムロボットで使ってみる
弊社の二足歩行プログラミングロボットクムクムロボットには、超音波距離センサーが目の部分についていて、これを使って障害物までの距離を検知することができます。
その処理にこの関数を使用することができます。
<<距離センサーので障害物までの距離を測る>>
注意
pullseInはパルスを検知する間処理がすべて奪われてしまうため、他の動きができなくなります。
つまり、クムクムロボットの場合であれば、顔を回転させながらリアルタイムに目前の障害物検知を行うということが、この関数を使うとできなくなります。
こういった場合は、pulseInを使用せず、自分でパルス検知をするプログラムを作る必要が出てきます。