Up テスト 作成: 2021-05-23
更新: 2021-05-23


    配線


    テストに使用するプログラム
     ── 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」となっている。