ラズタンクをリモート画面で遠隔操作すると目の前の障害物までの距離感覚がつかめないことがある。
そこで、車体前面に取り付けた超音波センサーで障害物までの距離を計測して、5~10cm手前で強制停止するしかけをつくる。
配線図のサンプル。
今回、M5stackは使いません。
後段の python コードは Trig ピンと Echo ピンは GPIO 23, 24 ピンを使っています。配線図と異なるのでご注意。
抵抗も同じ部品がなかったので配線図と異なる 510Ωx1個と、約1KΩ(=510Ωx2個)をそれぞれ代用しました。
python コードの例。
GPIOピン番号は↑の配線図と異なり23, 24ピンを使っているので注意。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import sys
TRIG_PIN = 23
ECHO_PIN = 24
SoundSpeed = 34000 # 音速(cm/s)
GPIO.setmode(GPIO.BCM) # GPIO BCMモードに設定
GPIO.setwarnings(False) # GPIO警告無効化
GPIO.setup( TRIG_PIN, GPIO.OUT )
GPIO.setup( ECHO_PIN, GPIO.IN )
def main():
print( "run Sonic" )
while True:
try:
strDistance = measure()
print( strDistance )
time.sleep(1.0)
except KeyboardInterrupt:
GPIO.cleanup()
sys.exit()
def measure():
# 10μsだけ超音波をHighにして計測する
GPIO.output( TRIG_PIN, GPIO.HIGH )
time.sleep( 0.00001 )
GPIO.output( TRIG_PIN, GPIO.LOW )
while( GPIO.input( ECHO_PIN ) == GPIO.LOW ):
sigoff = time.time()
while( GPIO.input( ECHO_PIN ) == 1 ):
sigon = time.time()
strTemp = str( round((( sigon - sigoff ) * SoundSpeed) / 2 ) ) + "cm"
return( strTemp )
if __name__ == '__main__':
main()
実行結果
$ python sonic.py
run Sonic
127cm
127cm
1183cm
126cm
3cm
3cm
127cm
11cm
1183cm
125cm
126cm
1184cm
126cm
GPIOコマンドの注意点
ちょっと古いラズパイOSではGPIOの操作に「import wiringpi as pi」を使っていたけれど、最近のラズパイOSでは使えない。
今回、「raspi-gpio」コマンドでコードを作り直しました。このコマンドなら Bullseye、Busterの両方 Rapsberry Pi に標準インストール済みです。
あと下記のコマンドも面白いので試してみてください。
$ gpio readall
+-----+-----+---------+------+---+---Pi 3B+-+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 |
以下省略
$ raspi-gpio get
BANK0 (GPIO 0 to 27):
GPIO 0: level=1 fsel=0 func=INPUT
GPIO 1: level=1 fsel=0 func=INPUT
GPIO 2: level=1 fsel=0 func=INPUT
GPIO 3: level=1 fsel=0 func=INPUT
以下省略
著音波センサーと障害物間の距離をグラフ表示
ラズパイカメラの映像を画面に表示する。超音波センサーと障害物間の距離を左上のグラフで表示する。