.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_fun_alarm:
4.3 バックアラーム
==============================
**はじめに**
車をガレージに安全に駐車するには、特に狭い場所では慎重な操作が必要です。このプロジェクトでは、超音波センサーとブザーを使ってバックアラームシステムを作成します。このシステムは実際の駐車支援センサーのように動作し、障害物までの距離に応じて音でフィードバックを返します。
----------------------------------------------
**必要なもの**
このプロジェクトに必要なコンポーネントは以下のとおりです。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT INTRODUCTION
- PURCHASE LINK
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_buzzer`
- |link_passive_buzzer_buy|
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_ultrasonic_sensor`
- |link_ultrasonic_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
このシステムでは、超音波センサーを使って障害物までの距離を測定します。ブザーは距離に応じて異なる頻度で警告音を出します。
.. image:: img/fzz/4.1.6_sch.png
:width: 100%
:align: center
----------------------------------------------
**配線図**
以下の配線図に従ってシステムを組み立ててください。
.. image:: img/fzz/4.1.6_bb.png
:width: 100%
:align: center
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 4.3_ReversingAlarm.py
このPythonスクリプトは、超音波距離センサーとブザーを組み合わせて、リアルタイム距離監視システムを構築します。実行すると、次のように動作します。
1. **距離測定**: 超音波センサーが前方の最も近い物体までの距離を測定し、その値をセンチメートルに変換します。
2. **ブザー警告**: 測定した距離に応じて次のように動作します。
- **50 cmより大きい**: ブザーは鳴りません。
- **20 cmから50 cmの間**: 短い間隔を空けて2回ブザーが鳴ります。
- **20 cm以下**: 接近を示すためにブザーがすばやく連続して鳴ります。
----------------------------------------------
**コード**
以下は、このプロジェクトで使用するPythonコードです。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import time
from fusion_hat.modules import Ultrasonic, Buzzer
from fusion_hat.pin import Pin
# Ultrasonic sensor: Trig -> GPIO 27, Echo -> GPIO 22
sensor = Ultrasonic(trig=Pin(27), echo=Pin(22))
# Buzzer connected to GPIO 17
buzzer = Buzzer(Pin(17))
def get_distance():
"""
Read distance from ultrasonic sensor and print it.
Returns distance in centimeters.
"""
dis = sensor.read()
print(f"Distance: {dis:.2f} cm")
return dis
def beep(times, on_time, off_time):
"""
Make the buzzer beep with given timing.
"""
for _ in range(times):
buzzer.on()
time.sleep(on_time)
buzzer.off()
time.sleep(off_time)
def loop():
"""
Continuously measure distance and control buzzer frequency.
"""
while True:
dis = get_distance()
if dis >= 50:
# Far distance: buzzer silent
time.sleep(0.5)
elif 20 < dis < 50:
# Medium distance: slow beeping
beep(times=2, on_time=0.05, off_time=0.2)
else:
# Close distance (<= 20 cm): fast beeping
beep(times=5, on_time=0.05, off_time=0.05)
time.sleep(0.3) # Measurement interval
try:
loop()
except KeyboardInterrupt:
buzzer.off()
print("\nProgram stopped, buzzer turned off.")
----------------------------------------------
**コードの解説**
1. **距離測定:** 超音波センサーが距離を計算します。
.. code-block:: python
def get_distance():
"""
Read distance from ultrasonic sensor and print it.
Returns distance in centimeters.
"""
dis = sensor.read()
print(f"Distance: {dis:.2f} cm")
return dis
2. **音による警告:** 障害物との距離に応じて、ブザーの鳴り方が変化します。
* **50 cm超:** 音は鳴りません。
* **20〜50 cm:** 中程度の間隔で2回鳴ります。
* **20 cm以下:** 緊急警告としてすばやく連続して鳴ります。
.. code-block:: python
def loop():
while True:
dis = get_distance()
if dis >= 50:
# Far distance: buzzer silent
time.sleep(0.5)
elif 20 < dis < 50:
# Medium distance: slow beeping
beep(times=2, on_time=0.05, off_time=0.2)
else:
# Close distance (<= 20 cm): fast beeping
beep(times=5, on_time=0.05, off_time=0.05)
time.sleep(0.3) # Measurement interval
----------------------------------------------
**トラブルシューティング**
1. **距離が測定されない**:
- **原因**: 配線ミス、またはセンサーの故障。
- **対処方法**:
- 超音波センサーの ``echo`` ピンと ``trigger`` ピンが、それぞれ GPIO22 と GPIO27 に接続されていることを確認してください。
- センサー単体でテストし、正常に動作することを確認してください。
2. **ブザーが鳴らない**:
- **原因**: ブザーが接続されていない、または故障している。
- **対処方法**:
- ブザーが GPIO17 と GND に正しく接続されていることを確認してください。
- 次のコードでブザーを手動テストしてください。
.. code-block:: python
buzzer.on()
time.sleep(1)
buzzer.off()
----------------------------------------------
**拡張アイデア**
1. **警告しきい値の調整**: ブザー警告の距離しきい値をユーザーが自由に設定できるようにします。
2. **データログ記録**: 距離測定値をファイルに保存して後で分析できます。
.. code-block:: python
with open("distance_log.txt", "a") as log_file:
log_file.write(f"{time.time():.3f}, {dis:.2f} cm\n")
3. **視覚的な警告**: 距離レベルに応じて色の異なるLEDを使用します(例:安全は緑、注意は黄、危険は赤)。
----------------------------------------------
**まとめ**
このプロジェクトでは、超音波センサーを活用した実用的なバックアラームシステムを紹介しました。音によるフィードバックを組み合わせることで、直感的に距離を把握できます。このようなシステムは車両やロボティクス分野で非常に有用であり、近接検知やIoT連携の理解にも役立ちます。ぜひ機能を拡張し、独自のアイデアに発展させてください。