.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_ultrasonic:
2.13 超音波センサーモジュール
==============================
**はじめに**
超音波センサーモジュールは、超音波を利用して距離を高精度に測定するためのセンサーです。超音波を送信し、その反射波(エコー)を受信するまでの時間をもとに距離を算出します。この技術は汎用性が高く、ロボット、障害物検知、距離測定など、さまざまな用途で広く利用されています。
----------------------------------------------
**必要なもの**
このプロジェクトに必要なコンポーネントは以下のとおりです。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT INTRODUCTION
- PURCHASE LINK
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_ultrasonic_sensor`
- |link_ultrasonic_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
以下は、超音波センサーモジュールの回路図です。
.. image:: img/fzz/2.2.7_sch.png
----------------------------------------------
**配線図**
以下の図を参考にして回路を組み立ててください。
.. image:: img/fzz/2.2.7_bb.png
:width: 80%
:align: center
接続が確実であることを確認してください。EchoピンはRaspberry PiのGPIO22に、TriggerピンはGPIO27に接続します。
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 2.13_Ultrasonic.py
このPythonスクリプトは、超音波距離センサーを使用して対象物までの距離を測定し、その結果をコンソールに表示します。実行すると、次のように動作します。
1. GPIO27(Trigger)およびGPIO22(Echo)に接続されたセンサーが、最も近い物体までの距離を継続的に測定します。
2. 距離はメートル単位で計算された後、センチメートルに変換され、 ``Distance: cm`` の形式で小数点以下2桁まで表示されます。
3. 距離は0.3秒ごとに更新されるため、ほぼリアルタイムで監視できます。
4. プログラムは ``Ctrl+C`` で中断されるまで継続して動作し、その後安全に終了します。
----------------------------------------------
**コード**
以下は、このプロジェクトで使用するPythonコードです。
.. raw:: html
.. code-block:: python
# Import Ultrasonic and Pin class
from fusion_hat.modules import Ultrasonic
from fusion_hat.pin import Pin
from time import sleep
# Create Ultrasonic object
sensor = Ultrasonic(Pin(27), Pin(22))
try:
# Main loop to continuously measure and report distance
while True:
dis = sensor.read() # Measure distance in centimeters
print('Distance: {:.2f} cm'.format(dis)) # Print the distance with two decimal precision
sleep(0.3) # Wait for 0.3 seconds before the next measurement
except KeyboardInterrupt:
# Handle KeyboardInterrupt (Ctrl+C) to gracefully exit the loop
pass
----------------------------------------------
**コードの解説**
1. **インポート:**
.. code-block:: python
from fusion_hat.modules import Ultrasonic
from fusion_hat.pin import Pin
from time import sleep
このスクリプトでは、超音波センサーを操作するために ``fusion_hat`` ライブラリの ``Ultrasonic`` クラスを、待機時間を入れるために ``time`` モジュールの ``sleep`` 関数をインポートしています。
2. **初期化:**
.. code-block:: python
sensor = Ultrasonic(Pin(27), Pin(22))
EchoピンをGPIO22、TriggerピンをGPIO27に接続して超音波センサーを初期化します。この設定により、Raspberry Piから超音波信号を送信し、その反射波を受信できます。
3. **メインループ:**
.. code-block:: python
while True:
dis = sensor.read() # Measure distance in centimeters
print('Distance: {:.2f} cm'.format(dis)) # Print the distance with two decimal precision
sleep(0.3) # Wait for 0.3 seconds before the next measurement
* 最も近い物体までの距離を継続的に測定します。
* 距離をセンチメートル単位で取得します。
* 小数点以下2桁までの精度で距離を表示します。
* 測定間に0.3秒の待機時間を入れることで、センサーの動作を安定させます。
4. **安全な終了処理:**
``try-except`` ブロックにより、 ``Ctrl+C`` で中断された場合でもプログラムを安全に終了できます。
.. code-block:: python
except KeyboardInterrupt:
pass
----------------------------------------------
**トラブルシューティング**
1. **距離が表示されない**:
- **原因**: センサーが正しく接続されていない、または電源が供給されていない可能性があります。
- **対処方法**:
- TriggerピンがGPIO27に、EchoピンがGPIO22に正しく接続されていることを確認してください。
- センサーに安定した電源が供給されていることを確認してください。
2. **距離の値が一定、または不正確になる**:
- **原因**: 対象物がセンサーに近すぎる、または遠すぎる、あるいは干渉が発生している可能性があります。
- **対処方法**:
- 対象物がセンサーの有効測定範囲内(通常は2cm〜400cm)にあることを確認してください。
- 他の超音波機器や反射しやすい表面による干渉がないか確認してください。
3. **距離が常に0になる**:
- **原因**: センサーの故障、または配線ミス。
- **対処方法**: 別のGPIO構成でセンサーをテストするか、故障している場合は交換してください。配線構成も再確認してください。
----------------------------------------------
**拡張アイデア**
1. **しきい値アラート**: 測定距離が特定のしきい値を下回ったときに警告を出すことができます。
.. code-block:: python
if dis < 10:
print("Warning: Object too close!")
2. **音によるフィードバック**: 距離がしきい値を下回ったときにブザーを鳴らすことができます。
.. code-block:: python
from fusion_hat import Buzzer
buzzer = Buzzer(Pin(4))
if dis < 10:
buzzer.on()
else:
buzzer.off()
----------------------------------------------
**まとめ**
このプロジェクトでは、Raspberry Piで超音波センサーモジュールを使用して距離を測定する方法を学びました。超音波検知の原理とGPIOプログラミングの基礎を理解することで、ロボットからホームオートメーションまで、さまざまなアプリケーションにこの種のセンサーを組み込むことができます。この基礎をもとに、センサーを使ったより高度な実世界インタラクションのプロジェクトへと発展させることができます。