【Raspberry Pi】【ロボット】HC-SR04で障害物を検出する

  • URLをコピーしました!

今回はラズパイベースのロボット、PiCrawlerに搭載されている距離センサーHC-SR04を使って障害物検出をしてみたいと思います。

目次

PiCrawlerについて

Raspberry Piをコントローラとして動作するロボット、PiCrawlerです。詳細は下記の記事で解説していますのでご覧ください。

超音波距離センサー HC-SR04

PiCrawlerに搭載されたHC-SR04

超音波センサーは、人間が聞き取ることのできない周波数帯域の音波を送信し、物体に反射して返ってくる時間を計測することで、物体までの距離を計測することができます。PiCrawlerに付属しているHC-SR04は2-400cm間の物体までの距離を計測することができます。

ロボットPiCrawlerで障害物検出する

PiCrawlerではHC-SR04のハードウェアを制御するためのライブラリーがあらかじめ用意されており、以下の一行を記述するだけで物体との距離を取得することができます。

distance = sonar.read()

これで変数distanceに距離を表す数値が代入されます。

ロボットを制御するソースコード

今回はPiCrawlerが障害物との距離が近くなるまで前進し続け、閾値の距離に到達したら少し後退して停止するという動作をPythonで記述しました。ソースコードは以下の通りです。

from picrawler import Picrawler
from robot_hat import TTS, Music
from robot_hat import Ultrasonic
from robot_hat import Pin
import time
import os
import sys

tts = TTS()

#サーボ初期化
crawler = Picrawler([10,11,12,4,5,6,1,2,3,7,8,9])

#距離センサー初期化
sonar = Ultrasonic(Pin("D2") ,Pin("D3"))

#距離センサ閾値設定
alert_distance = 15

#動作速度を0-100で指定
speed = 100

def main():

    #距離センサで距離を取得
    distance = sonar.read()
    print(distance) #距離を表示
    
    #距離により行動を分岐
    if distance < 0: #エラー
        pass
        
    elif distance <= alert_distance: #現在の距離が閾値より低い場合     
        crawler.do_action('backward', 4, speed) #ロボットを後退させる
        
        #プログラムを終了
        sys.exit(0)
        
    else : #距離が閾値より大きい場合は前進
        crawler.do_action('forward', 1, speed) #ロボットを前進させる
        time.sleep(0.2)
        
        
if __name__ == "__main__":

    while True:
        main()
15行目:
HC-SR04のデバイスを初期化します。

18行目:
障害物に接近したことを判定するための閾値を設定します。

25行目:
HC-SR04から現在の障害物との距離を取得します。

29行目:
現在の距離からロボットの次の行動を判断します。

プログラムを実行している動画

プログラムを動作させている動画は以下となります。

ドアの手前まで前進していき、直前(閾値で設定した距離)で停止させることができました

まとめ

PiCrawlerのライブラリを使うことで距離検出の処理を一行のコードで実装することができました。ロボットを自律制御を行う際に、障害物を回避したり進路を判断するのに活用できるかと思います。

それでは、また次の記事でお会いしましょう。

おすすめ記事

よかったらシェアしてね!
  • URLをコピーしました!
目次