.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_reed:
2.6 リードスイッチ
===========================
**はじめに**
このプロジェクトでは、リードスイッチを磁場センサーとして使用し、LEDを制御する方法を学びます。リードスイッチは磁場によって動作する電気スイッチであり、セキュリティシステム、ドアや窓のセンサー、位置検出などで広く利用されています。本プロジェクトでは、リードスイッチの状態を検出し、2つのLEDを使って視覚的なフィードバックを行う方法を紹介します。
----------------------------------------------
**必要なもの**
このプロジェクトを行うには、以下のコンポーネントが必要です。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT
- PURCHASE LINK
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_reed_switch`
- |link_reed_switch_buy|
* - :ref:`cpn_led`
- |link_led_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
この回路では、リードスイッチをプルダウン抵抗付きのGPIO入力ピンに接続します。また、2つのLEDをそれぞれ別のGPIO出力ピンに電流制限抵抗を介して接続します。磁石がリードスイッチに近づくとスイッチが閉じ、LEDの状態が切り替わります。
.. image:: img/fzz/2.2.4_sch.png
----------------------------------------------
**配線図**
以下の手順に従って回路を組み立ててください。
1. リードスイッチのGNDピンとVCCピンを、それぞれGNDと3.3Vに接続します。
2. リードスイッチのD0ピンをGPIO17に接続します。
3. LED1のカソードを220Ω抵抗を介してGPIO22に接続します。
4. LED1のアノードをGNDに接続します。
5. LED2のカソードを220Ω抵抗を介してGPIO27に接続します。
6. LED2のアノードをGNDに接続します。
.. image:: img/fzz/2.2.4_bb.png
:width: 80%
:align: center
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 2.6_ReedSwitch.py
このPythonスクリプトは、リードスイッチと2つの状態表示用LEDを使った磁場検出システムを作成します。実行すると、次のように動作します。
1. プログラムはリードスイッチの状態を継続的に監視します。
2. 磁石が検出された場合(リードスイッチが閉じる)、LED1が消灯しLED2が点灯します。
3. 磁石が検出されない場合(リードスイッチが開いている)、LED1が点灯しLED2が消灯します。
4. これにより、磁場の有無を視覚的に分かりやすく表示できます。
5. ``Ctrl+C`` を押すことでプログラムを安全に終了できます。
----------------------------------------------
**コード**
以下のPythonコードは、リードスイッチの状態を監視し、それに応じて2つのLEDを制御します。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from fusion_hat.pin import Pin, Mode, Pull
from time import sleep # Import sleep for delay
# Initialize reed switch (Button) on GPIO pin 17
reed = Pin(17, mode=Mode.IN, pull=Pull.DOWN)
# Initialize LED1 connected to GPIO pin 22
led1 = Pin(22,mode=Mode.OUT)
# Initialize LED2 connected to GPIO pin 27
led2 = Pin(27,mode=Mode.OUT)
try:
# Continuously monitor the state of the reed switch and control LEDs accordingly
while True:
if reed.value() == 0: # Check if the reed switch is activated
led1.off() # Turn off LED1
led2.on() # Turn on LED2
else: # If the sensor is not activated
led1.on() # Turn on LED1
led2.off() # Turn off LED2
except KeyboardInterrupt:
# Handle a keyboard interrupt (Ctrl+C) for a clean exit from the loop
pass
----------------------------------------------
**コードの解説**
1. **ライブラリのインポート**
``fusion_hat`` ライブラリの ``Pin`` クラスを使用してGPIOピンを制御し、必要に応じて ``time.sleep`` を遅延処理に利用できます。
.. code-block:: python
from fusion_hat.pin import Pin, Mode, Pull
from time import sleep # Import sleep for delay
2. **リードスイッチの初期化**
リードスイッチはGPIO17に入力として設定し、スイッチが開いているときでも安定したLOW状態になるようプルダウン抵抗を使用します。
.. code-block:: python
# Initialize reed switch (Button) on GPIO pin 17
reed = Pin(17, mode=Mode.IN, pull=Pull.DOWN)
3. **LEDの初期化**
2つのLEDをGPIO22とGPIO27に出力として設定し、状態表示用として使用します。
.. code-block:: python
# Initialize LED1 connected to GPIO pin 22
led1 = Pin(22,mode=Mode.OUT)
# Initialize LED2 connected to GPIO pin 27
led2 = Pin(27,mode=Mode.OUT)
4. **メイン監視ループ**
``while True`` ループでリードスイッチの状態を継続的に監視し、それに応じてLEDの状態を切り替えます。これにより、磁場の有無を視覚的に確認できます。
.. code-block:: python
while True:
if reed.value() == 0: # Check if the reed switch is activated
led1.off() # Turn off LED1
led2.on() # Turn on LED2
else: # If the sensor is not activated
led1.on() # Turn on LED1
led2.off() # Turn off LED2
5. **キーボード割り込み処理**
``try-except`` ブロックにより、 ``Ctrl+C`` による割り込み時にもプログラムを安全に終了できます。
.. code-block:: python
except KeyboardInterrupt:
# Handle a keyboard interrupt (Ctrl+C) for a clean exit from the loop
pass
----------------------------------------------
**トラブルシューティング**
1. **リードスイッチが磁石を検出しない**
- **原因**: 磁石の向き、磁力不足、または配線の問題。
- **対処方法**: 磁石の向きを変えてみる、より強い磁石を使用する、またはすべての配線を確認してください。
2. **LEDが点灯しない**
- **原因**: GPIOピンの設定ミス、LEDの極性逆接続、または電流不足。
- **対処方法**: ピン番号が正しいか確認し、LEDの極性(アノードがGPIO側)を確認し、適切な抵抗値を使用してください。
3. **読み取りが不安定**
- **原因**: 電気ノイズや、リードスイッチが開いているときの入力の浮き。
- **対処方法**: 内蔵プルダウン抵抗で通常は安定しますが、確実なGND接続を確認し、近くに電磁ノイズ源がないか確認してください。
----------------------------------------------
**拡張アイデア**
1. **セキュリティシステム**
磁石がリードスイッチから離れたときに警報を鳴らす簡易ドア/窓セキュリティシステムを作成できます。
.. code-block:: python
# Add a buzzer for audible alarm
from fusion_hat import Buzzer, PWM
buzzer = Buzzer(PWM('P0'))
while True:
if reed.value() == 1: # Door opened (magnet moved away)
buzzer.play('C6', 0.5) # Sound alarm
led1.on() # Red alert LED
else:
led2.on() # Green safe LED
sleep(0.1)
2. **位置カウンター**
磁石がリードスイッチの前を通過した回数を数えることで、回転速度測定などに利用できます。
.. code-block:: python
counter = 0
last_state = 0
while True:
current_state = reed.value()
if last_state == 0 and current_state == 1: # Detect rising edge
counter += 1
print(f"Count: {counter}")
last_state = current_state
sleep(0.01) # Short delay for debouncing
3. **2センサー検出**
2つのリードスイッチを使用して移動方向を検出できます。
.. code-block:: python
reed1 = Pin(17, Pin.IN, pull=Pin.PULL_DOWN)
reed2 = Pin(18, Pin.IN, pull=Pin.PULL_DOWN)
# Determine direction based on which sensor triggers first
----------------------------------------------
**まとめ**
このプロジェクトでは、リードスイッチを磁場センサーとして使用し、LEDインジケーターを制御する方法を学びました。リードスイッチは信頼性が高くシンプルな部品であり、セキュリティシステム、位置検出、近接検知など多くの用途で広く利用されています。磁気検出と視覚的フィードバックを組み合わせることで、さまざまなアプリケーション向けの直感的な監視システムを構築できます。