説明
指定したピンのパルスの長さ(時間)を取得します。
パルスとは、ピンの状態がLOWからHIGHになりまたLOWに戻るまでの信号のうごき、または、HIGHからLOWになりまたHIGHに戻るまでの信号の動きを示します。
使用するピンはあらかじめpinMode関数でINPUTに設定しておきます。
構文
| 書き方 | pulseIn(ピン番号,信号タイプ) pulseIn(ピン番号,信号タイプ,タイムアウト時間) |
| 戻り値 | unsigned long パルスの長さ(時間 :マイクロ秒) 取得できなかった場合は0 |
| 引数 | ピン番号… int 信号タイプ… HIGH (LOW->HIGH->LOW)/ LOW ( HIGH->LOW->HIGH) タイムアウト時間…unsigned long タイムアウトまでの時間(マイクロ秒) ※デフォルトは1秒です。 ※タイムアウト時間を設定すると処理は速くなります。 |
プログラム例
//距離センサー 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 = pulseIn(Echo,HIGH);//パルスがHIGHの間の時間を測る
if (Duration>0) {
//パルスの秒から距離を計算する
Distance = Duration/2;
Distance = Distance*340*100/1000000;
Serial.println(Distance);//シリアルに書き出してみる
}
delay(1000);
}
注意点
pulseInの動きは、プログラム内部ではプログラムステップ数を数えてその値を返しています。
そのため、実際のパルス幅と約1%程度の誤差がでる、特にパルス幅が100μ以下の場合はその誤差が大きくなるようです。
また、pluseIn関数実行時はその間制御が止まり次のシーケンスが実行されないため、リアルタイム処理には向かないようです。
pulseInの報告記事
タイムアウトの不正確についての質問記事
pulseInセロしか出力されない質問記事
Arduinoのpulsein関数で使用出来るピンについて
クムクムロボットで使ってみる
弊社の二足歩行プログラミングロボットクムクムロボットには、超音波距離センサーが目の部分についていて、これを使って障害物までの距離を検知することができます。
その処理にこの関数を使用することができます。
<<距離センサーので障害物までの距離を測る>>
このサンプルプログラムではTrigパルスを発生させるためにdelayMicroseconds(1)を使っている間処理が止まりますので、例えば、クムクムロボットの場合であれば、顔を回転させながらリアルタイムに目前の障害物検知を行うとすると顔の回転がカクカクなってしまいます。
