.. 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インジケーターを制御する方法を学びました。リードスイッチは信頼性が高くシンプルな部品であり、セキュリティシステム、位置検出、近接検知など多くの用途で広く利用されています。磁気検出と視覚的フィードバックを組み合わせることで、さまざまなアプリケーション向けの直感的な監視システムを構築できます。