.. include:: /index.rst :start-after: start_hello_message :end-before: end_hello_message .. _py_touch: 2.5 タッチスイッチモジュール ================================ **はじめに** このプロジェクトでは、タッチスイッチモジュールの使用方法を学びます。このコンポーネントは従来の機械式スイッチの代わりとなるもので、高い操作精度、優れたタッチ感度、そして機械的摩耗がほとんどないという利点があります。タッチスイッチは、信頼性と操作性が求められる現代の家電製品や電子機器で広く使用されています。 ---------------------------------------------- **必要なもの** このプロジェクトを行うには、以下のコンポーネントが必要です。 .. 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_touch_switch` - |link_touch_buy| * - :ref:`cpn_fusion_hat` - \- * - Raspberry Pi - \- ---------------------------------------------- **回路図** 以下は、タッチスイッチモジュールをRaspberry PiおよびLEDに接続するための回路図です。 .. image:: img/fzz/2.1.3_sch.png :width: 100% :align: center ------------------------------------ **配線図** 以下の手順に従って回路を組み立ててください。 1. タッチスイッチモジュールの出力ピンをGPIO17に接続します。 2. LED1のアノードを抵抗を介してGPIO22に接続し、LED2のアノードを抵抗を介してGPIO27に接続します。 3. 2つのLEDのカソードとタッチスイッチのGNDピンをGNDに接続します。 .. image:: img/fzz/2.1.3_bb.png :width: 80% :align: center ---------------------------------------------- **サンプルの実行** このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。 以下の手順に従ってサンプルを実行してください。 .. raw:: html .. code-block:: shell cd ~/ai-lab-kit/python/ sudo python3 2.5_TouchSwitch.py このPythonスクリプトは、タッチセンサーを使用してRaspberry Piに接続された2つのLEDを制御します。実行すると、次のように動作します。 1. **タッチセンサーが押されたとき**: - コンソールに "You touch it!" と表示されます。 - 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 for delay # Initialize touch sensor (Button) on GPIO pin 17 touch_sensor = 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 touch sensor and control LEDs accordingly while True: if touch_sensor.value() == 1: # Check if the touch sensor is pressed print('You touch it!') # Output message indicating sensor activation led1.off() # Turn off LED1 led2.on() # Turn on LED2 else: # If the sensor is not pressed led1.on() # Turn on LED1 led2.off() # Turn off LED2 sleep(0.5) # Pause for 0.5 seconds before rechecking the sensor state except KeyboardInterrupt: # Handle a keyboard interrupt (Ctrl+C) for a clean exit from the loop pass ---------------------------------------------- **コードの解説** 1. **ライブラリのインポート** ``fusion_hat`` ライブラリはGPIO制御を簡単にするために使用され、 ``sleep`` 関数は待機時間を設定するために使用されます。 .. code-block:: python from fusion_hat.pin import Pin, Mode, Pull from time import sleep # Import sleep for delay 2. **コンポーネントの初期化** タッチセンサーをGPIO17の入力として設定し、GPIO22とGPIO27に接続された2つのLEDを初期化します。 .. code-block:: python # Initialize touch sensor (Button) on GPIO pin 17 touch_sensor = 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. **メインループ** プログラムはタッチスイッチモジュールの状態を継続的に監視します。タッチされた場合はLED2が点灯しLED1が消灯し、それ以外の場合はLED1が点灯しLED2が消灯します。 .. code-block:: python while True: if touch_sensor.value() == 1: led1.off() led2.on() else: led1.on() led2.off() sleep(0.5) 4. **割り込み処理** ``try-except`` ブロックにより、キーボード割り込み(Ctrl+C)が発生した場合でもプログラムを安全に終了できます。 .. code-block:: python except KeyboardInterrupt: pass ---------------------------------------------- **トラブルシューティング** 1. **タッチセンサーが反応しない** - **原因**: 配線ミスまたはGPIOピン設定の誤り。 - **対処方法**: タッチセンサーがGPIO17とGNDに正しく接続されていることを確認し、 ``PULL_DOWN`` 設定がセンサーの動作モードと一致していることを確認してください。 2. **センサーが常に押された状態または未押下状態になる** - **原因**: センサーの故障または配線不良。 - **対処方法**: マルチメーターでセンサーをテストするか、センサーを交換してください。また、接続が緩んでいないか確認してください。 3. **LEDがちらつく、または不安定に動作する** - **原因**: 入力信号のチャタリング。 - **対処方法**: ソフトウェアデバウンスを追加して信号を安定させます。 .. code-block:: python if touch_sensor.value() == 1: sleep(0.05) # Debounce delay ---------------------------------------------- **拡張アイデア** 1. **タッチ時間の検出** タッチセンサーが押されている時間を測定し、それに応じてLEDの動作を変更できます。 .. code-block:: python from time import time start_time = None def handle_touch(): global start_time if touch_sensor.value() == 1: start_time = time() else: duration = time() - start_time print(f"Sensor was touched for {duration:.2f} seconds") 2. **可変ディレイ** 遅延時間を動的に変更できるようにして、応答性を細かく調整します。 .. code-block:: python delay = float(input("Enter delay in seconds: ")) sleep(delay) ---------------------------------------------- **まとめ** このプロジェクトでは、Fusion HAT+とタッチスイッチモジュールを使用してLEDを制御する方法を学びました。タッチスイッチは信頼性が高く、直感的な操作を実現できるため、現代の電子機器やユーザーインターフェースで広く利用されています。