超音波センサーHC-SR04を、MicroPythonで使う

プログラム

超音波センサHC-SR04は秋月電子では(2023年6月現在)300円販売され、超音波出し音波の反射時間を測定し、非接触で距離を測定することができる距離センサーです。
安いので試しに使ってみるのにはちょうどいいセンサーではないかと思いますので、このHC-SR04の簡単な説明、MicroPythonで距離を測定する方法について解説いたします。

スポンサーリンク

超音波センサHC-SR04

HC-SR04概要

それほど精度は高くはありませんが センチ程度で測れるということです。
左Tの部分丸いのが、超音波を出す部分で、右Rの丸い部分が跳ね返っ来た超音波を感知するセンサーです、動作電圧は5Vですのでラズベリーパイピコなどで使う場合注意が必要です、エコーピンの電圧を3.3V変換しなければなりません。
これから そのタイミングチャートを図を基に説明します (秋月電子より)

最初はトリガー ピンです 10μセカンドトリガー ピンをハイにすることによって40キロヘルツの超音波8回を出力します 。ここが重要です8回出力が終わるエコーピンがハイ(1)になります。
跳ね返た超音波を受信するとエコーピンがロウになります。
次にまたトリガーコマンド送る時間は60mm セカンドをあけなければならないととのことです。

距離図る仕組み

上記のタイミング図によると、まずトリガーピンをハイにすると、40KH×8の超音波の塊がTの部分より出力されます。
出終わるとアウトプット エコー ピンがハイになります。
次に R のレシーバーが、ものにあたって帰ってきた超音波の塊を受信すると、アウトプット エコー ピンをローにします。
エコーピンがハイの時間の2分の1が、測定するものの位置までの音波の到達時間になります。
音速=336.1+0.61*T  Tは気温(摂氏)
距離=音速×(エコーピンがハイ時間÷2)となります。

接続方法

今回ラズベリーパイピコとの接続方法説明します。
注意しなければならないのは、この SRー04は5V で駆動します。
アルディーなどは GPIO ピンは5Vで大丈夫ですが、ラズベリーパイ あるいは ラズベリーパイ ピコなどは 3.3Vです。
直接つないでしまうと壊れてしまう可能性がありますですので、ラズベリーパイピコに接続するのには 抵抗を使って簡易分圧する方法をとるのが一番簡単です。 以下が 接続図です 。
抵抗分圧 抵抗値は例えばの値です。


今回ラズベリーパイピコのGP14にトリガーピンを、GP15エコーピンをにつなぎました。

MicroPythonでプログラム

これは上記の接続図で、温度を20度に固定したシンプルなプログラムです。

from machine import Pin
import utime
temp=20
tr_p14=machine.Pin(14,machine.Pin.OUT)         #トリガーピン
ec_p15= machine.Pin(15, machine.Pin.IN)        #エコーピン
tr_p14.value(0)                                #とりあえずトリガーピン0にしておく
utime.sleep_us(4)
tr_p14.value(1)                                 #パルス出力
utime.sleep_us(10)
tr_p14.value(0)                                 #終わる
while ec_p15.value() == 0:                      #エコーピン判定
    end_low=utime.ticks_us()
while  ec_p15.value() == 1:                     #エコーピン判定
    end_hight= utime.ticks_us()
aa=(end_hight-end_low)/2
bb=aa*336.1 +0.61*temp                         #距離計算
print(bb/10000)                               #センチ単位にする

実行結果です、距離が正しく計れてます、また距離は50センチぐらいまで計れるみたいです。

もう一つ追加のプログラムを載せておきます 。
ラズベリーパイ ピコにはアナログ温度センサーがあらかじめ 内蔵されており、 そのセンサーを使って温度を取得設定し、また関数を使ってプログラムを使用しやすくしてみました。
 

from machine import Pin
import utime
tr_p14=machine.Pin(14,machine.Pin.OUT)
ec_p15= machine.Pin(15, machine.Pin.IN)
def temp_d():
    s_tenp=machine.ADC(4)
    cc_f=3.3 / (65535)
    data= s_tenp.read_u16() * cc_f
    temp=27 - (data - 0.706)/0.001721
    utime.sleep(0.1)
    return temp
def get_time():
    tr_p14.value(0)
    utime.sleep_us(4)
    tr_p14.value(1)
    utime.sleep_us(10)
    tr_p14.value(0)
    while ec_p15.value() == 0:
        end_low=utime.ticks_us()
    while  ec_p15.value() == 1:
        end_hight = utime.ticks_us()
    return end_hight-end_low
for i in range(5):
    aa=get_time()/2
    bb=(aa*336.1) + (0.61*temp_d())
    print("距離"+str(bb/10000) + "  温度"+str(temp_d()))
    utime.sleep(1)

実行結果です。
今回試しにfor文を使って対象物を動かしながら、5回計ってみました、正しく動いているようです。

タイトルとURLをコピーしました