.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_fun_welcome:
4.5 Welcome
==============================
**はじめに**
コンビニエンスストアの自動ドアが、人が近づくとチャイムとともに開くのを見たことはありませんか?
このプロジェクトでは、その仕組みを小規模に再現します。PIR センサー、サーボモーター、LED、ブザーを使って、ミニチュアの「自動ドア」システムを作成します。動きを検出すると、システムは LED を点灯し、サーボでドアを「開け」、さらにブザーで歓迎音を鳴らします。
----------------------------------------------
**必要なもの**
このプロジェクトに必要なコンポーネントは以下のとおりです。
.. 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_pir`
- |link_pir_buy|
* - :ref:`cpn_servo`
- |link_servo_buy|
* - :ref:`cpn_buzzer`
- |link_passive_buzzer_buy|
* - :ref:`cpn_transistor`
- |link_transistor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
以下は、このプロジェクトの回路図です。
.. image:: img/fzz/4.1.5_sch.png
:width: 100%
:align: center
----------------------------------------------
**配線図**
以下の配線図に従って回路を組み立ててください。
.. image:: img/fzz/4.1.5_bb.png
:width: 100%
:align: center
.. note::
最適な感度と検出範囲を得るために、PIR センサーモジュール上の可変抵抗を調整してください。最適な動作のため、両方の可変抵抗を反時計回りいっぱいまで回してください。
.. image:: ../python/img/PIR_TTE.png
:width: 300
:align: center
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 4.5_Welcome.py
----------------------------------------------
**コード**
以下は、このプロジェクトで使用する Python スクリプトです。
.. raw:: html
.. code-block:: python
from fusion_hat.pin import Pin, Mode, Pull
from fusion_hat.servo import Servo
from fusion_hat.modules import Buzzer
from fusion_hat.pwm import PWM
import time
# GPIO pin setup
ledPin = Pin(17, Pin.OUT)
# Initialize a PIR Module object on GPIO pin 17
pirPin = Pin(22, mode=Mode.IN, pull=Pull.DOWN)
buzPin = Buzzer(PWM('P0'))
# Initialize servo with custom pulse widths
servoPin = Servo('P4')
# Musical tune for buzzer, with notes and durations
tune = [('C#4', 0.2), ('D4', 0.2), (None, 0.2),
('Eb4', 0.2), ('E4', 0.2), (None, 0.6),
('F#4', 0.2), ('G4', 0.2), (None, 0.6),
('Eb4', 0.2), ('E4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('C4', 0.2), ('B4', 0.2), (None, 0.2),
('F#4', 0.2), ('G4', 0.2), (None, 0.2),
('B4', 0.2), ('Bb4', 0.5), (None, 0.6),
('A4', 0.2), ('G4', 0.2), ('E4', 0.2),
('D4', 0.2), ('E4', 0.2)]
def setAngle(angle):
"""
Move the servo to a specified angle.
:param angle: Angle in degrees (0-180).
"""
servoPin.angle(angle) # Set servo position
time.sleep(0.001) # Short delay for servo movement
def doorbell():
"""
Play a musical tune using the buzzer.
"""
for note, duration in tune:
buzPin.play(note,float(duration)) # Play the note
buzPin.off() # Stop buzzer after playing the tune
def closedoor():
# Turn off LED and move servo to close door
ledPin.off()
for i in range(180, -1, -1):
setAngle(i) # Move servo from 180 to 0 degrees
time.sleep(0.001) # Short delay for smooth movement
time.sleep(1) # Wait after closing door
def opendoor():
# Turn on LED, open door (move servo), play tune, close door
ledPin.on()
for i in range(0, 181):
setAngle(i) # Move servo from 0 to 180 degrees
time.sleep(0.001) # Short delay for smooth movement
time.sleep(1) # Wait before playing the tune
doorbell() # Play the doorbell tune
closedoor() # Close the door after the tune
def loop():
# Main loop to check for motion and operate door
while True:
if pirPin.value()==1:
opendoor() # Open door if motion detected
time.sleep(0.1) # Short delay in loop
try:
loop()
except KeyboardInterrupt:
# Clean up GPIO on user interrupt (e.g., Ctrl+C)
buzPin.off()
ledPin.off()
この Python スクリプトは、PIR モーションセンサー、サーボモーター、LED、ブザーを組み合わせて、自動歓迎システムを作成します。実行すると、次のように動作します。
1. **動きの検出**: GPIO22 に接続された PIR モーションセンサーが動きを検出します。
2. **ドアの自動動作**: 動きが検出されると、次の動作が実行されます。
- サーボモーター(PWM 4)が 0° から 180° まで動いてドアを開きます。
- LED(GPIO17)が点灯します。
- ブザー(PWM 0)で歓迎音が鳴ります。
- その後、サーボモーターが 180° から 0° に戻ってドアを閉じます。
- LED が消灯します。
3. **継続的な監視**: システムは常に動きを監視し、動きが検出されるたびに上記の動作を繰り返します。
4. **安全な終了**: ``Ctrl+C`` を押すと、ブザーと LED をオフにしてスクリプトを安全に終了します。
----------------------------------------------
**コードの解説**
1. **動きの検出:** PIR センサーが動きを検出し、システムを動作させます。
2. **サーボ制御:** サーボモーターは 0° から 180° まで動いてドアを開き、その後元に戻ってドアを閉じます。
3. **ブザーのメロディ:** ``Buzzer`` を使って歓迎メロディを再生します。
4. **リセット:** チャイム再生後、システムはドアを閉じて LED を消灯し、次の検出に備えます。
----------------------------------------------
**トラブルシューティング**
1. **動きが検出されない**:
- **原因**: PIR センサーの配線ミス、または周囲環境による干渉。
- **対処方法**:
- PIR センサーが GPIO22、電源、GND に正しく接続されていることを確認してください。
- 必要に応じて、センサーの感度や遅延時間の可変抵抗を調整してください。
2. **サーボが動かない**:
- **原因**: サーボ設定の誤り、または電源供給の問題。
- **対処方法**:
- サーボが P4 に接続され、正しく給電されていることを確認してください。
3. **チャイムが鳴らない**:
- **原因**: ブザー設定の誤り、またはメロディデータの形式が正しくない。
- **対処方法**:
- ブザーが P0 に接続されていることを確認してください。
- ``tune`` リストに有効な音階と時間の組が含まれていることを確認してください。
4. **LED が点灯しない**:
- **原因**: LED の配線、または GPIO 設定の問題。
- **対処方法**: LED が適切な抵抗を介して GPIO17 に接続されていることを確認してください。
----------------------------------------------
**拡張アイデア**
1. **チャイムの変更**: より多くのメロディを追加したり、イベントごとに異なるチャイムを選べるようにします。
2. **時間帯による制御**: 特定の時間帯(たとえば夜間)にはシステムを無効化します。
.. code-block:: python
from datetime import datetime
if 8 <= datetime.now().hour < 22: # Operate only between 8 AM and 10 PM
opendoor()
3. **データログ記録**: 動き検出のイベントと時刻をファイルに保存して分析できるようにします。
.. code-block:: python
with open("motion_log.txt", "a") as log_file:
log_file.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - Motion detected\n")
4. **音声によるあいさつ**: ブザーのチャイムの代わりに、スピーカーを使って録音済みの音声メッセージを再生します。
----------------------------------------------
**まとめ**
このプロジェクトでは、自動ドアの仕組みを楽しく学べる形で再現しました。動き検出、サーボ制御、音の出力といった基本要素を扱うため、IoT や自動化プロジェクトの入門として最適です。リモート通知やクラウド連携などの機能を追加して、リアルタイム監視システムへ発展させてみてください。