テストに使用するプログラム
── GoPiGo が前方障害物との距離を測りながら直進し,障害物の 30cm 手前でストップ
#!/usr/bin/python
###### Sensor ####################################
import RPi.GPIO as GPIO
TrigPin = 16
EchoPin = 18
# Set the GPIO pins as numbering
GPIO.setmode(GPIO.BOARD)
# Set the TrigPin's mode is output
GPIO.setup(TrigPin,GPIO.OUT)
GPIO.output(TrigPin, GPIO.LOW)
# Set the EchoPin's mode is input, and ON→ HIGH
GPIO.setup(EchoPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
import time
def dist_read():
# 10us pulse to TrigPin
time.sleep(0.3)
GPIO.output(TrigPin, GPIO.HIGH)
time.sleep(0.00001)
GPIO.output(TrigPin, GPIO.LOW)
# 超音波発信
# EchoPin が LOW から HIGH に変わる時刻 signaloff
while GPIO.input(EchoPin) == GPIO.LOW:
signaloff = time.time()
# EchoPin が HIGH から LOW に変わる時刻 signalon
while GPIO.input(EchoPin) == GPIO.HIGH:
signalon = time.time()
# EchoPin が HIGH だった時間
timepassed = signalon - signaloff
distance = timepassed * 17000
return round(distance)
###### exit process #############################
def bye():
# Release resource
GPIO.cleanup()
#### The Program starts from here ###############
# Wait for input to start
input('Press ENTER to start')
while True:
try:
dist = dist_read()
if( dist < 450 ):
print('Dist : ',dist,' cm')
else:
print('?')
break
except KeyboardInterrupt:
break
# exit
bye()
|
$ vi test.py
$ chmod +x test.py
$ ./test.py
解説
測定のトリガーは,TrigPin が SR04 の Trig に送信する 10us の High (5V)パルス。
Trig がこれを受信すると,センサーの送信機は 40kHzで8サイクルの超音波信号を発信する。
併せて,Echo を HIGH (5V) に設定する。
信号は物体に当たって反射し,反射信号が受信機に届く。
反射信号を検出したセンサーは,Echo を LOW に設定する。
osoyoo「超音波センサーを制御する方法」から引用:
物体との距離は,Echo が HIGH になっていた時間から,つぎのように導かれる:
距離 [cm] = 往復距離 [cm] / 2 = 音速 [cm/s] × 時間 [s] / 2
このプログラムでは,簡便のため,音速を 340 m/s = 34000 cm/s とした。
よって, 「distance = timepassed * 17000」となっている。
|