皆さんこんにちは。yossyです。
今回はRaspberry Pi Pico(互換ボード)と超音波センサーを使って、障害物を検知したら止まる車を作ったので紹介します。
作りたいもの
超音波センサーで障害物との距離を測定→一定の距離になったらモーターをストップする単純な装置です。
シンプルな動作ですが、ロボットの基本的な動作を作れるだけでワクワクします。

これが障害物を検知するために使う超音波センサー。スピーカーから出た超音波が返ってくるまでの時間から、距離を計算します。
モーターは前に記事を書いたので使ったことがありますが、超音波センサはあまり使ったことがないのでわからないことが多いです。

制作
それでは早速制作に入ります。
使用したもの
- Raspberry Pi Pico互換ボード
- タミヤ ダブルギヤボックス(左右独立4速タイプ)
- タミヤ オフロードタイヤセット
- ブレッドボード
- オーディオジャック(タイヤを通す用)
- 電源基板
- 9V電池
- L293D モータードライバ
- SR04 超音波センサ
- 抵抗 1KΩ,2KΩ(SR04の電圧変換用)
タミヤのギアボックスとタイヤは、Raspberry Pi PicoとMicroPythonでモータードライバーL293Dを使う方法で使用したものと同じです。タミヤの製品は安くて品質も良いので工作にとても便利です。

オーディオジャックは、ギターのエフェクターを作ってみようと思ったときに買って結局使わなかったものです。別にオーディオジャックじゃなくても、ストローのようなもので代用できると思います。(オーディオジャック使っているのが変なだけ)
超音波センサーはAliExpressでまとめ買いしたものです。意外にやすいのでとりあえず買ってみるのがおすすめです。
Amazonにも売っています

プログラム
ChatGPTに尋ねたら、ほとんど書いてくれたのでそれを流用しました。最初聞いたのは超音波センサーの部分だけだったのに、モータードライバのピンの設定を書いただけで、障害物を検知したら止まる仕組みも作ってくれました。AIすごすぎ。
少々不具合が出た部分がありましたが、修正してきちんと動くようになりました。
from machine import Pin, time_pulse_us, PWM
import time
# ピンの設定
TRIG_PIN = 2 # Trig ピン
ECHO_PIN = 3 # Echo ピン
MA_E = 13 # L293D EN1,2
MA_1 = 14
MA_2 = 15
MB_E = 18 # L293D EN3,4
MB_1 = 17
MB_2 = 16
# GPIOの初期化
trig = Pin(TRIG_PIN, Pin.OUT)
echo = Pin(ECHO_PIN, Pin.IN)
motorA_EN = PWM(Pin(MA_E))
motorA_1 = Pin(MA_1, Pin.OUT)
motorA_2 = Pin(MA_2, Pin.OUT)
motorB_EN = PWM(Pin(MB_E))
motorB_1 = Pin(MB_1, Pin.OUT)
motorB_2 = Pin(MB_2, Pin.OUT)
#PWM周波数の設定
motorA_EN.freq(1000)
motorB_EN.freq(1000)
def measure_distance():
# Trigピンに10μsのパルスを送信
trig.low()
time.sleep_us(2)
trig.high()
time.sleep_us(10)
trig.low()
# EchoピンのHIGHの期間を計測
duration = time_pulse_us(echo, 1, 30000) # 最大30ms待機
# 距離を計算 (音速: 343 m/s)
distance = (duration / 2) * 0.0343 # cm単位
return distance
def control_motors(distance):
if distance < 10:
# 障害物が近い場合、モーターを停止
motorA_EN.duty_u16(0)
motorB_EN.duty_u16(0)
else:
# 前進
motorA_EN.duty_u16(65535)
motorB_EN.duty_u16(65535)
motorA_1.high()
motorA_2.low()
motorB_1.high()
motorB_2.low()
# メインループ
try:
while True:
dist = measure_distance()
print("距離: {:.2f} cm".format(dist))
control_motors(dist)
time.sleep(0.1)
except KeyboardInterrupt:
print("終了")
motorA_EN.duty_u16(0)
motorB_EN.duty_u16(0)
組み立て

ジャンパピンでブレッドボードにゴリ押し配線しました。こういうことやってるとケーブル全部引っこ抜きたくなってきませんか?
SR04のブラケットはThingiverseでダウンロードしたものを印刷しました。(https://www.thingiverse.com/thing:189585)
車体も3Dプリンターで制作しようと思ったのですが、ブレッドボードに両面テープがついていることを思い出しギアボックスをそのまま貼り付けてみるとちょうどいい感じになりました。
完成

完成しました。超音波センサーが目みたいになってて可愛い。
ジャンパーワイヤーがごちゃごちゃしていますが、そのほうがロボットっぽいのでOKです。
動作の様子
Twitterに、動作している様子を公開しています。
まとめ
今回は超音波センサーで障害物を検知する車を作ってみました。前からやってみたかった内容なのでとても楽しかったです。次は障害物を回避するような動きを実装してみたいと思います。