各出典元さま、ありがとうございます

おかげさまで素早くきれいに動作いたしました。

 

出典1:

 

出典2:

キットに付属していた超音波センサHC-SR04を使いました。

チュートリアルはESP32用です。ESP32だと5Vのままで使えるようです。

原典のプログラムはMicroPythonですので、使いませんでした。

 

■配線状態

ステッピングモータ用途のGPIOピンをそのまま残し、空きのピンを使いました。

超音波センサー用の配線を小型のブレッドボードに設け、ボード間結線しています。

手元の拡張基板がWiringPi表記なので配線が少々わかりにくいのですが、

先に作っていた対比表とにらめっこしながら、これで行けるはず!で配線しました。

 

超音波センサHC-SR04はトリガーにパルスを送ると、

超音波を発し、反射を捉えるとエコーがグランドに落ちる

という単純なアナログ的動作です。

トリガーからエコー検出までの時間が距離に比例するので、

時間計測(前後時刻の差の算出)となり、プログラムの

動作速度が微妙に影響する可能性が残っています。

しかし回路はめっちゃ簡単、要求精度が高くない限り、

低コストで実行できると思います。

 

ラズパイのGPIO信号は3.3V駆動につき、5.0Vデバイスからの

電圧分岐方法について出典1を参照いたしました。

(1kΩ抵抗3本を使い、5*2/3=3.3に降圧しました)

トリガとエコーのボード間結線後にプログラム動作させて、

あれっ?動かんやん?

となりましたが、拡張基板との配線を忘れていた・・・

そりゃ動くわけないわ。

↑で、配線(右から入ってくる黄と白の線)すると

一発動作しました。

 

■制御プログラム

原典のプログラムのピン設定はBCMですが、BOARDに書き換えました。

 

#ultrasonic-sensor.py
#origin at https://raspi-school.com/ultrasonic-sensor/

import RPi.GPIO as GPIO
import time
import sys

trig_pin = 37                # GPIO 26
echo_pin = 36                         # GPIO 16
speed_of_sound = 34370       # 20℃での音速(cm/s)

#GPIO.setmode(GPIO.BCM)             # GPIOをBCMモードで使用 X
GPIO.setmode(GPIO.BOARD)           # GPIOをBOARDモードで使用
GPIO.setwarnings(False)                 # BPIO警告無効化
GPIO.setup(trig_pin, GPIO.OUT)       # Trigピン出力モード設定
GPIO.setup(echo_pin, GPIO.IN)         # Echoピン入力モード設定

def get_distance(): 
    #Trigピンを10μsだけHIGHにして超音波の発信開始
    GPIO.output(trig_pin, GPIO.HIGH)
    time.sleep(0.000010)
    GPIO.output(trig_pin, GPIO.LOW)
    while not GPIO.input(echo_pin):
        pass
    t1 = time.time() # 超音波発信時刻(EchoピンがHIGHになった時刻)格納
    while GPIO.input(echo_pin):
        pass
    t2 = time.time() # 超音波受信時刻(EchoピンがLOWになった時刻)格納
    return (t2 - t1) * speed_of_sound / 2 # 時間差から対象物までの距離計算

while True:
    # 繰り返し処理
    try:
        distance = '{:.1f}'.format(get_distance())  # 小数点1までまるめ
        print("Distance: " + distance + "cm")       # 表示
        time.sleep(1)                               # 1秒まつ

    except KeyboardInterrupt:                       # Ctrl + C押されたたら
        GPIO.cleanup()                              # GPIOお片付け
        sys.exit()                                  # プログラム終了

 

■結果

・画面は出典1のとおりになります。(画面記録していません)

・対象物の反射面が細いと反射しないようです。
・2cm刻みで離散的な位置を判別する程度の精度はあるようです。

・超音波放射角は20度ぐらいの感じです。

 

■考察・1ユニットでGPIO2本使うので、1台のラズパイに5ユニット以上をセット

 できると思います。

・トリガかけてからエコーのピン状態を繰り返し監視して時刻差測定する方法では、 

 複数ユニットの1ユニットずつを個別にトリガ&計測する方法になるので、

 完全な同時性は得られません。

 1ユニット1秒程度の静的な用途であれば十分に使えるはずですから、

 例えば製造や検品の現場での不良数カウントなどに容易に応用できそうです。

 

以上