質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

5回答

4451閲覧

ArduinoのpulseInでゼロしか出力されない

klose0609

総合スコア11

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/06/04 23:36

現在、単素子(送信/受信兼用)の超音波トランスデューサーを使用した距離計を自作しております。
超音波を発生させてから、壁に反射して戻ってくるまでの時間HIGHとなるパルスを出力し、その幅をArduinoのpulseInで測定したいのですが、パルス幅を変えてもゼロしか出力されずに困っております。

回路にはSR-フリップフロップを使用しております。Sピンに超音波を発生させるためのトリガーとなる信号を入力しています。Rピンには壁に反射した信号をデジタル信号に変換して入力しております。そして、Qピンからは、Sピンに信号が入力されたときにHIGHとなり、Rピンに信号が入力されたときにLOWとなるパルスが出力されます。このパルスの幅をpulseInを使って測定し、最終的に距離に変換するという流れを考えております。
これらの流れをオシロスコープで観察した時の波形を添付いたします。

イメージ説明

オシロスコープの波形を見る限り、フリップフロップは想定通りに動いておりますので、プログラム側に問題があると考えております。使用しているコードは下記の通りです。

Arduino

1#define echoPin 8 // Echo Pin 2#define trigPin 13 // Trigger Pin 3 4unsigned long Duration = 0; //受信した間隔 5 6void setup() { 7 Serial.begin( 9600 ); 8 pinMode( echoPin, INPUT ); 9 pinMode( trigPin, OUTPUT ); 10} 11 12void loop() { 13 digitalWrite( trigPin, HIGH ); //超音波を出力 14 delayMicroseconds( 3 ); // 15 digitalWrite( trigPin, LOW ); 16 17 Duration = pulseIn( echoPin, HIGH ); //センサからの入力 18 19 Serial.print("Duration time:"); 20 Serial.print(Duration); 21 Serial.println(" usec"); 22 23 delay(500); 24}

このコードでArduino動かして、シリアルモニターで出力を確認しております。オシロスコープの波形を見る限り、50から100μsecの値が出力されるはずなのですが、ゼロしか出力されません。どなたかゼロしか出力されない原因についてご教授いただきたく存じます。なお、使用しているはArduino MEGA2560で、IDEのバージョンは1.8.13になります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/06/05 01:18

とりあえず[シリアルポート]は関係ない気がします。
guest

回答5

0

Trigパルスが入った途端にEchoが立ち上がっているとかいうことはないですか?

波形の時間関係がわかりませんが、おなじみHC-SR04ではこんな感じです。
HC-SR04 Trig/Echo
確認はしていませんが、測定という点から考えると、pulseIn()に入った「後」にEchoがHに上がらないといけない、ということはとてもありそうに思いますが、あなたの回路ではそうなっていますでしょうか?
外部から入ったTrigにディレイをかけてから超音波を発生してみたらどうなるでしょう。

投稿2021/06/05 01:03

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

klose0609

2021/06/15 17:50

回答ありがとうございました。 いくつかの可能性を検証してみました。 まず、HC-SR04を実験に使用したArduinoで試してみました。問題なくpulseInでパルス幅を計測できたので、Arduino自体に問題はないようです。 また、ピンの接続も繰り返し確認して問題ないことを確認しました。 トランスミッターへの信号送信時間3μ秒が短すぎるというご指摘もございましたので、このパルス幅もいくつか変更してみましたが効果はありませんでした。 以上のことから、ご指摘いただいた通り、パルスがHIGHになるタイミングと、pulseInの計測が始まるタイミングの問題の可能性が高いと考えております。ですので、アドバイスいただいた通り、トリガー信号を遅延させて、pulseInの開始と、パルスがHIGHになるタイミングに時間差を作って試してみようと思います。
guest

0

出力パルス(Q)まで出力しているのに、pulseInが反応しない(0でタイムアウト)のだから、普通に考えれば、ピン位置(8)を間違えているとか、ワイヤーが断線しているとか、或いはGNDと繋げていないとか、
そういった単純な回路的な問題だと思いますけど。

投稿2021/06/05 04:16

nac_tnk

総合スコア494

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PulseIn(HIGH)は、当該PINがLOW->HIGHになった時点から、LOWに落ちるまでの時間を計ります。
なので、PulseInが呼ばれたときにすでに当該PINがHIGHだと、タイムアウトで0を返しているのでは?
自分でdigitalReadとかでループして、micros使って時間計測してみては?

投稿2021/06/05 03:42

matukeso

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

同一のハードウェアをもっていないので検証できないのですが、おそらく、下記の 3 μsec が、かなり短時間のため、ハードウェアで保障する時間になっていないと思います。

結果、トリガーパルスになっていないのではないかと。
一旦、ディレイ時間を延ばしてみて、要因を切り分けてみみてはいかがでしょうか?

digitalWrite( trigPin, HIGH ); //超音波を出力 delayMicroseconds( 3 ); // digitalWrite( trigPin, LOW );

Arduino 日本語リファレンス delayMicroseconds(us)

【補足】

この関数は3マイクロ秒以上のレンジではとても正確に動作します。それより短い時間での正確さは保証されません。

過去に フォーラムでも、delay の動きについて話題があったようですね。
Arduino フォーラム delayMicroseconds(0) = 16383µs

計測の元になる周期をクォーツではなく、CPUの動作時間 "CPU Ticks"で代替しているために起きる現象のようですね。

投稿2021/06/05 01:28

Yoshi88

総合スコア623

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/06/05 01:36

3マイクロ秒「以上」というのは3を含む気がする... とりあえず私の回答の波形は純正Mega2560で質問のプログラムそのままで見ています。
Yoshi88

2021/06/05 01:37

私も 3 というのが ちょうど境目になっていたので、もしや。。と思っています
klose0609

2021/06/18 04:44

delay 時間は直接関係ありませんでしたが、この部分のコードを変えることで解決できました。 これまで、上記している通り、超音波を発射するためのトリガーパルスを"digitalWrite"で作成しておりました。これを"analogWrite"に変更したところ、"pulseIn"でパルス幅を計測することができました。 理由についてはこれから調べてみますが、"digitalWrite"でつくるパルスと"analogWrite"で作るパルスは、何かが違うのかもしれません。
Yoshi88

2021/06/18 09:42

解決してよかったですね(^^) digitalWrite の実行速度について、興味深い比較をしているサイトがありました。 Arduino IDE: digitalWrite()は遅い https://qiita.com/cvp-swat/items/d3c6f4de42f4cf411998 関数を、ビット操作に変えることで、1ステップの処理を高速化していましたよ。
thkana

2021/06/18 10:44

DACを積んでいない機種のanalogWriteはPWMを発生します。GPIOを直接いじるのでなくタイマーの制御レジスタをいじっている関係で遅れてパルスが出たりするんじゃないでしょうか。 狙って出せているのでない限り、それを「解決」と考えないほうがいいと思います。もちろん、狙ってタイマーを制御して遅延したパルスを出すならそれは一つの解決ですが。
thkana

2021/06/18 12:13

波形みてみたけど、 > タイマーの制御レジスタをいじっている関係で遅れてパルスが出たりするんじゃ こういう現象はなかった...さて、なんででしょう? ついでにdelayMicrosecondの引数を0とか1とかにしてみたけど特に破綻はみられませんでした。 というか、オシロあるんだったら見てみればいいよね。
guest

0

まずは、べつのArduinoを持ってきて、そのパルス幅の(100μ程度?)パルスを発生させ、想定通りの計測出力がされるかを確認しましょう。
それがなされない場合は、回路かコードが間違っています。

それで正常に計測できて、なおかつ実際の計測では0しか出ない、という場合は、
入力パルスの立ち上がり、あるいは立ち下がりのエッジ波形を時間レンジをずーーっと伸ばして見てみてください。
あるあるなのが、エッジでバタついた波形になり、そこでカウントされてしまう、ってのがあります

投稿2021/06/05 00:31

y_waiwai

総合スコア88049

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問