前提・実現したいこと
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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/01 11:40