.. include:: /index.rst :start-after: start_hello_message :end-before: end_hello_message .. _py_micro_switch: 2.2 マイクロスイッチ ===================== **はじめに** このプロジェクトでは、マイクロスイッチを使って2つのLEDを制御する方法を学びます。マイクロスイッチは、わずかな押し込みで動作する高感度な部品です。安全でない状態で機械やドアが動作しないようにするため、安全システムなどでよく使用されます。 ---------------------------------------------- **必要なもの** このプロジェクトを行うには、以下のコンポーネントが必要です。 .. list-table:: :widths: 30 20 :header-rows: 1 * - COMPONENT - PURCHASE LINK * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_led` - |link_led_buy| * - :ref:`cpn_micro_switch` - \- * - :ref:`cpn_capacitor` - |link_capacitor_buy| * - :ref:`cpn_fusion_hat` - \- * - Raspberry Pi - \- ---------------------------------------------- **回路図** マイクロスイッチはGPIO17に接続し、2つのLEDはGPIO22とGPIO27に接続します。マイクロスイッチを押すと赤色LEDが点灯し、離すと黄色LEDが点灯します。 .. image:: img/fzz/2.1.2_sch.png :width: 80% :align: center ---------------------------------------------- **配線図** 以下の手順に従って回路を組み立ててください。 1. マイクロスイッチの一方の端子をGPIO17に、もう一方をGNDに接続します。 2. 2つのLEDのアノードを、電流制限用抵抗を介してGPIO22(黄色)およびGPIO27(赤色)に接続します。 3. 両方のLEDのカソードをGNDに接続します。 .. image:: img/fzz/2.1.2_bb.png :width: 80% :align: center ---------------------------------------------- **サンプルの実行** このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。 以下の手順でサンプルを実行してください。 .. raw:: html .. code-block:: shell cd ~/ai-lab-kit/python/ sudo python3 2.2_MicroSwitch.py このPythonスクリプトは、Raspberry Piに接続されたマイクロスイッチの状態に応じて2つのLEDを制御します。実行すると、次のように動作します。 1. **マイクロスイッチが押されたとき**: - LED1(GPIO22に接続)が点灯します。 - LED2(GPIO27に接続)が消灯します。 2. **マイクロスイッチが離されたとき**: - LED1が消灯します。 - LED2が点灯します。 3. プログラムは0.5秒ごとにマイクロスイッチの状態を継続的に確認し、それに応じてLEDを切り替えます。 4. このスクリプトは ``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 function for delays # Initialize micro switch on GPIO pin 17 micro_switch = 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 check the state of the micro switch and control LEDs accordingly while True: if micro_switch.value() == 1: # If the micro switch is pressed led1.high() # Turn on LED1 led2.low() # Turn off LED2 else: # If the micro switch is not pressed led1.low() # Turn off LED1 led2.high() # Turn on LED2 sleep(0.5) # Pause for 0.5 seconds before checking the switch again except KeyboardInterrupt: # Handle KeyboardInterrupt (Ctrl+C) to exit the loop gracefully pass ---------------------------------------------- **コードの解説** 1. **ライブラリのインポート** ``fusion_hat`` ライブラリはシンプルなGPIO制御機能を提供し、 ``time`` ライブラリは待機時間を設定するために使用します。 .. code-block:: python from fusion_hat.pin import Pin, Mode, Pull from time import sleep # Import sleep function for delays 2. **コンポーネントの初期化** マイクロスイッチはプルアップを無効にした状態でGPIO17に接続し、LEDはGPIO22とGPIO27に接続します。 .. code-block:: python # Initialize micro switch on GPIO pin 17 micro_switch = 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) 3. **スイッチ状態の処理** プログラムはループ内でマイクロスイッチの状態を確認します。押されるとLED1が点灯しLED2が消灯し、離されるとLED1が消灯しLED2が点灯します。 .. code-block:: python while True: if micro_switch.value() == 1: led1.on() led2.off() else: led1.off() led2.on() sleep(0.5) 4. **割り込み処理** ``try-except`` ブロックにより、Ctrl+Cで中断した場合でもスクリプトを安全に終了できます。 .. code-block:: python except KeyboardInterrupt: pass ---------------------------------------------- **トラブルシューティング** 1. **LEDが反応しない** - **原因**: GPIO配線またはピン設定が正しくない可能性があります。 - **対処方法**: LED1がGPIO22、LED2がGPIO27に接続されており、両方のLEDに適切な抵抗が入っていることを確認してください。また、マイクロスイッチがGPIO17に正しく接続されていることも確認してください。 2. **マイクロスイッチが検出されない** - **原因**: マイクロスイッチの設定が適切でない、またはプルアップ/プルダウン抵抗の設定が必要な可能性があります。 - **対処方法**: ``pull = Pin.PULL_UP`` がスイッチの構成に合っているか確認してください。プルアップが必要な場合は、初期化時に有効にしてください。 3. **LEDがちらつく、または不安定に動作する** - **原因**: ボタンのチャタリングが発生している可能性があります。 - **対処方法**: 押下を検出した後に短い遅延を追加して、ソフトウェアデバウンスを実装してください。 .. code-block:: python if micro_switch.value() == 1: sleep(0.05) # Debounce delay ---------------------------------------------- **拡張アイデア** 1. **遅延時間の調整** 遅延時間を動的に変更できるようにして、LEDの応答性を細かく調整できます。 .. code-block:: python delay = float(input("Enter delay in seconds: ")) while True: sleep(delay) 2. **音によるフィードバック** スイッチが押されたときや離されたときに、ブザーで音による通知を追加できます。 .. code-block:: python from fusion_hat import Buzzer buzzer = Buzzer(Pin(22)) if micro_switch.value() == 1: buzzer.on() else: buzzer.off() ---------------------------------------------- **まとめ** このプロジェクトでは、Fusion HAT+でマイクロスイッチを使ってLEDを制御する方法を紹介しました。マイクロスイッチは汎用性の高い部品であり、安全システム、ユーザーインターフェース、産業用制御など幅広い分野で使用されています。実際に試してみることで、より高度なプロジェクトへ発展させるためのヒントが得られるでしょう。