.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_slide:
2.3 スライドスイッチ
==============================================
**はじめに**
このプロジェクトでは、スライドスイッチを使用して2つのLEDを制御する方法を学びます。スライドスイッチは電子回路において電源スイッチとしてよく使用される部品です。本チュートリアルでは、ブレッドボード上でその動作を確認します。通常、スライドスイッチは安定した接続のためにPCBへはんだ付けして使用されますが、ここでは動作原理を理解しやすくするため、ブレッドボードを用いた柔軟な構成で実験します。
----------------------------------------------
**必要なもの**
このプロジェクトを行うには、以下のコンポーネントを用意してください。
.. 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_slide_switch`
- |link_slide_switch_buy|
* - :ref:`cpn_capacitor`
- |link_capacitor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
スライドスイッチの中央ピンをGPIO17に接続し、2つのLEDをそれぞれGPIO22とGPIO27に接続します。スイッチを切り替えることで、2つのLEDが交互に点灯します。
.. image:: img/fzz/2.1.4_sch.png
:width: 80%
:align: center
----------------------------------------------
**配線図**
以下の手順に従って回路を組み立ててください。
1. スライドスイッチの中央ピンをGPIO17に接続します。
2. スライドスイッチの片側のピンをGNDに、もう一方をVCCに接続します。
3. LED1のアノードを電流制限抵抗を介してGPIO22に接続します。
4. LED2のアノードを電流制限抵抗を介してGPIO27に接続します。
5. 2つのLEDのカソードをGNDに接続します。
.. image:: img/fzz/2.1.4_bb.png
:width: 80%
:align: center
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに含まれています。
以下の手順でサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 2.3_SlideSwitch.py
このPythonスクリプトは、Fusion HAT+上でスライドスイッチを使用して2つのLEDを制御する方法を示します。実行すると、次のように動作します。
1. **スライドスイッチがONのとき**:
- LED1(GPIO22に接続)が消灯します。
- LED2(GPIO27に接続)が点灯します。
2. **スライドスイッチがOFFのとき**:
- LED1が点灯します。
- LED2が消灯します。
3. プログラムは0.5秒ごとにスライドスイッチの状態を確認し、それに応じてLEDの状態を更新します。
4. ``Ctrl+C`` を押して中断するまで、スクリプトは継続して実行されます。
----------------------------------------------
**コード**
以下は、スライドスイッチの状態に応じてLEDを制御するPythonコードです。
.. 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 slider (Button) on GPIO pin 17
slider = 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 slider and control LEDs accordingly
while True:
if slider.value() == 1: # Check if the slider is pressed
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. **ライブラリのインポート**
GPIO制御および待機処理のために必要なライブラリをインポートします。
.. code-block:: python
from fusion_hat.pin import Pin, Mode, Pull
from time import sleep # Import sleep for delay
2. **コンポーネントの初期化**
スライドスイッチをボタン入力として設定し、GPIO22とGPIO27に接続された2つのLEDを初期化します。
.. code-block:: python
# Initialize slider (Button) on GPIO pin 17
slider = 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. **状態監視とLED制御**
メインループ内でスライドスイッチの状態を監視し、スイッチの状態に応じてLED1とLED2を交互に点灯させます。
.. code-block:: python
# Continuously monitor the state of the slider and control LEDs accordingly
while True:
if slider.value() == 1: # Check if the slider is pressed
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
4. **安全な終了処理**
``Ctrl+C`` によって中断された場合でも、スクリプトが安全に終了するようにします。
.. code-block:: python
except KeyboardInterrupt:
pass
----------------------------------------------
**トラブルシューティング**
1. **スライドスイッチが反応しない**
- **原因**: スライドスイッチの接続が正しくない、またはプルアップ/プルダウン設定が誤っている可能性があります。
- **対処方法**: スライドスイッチがGPIO17およびGNDに正しく接続されていることを確認してください。また ``PULL_DOWN`` 設定がスイッチの構成に合っているか確認してください。
2. **LEDがちらつく、または不安定に動作する**
- **原因**: スライドスイッチのチャタリングが発生している可能性があります。
- **対処方法**: 入力信号を安定させるためにソフトウェアデバウンスを追加します。
.. code-block:: python
if slider.value() == 1:
sleep(0.05) # Debounce delay
----------------------------------------------
**拡張アイデア**
1. **双方向スイッチ制御**
2つのスライドスイッチを組み合わせて、より複雑なLED制御(簡単な照明コントロールパネルなど)を作ることができます。
2. **音によるフィードバック**
スライドスイッチがONになったときにブザーを鳴らすようにできます。
.. code-block:: python
from fusion_hat import Buzzer
buzzer = Buzzer(Pin(22))
if slider.value() == 1:
buzzer.on()
else:
buzzer.off()
----------------------------------------------
**まとめ**
このプロジェクトでは、Fusion HAT+とスライドスイッチを使用してLEDを制御する方法を学びました。スライドスイッチは耐久性が高く、ユーザーインターフェースや制御システムなどで広く利用されています。実際に試してみることで、より高度でインタラクティブなプロジェクトへ発展させることができます。