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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

4354閲覧

Raspberry Piで超音波センサーを使う際のwhileの使い方

onoderarei

総合スコア7

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/25 02:02

プログラミング初心者なのですが、最近Raspberry Piで電子工作を始めました。超音波センサーを使い、プログラムはウェブ上の情報を参考にしてpythonで書き、距離を測れるようになりました。

しかし、プログラムの中によく理解できない部分があります。whileで変数に現在の時間を入れると、最後の繰り返しの時間が入ってしまい、反射した超音波を受け取る直前の時間になってしまいそうな気がするのです。

距離は測れているので、私の認識の間違いがあると思うのですが、教えて頂けると助かります。

###該当のソースコード

python

1GPIO.output(TRIG, True) 2time.sleep(0.00001) 3GPIO.output(TRIG, False) 4 5while GPIO.input(ECHO) == 0: 6 sigoff = time.time() 7while GPIO.input(ECHO) == 1: 8 sigon = time.time() 9 10timepass = sigon - sigoff 11distance = timepass * 17000 12print(distance)

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

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

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

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

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

guest

回答3

0

ベストアンサー

正確な性能は機器によって違いますが、プログラムは意外と(という言い方が適当かどうかあれですが・・・)高速で動いています。プログラムの実行を司っているのはプロセッサーであるのはご存知と思いますが、プロセッサーはクロックによって刻まれる単位で動作します。よく目にする汎用計算機だとGHz(1E9回/秒)オーダーのクロックが普通ですね。つまり基本的な動作は1E-9秒のオーダーで実行されています。さて、音波のスピードは空気中で330メートル/秒ぐらいのオーダーなので1メートル進むのに必要な時間は0.003秒ほどですが、先に述べた計算機が動くスピードに比べるとずっと遅いです。と言う訳で

反射した超音波を受け取る直前の時間になってしまいそうな気がするのです。

これは問題ではないのです。問題なのは信号が0->1に変化してから1->0に変化するまでの時間間隔の方です。受け取る直前の時間であろうが直後の時間であろうが誤差レベルと考えてよいでしょう。

投稿2017/10/25 02:28

KSwordOfHaste

総合スコア18394

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

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

onoderarei

2017/10/25 19:58

回答ありがとうございます。処理速度の具体的なご説明など理解しやすかったです。
guest

0

sigoffに現在時刻が記録されるのが終わるのは、GPIO.input(ECHO) == 0という条件が成り立たなくなった時ですから、GPIO.input(ECHO) == 1になる(超音波が届く)直前の時刻がsigoffに残ります。
同様に、sigonに現在時刻が記録されるのが終わるのは、GPIO.input(ECHO) == 1という条件が成り立たなくなった時ですから、GPIO.input(ECHO) == 0になる(超音波信号が途絶える)直前の時刻がsigonに残ります。

"超音波が届いた瞬間"と"超音波が途絶えた瞬間"の時間差は、"超音波が届く直前"と"超音波が途絶える直前"の時間差は、ほぼ同じと考えて良いのではないでしょうか。

昨日の正午になった瞬間と今日の正午になった瞬間の時間差は、24時間。
昨日の正午になる直前と今日の正午になる直前の時間差も、やはり24時間になりますよね?

投稿2017/10/25 03:07

coco_bauer

総合スコア6915

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

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

0

python

1while GPIO.input(ECHO) == 0: 2 sigoff = time.time()

というのは最終的に0->1になる直前の時刻を代入することになります。
sigonは1->0です。
なので、タイミングはこうなります。

Echo ______***********______ ^ ^ sigoff sigon

また、超音波センサの仕様を推測するに、
超音波を発したらEchoがHになって、戻ってきたらLになるセンサかと思います。
(HC-SR04とかそのあたり)

すると、sigon-sigoffで超音波が発せられてから戻ってくるまでの時間になります。

投稿2017/10/25 02:56

編集2017/10/25 03:20
ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問