PulseInの機能は何ですか?


9

サイトで見つけた超音波センサーのコードがあります。これがコードです:

#define trigPin 12
#define echoPin 13

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  delay(500);
}

しかし、私はpulseIn()機能の働きを理解していません。つまり、タイムカウントがいつ始まり、いつ終わるのかを知りたいのです。たとえば、このコードでは、時間digitalWrite(trigPin, HIGH);pulseIn()関数で開始されますか、それとも関数で開始されますか?

それが2番目の場合、停止すると、pingを送信してからすでに1000マイクロ秒遅れている場合、障害物の距離はどのようにしてわかりますか?


トリガーピンの100usの遅延は私には少し長いようです。センサーのブランドによって異なりますが、一般的な値(私はHC-SR04で使用しています)は約10usです。
jfpoilpret 2014年

アセンブリlanguajeでこのコードを実行するにはどうすればよいですか?助けてください。


1
How can i do this code in assembly languaje-それはこの質問とどう関係していますか?
Nick Gammon

回答:


8

ドキュメントから:

ピンのパルス(HIGHまたはLOW)を読み取ります。たとえば、値がHIGHの場合pulseIn()、ピンがHIGHになるのを待ってタイミングを開始し、次にピンがLOWになるのを待ってタイミングを停止します。パルスの長さをマイクロ秒で返します。パルシン

したがって、この場合、はHIGHになるpulseIn(echoPin, HIGH)までのマイクロ秒数のカウントを開始し、それechoPinをに格納しdurationます。

それはその行で開始および終了します。それはブロッキング関数として知られているものです。それechoPinは高くなるまで実際にそこに座って、(タイムアウトを指定しない限り)かかった時間を教えてくれます。

また、pulseIn通話の前後に遅延があったとしても、通話に影響はありません。

この時間から距離を得る方法は、次の方程式によるものです。

distance = (duration/2) / 29.1;

往復するため、2で割ります。片道の2倍の時間になります。29.1は音速です(343.5 m / s => 1 / 0.03435 = 29.1)。したがって、結果はCMではなくインチであることに注意してください。おそらく、センサーのデータシートを見てそれを把握するか、または継続時間と距離を関連付けた多数のサンプルを取得して(手動で距離を測定します)、非常によく似た方程式を得ることができます。


1
私はスキートされました!実際、29.1は音速です。また、簡単な追加です。IIRCで読み取るパルスがある理由は、超音波モジュールが音がモジュールに戻るまでHIGH信号を生成するためです。
匿名のペンギン2014年

1
4番目の段落は理解できませんでした。空気中で音のパルスを送信して2秒間待つと、長い距離を移動するからです。だからカウントを始めると2秒遅れます。それでは、pulseInの前に遅延を指定しても問題がないのはなぜですか?@ザクリーン。そしてAnnonomus Penguinとsachleeに感謝
shajib0o

@ shajib0o "pulseIn()はピンがHIGHになるのを待って、タイミングを開始し、次にピンがLOWになるのを待ってタイミングを停止します。"
ザクセン

3
@ shajib0o私が知る限り、超音波センサーは信号が送信されるとピンをHIGHにし、信号が戻るとLOWにするということです。
匿名のペンギン

1
実際、これは間違っています。pulseIn(echoPin, HIGH)ECHOピンがLOWになるまでの時間を測定します。
ドミトリーグリゴリエフ2018

2

実際、開始後1000マイクロ秒でパルス長の測定を開始すると問題になります。ただし、これはHC-SR04センサーの動作方法ではありません。

ここに画像の説明を入力してください

  • センサーはTRIG の立ち下がりエッジでトリガーされますdigitalWrite(trigPin, LOW);

  • ECHOパルスはトリガー後約0.3 msで開始します

これが、1 msの遅延が測定結果に影響を与えない理由です。pulseIn(echoPin, HIGH)ECHOピンがHIGHになるのを実際に待ってから、再びLOWになるまでパルス長の測定を開始します。そのため、TRIGパルスの持続時間を10マイクロ秒(HC-SR04の最小TRIG持続時間)に短縮して、測定を高速化できます。


0

トリガーピンをHIGHに設定して、トリガー開始からエコー信号までの時間を測定しないことを理解することが重要です。

センサーHC-SR04は、トリガー入力でHIGHを受信して​​測定を開始し、少し後に、エコーピンのHIGHレベルの長さとしてコード化された時間を送信します。

pulseIn()トリガー後2 ms、つまり2000μs を使用すると、問題なく動作するはずです。


1
これが受け入れられた回答にどの程度追加されるか、またはそれと異なるかはわかりません。
Greenonline 2016年

0

超音波モジュールには特定の動作方法があるため、混乱しないでください。まず、トリガーピンにパルスを設定します。終了すると、モジュールは40 kHzパルスの8バーストを送信します(これは実際には距離を測定するために使用されるものであり、トリガーピン内のパルスではありません)。最初のバーストが送信された瞬間に、エコーピンは自身をHIGHに設定します。これが発生している場合、プログラムはpulseInの行にあり、echopinがHIGHにあるため、タイミングを開始します(pulseIN(echopin、HIGH)はechopinがHIGHになるのを待って開始タイミングを待つため)。40 kHzの最初のパルスがオブジェクトで跳ね返り、レシーバーに戻ると、エコーピンはLOWに設定されます。次に、pulseIn関数は時間を停止してそれを返します。その後、プログラムは実行を続けます。このモジュールは、pulseInの動作方法を学ぶために少しトリッキーです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.