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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

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

Python

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

Q&A

解決済

3回答

3779閲覧

Raspberry Piで測距センサー(HC-SR04)で距離を計測すると測定結果(距離)が安定しない

skmt33

総合スコア11

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2020/09/27 07:39

前提・実現したいこと

Raspberry Piで測距センサー(HC-SR04)で距離を計測するプログラムを書いています。
距離をコンソールに表示させるとともに、距離に応じて3つのLEDがそれぞれ点灯するようにしたいです。
具体的には、障害物との距離が50cm未満の時はLED1が点灯し、50cm以上100cm未満の時LED2が点灯し、100cm以上の時はLED3が点灯するようにしたいです。

発生している問題・エラーメッセージ

60cmくらいの距離に障害物を置いて、Raspberry Piを起動すると、しばらく(30秒程)は60cmだったり150cmだったりと表示され、それにともないLED2が点灯したりLED3が点灯したりと安定しません。(LED1が点灯することはほとんどありません)
30秒をすぎる頃から安定してLED2のみが点灯するようになります。

想定でも結構ですので原因や対処法を教えていただけませんか?
当方距離センサーに関してはあまり詳しくありません。
今作成中のプログラムは以下です。こちらのサイトを参考にしました。

温度センサーがないので(使用しないので)下記のget_distance関数のtempはデフォルトの15で計算されています。

該当のソースコード

import RPi.GPIO as GPIO import time def pulse_in(pin, value=GPIO.HIGH, timeout=1.0): start_time = time.time() not_value = (not value) # 前のパルスが終了するのを待つ while GPIO.input(pin) == value: if time.time() - start_time > timeout: return 0 # パルスが始まるのを待つ while GPIO.input(pin) == not_value: if time.time() - start_time > timeout: return 0 # パルス開始時刻を記録 start = time.time() # パルスが終了するのを待つ while GPIO.input(pin) == value: if time.time() - start_time > timeout: return 0 # パルス終了時刻を記録 end = time.time() return end - start def get_distance(trig, echo, temp=15): # 出力を初期化 GPIO.output(trig, GPIO.LOW) time.sleep(0.3) # 出力(10us以上待つ) GPIO.output(trig, GPIO.HIGH) time.sleep(0.000011) # 出力停止 GPIO.output(trig, GPIO.LOW) # echo からパルスを取得 dur = pulse_in(echo, GPIO.HIGH, 1.0) # ( パルス時間 x 331.50 + 0.61 * 温度 ) x (単位をcmに変換) x 往復 return dur * (331.50 + 0.61 * temp) * 100 / 2 if __name__ == "__main__": GPIO_TRIG = 21 GPIO_ECHO = 20 OUT01= 17 OUT02 = 13 OUT03 = 23 GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_TRIG, GPIO.OUT) GPIO.setup(GPIO_ECHO, GPIO.IN) GPIO.setup(OUT01, GPIO.OUT) GPIO.setup(OUT02, GPIO.OUT) GPIO.setup(OUT03, GPIO.OUT) try: while True: kyori = round(get_distance(GPIO_TRIG, GPIO_ECHO)) if kyori < 50: print("50cm未満 : 距離:{0} cm".format(kyori)) GPIO.output(OUT01, GPIO.HIGH) GPIO.output(OUT02, GPIO.LOW) GPIO.output(OUT03, GPIO.LOW) elif 50 <= kyori < 100: print("50cm以上100cm未満 : 距離:{0} cm".format(kyori)) GPIO.output(OUT01, GPIO.LOW) GPIO.output(OUT02, GPIO.HIGH) GPIO.output(OUT03, GPIO.LOW) elif 100 <= kyori: print("100cm以上 : 距離:{0} cm".format(kyori)) GPIO.output(OUT01, GPIO.LOW) GPIO.output(OUT02, GPIO.LOW) GPIO.output(OUT03, GPIO.HIGH) time.sleep(0.01) except KeyboardInterrupt: pass GPIO.cleanup()

補足情報(FW/ツールのバージョンなど)

Raspberry Pi 3 model B
raspbian 9.11
Python 3.5.3

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

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

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

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

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

guest

回答3

0

ベストアンサー

プログラムの原因ではなく、ハードの原因(電圧)が強く疑われます。

というのも、同様のセンサー(たぶんチップ等は同一)を使ったことがあり、不安定だった件を問い合わせをしたことがあるためです。その際に、

  • 通常のセンサーよりも電圧の揺らぎに弱い
  • 電源を安定化させると動作が良くなる

(1.5Vアルカリ電池×複数経由で用意した電源 > 1.2V充電池×複数経由で用意した電源の違いでセンサーの動作が不安定になる。USB接続の外部バッテリーなんかを使うと安定する)

と教えていただきました。

skmt33さんの例でいえば、
RPi起動直後は不安定…起動直後はRPi自体の計算処理がたくさんあって電圧が安定しない
軌道からしばらくすると安定…RPiの計算が落ち着いて電圧が安定しだした

ですので、対策があるとすれば、以下の2つと思います。

  • 安定するまで待つ
  • 初めから安定させるためにセンサーに独立した5V電源を確保する

投稿2020/09/27 07:54

編集2020/09/27 07:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

skmt33

2020/10/01 11:40

かなり安定しました。 ただ稀に値が高く出ることがあるのでそこはプログラム側で対応しようと思います。 ありがとうございました。大変参考になりました。
guest

0

超音波の距離センサを持っていないので試せませんが、
Raspberry Piで(というよりLinuxのユーザーアプリケーションで)、しかもインタプリタ言語のPythonでμ秒単位の時間計測はかなり厳しい話に思えます。
Linuxはミリ秒単位でタスク切換えをしたりしますし、インタプリタ言語は結構遅いので。

(Raspberry Piでサーボモーターを制御するとピタリと止まらずにジリジリと振動するのと同根かと)

投稿2020/09/27 08:06

thkana

総合スコア7703

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

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

skmt33

2020/10/01 11:41

大変参考になりました。ありがとうございました。
guest

0

そのセンサのデータシートを見ると、10μsecの超音波パルスを出力し、反射波の時間差を計測する、というものですが、それをラズパイで、それもOS上で走るpythonのコードで計測しようというのはちと現実的ではありません。

実際にきちんと距離計測はできているんでしょうか。

time.sleeおよび、time.timeの時間精度はどんだけなのかを調べてみてはどうでしょう(分解能はともかく)

投稿2020/09/27 08:02

y_waiwai

総合スコア88042

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

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

skmt33

2020/10/01 11:41

大変参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問