注釈

こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。

参加する理由

  • 専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。

  • 学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。

  • 限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。

  • 特別割引: 最新製品を特別割引でお楽しみいただけます。

  • 季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。

👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!

2.1 ボタン

はじめに

このプロジェクトでは、ボタンを使ってLEDを制御する方法を学びます。ボタンは、さまざまな電子工作プロジェクトにおいて、回路やシステムとやり取りするための基本的な入力デバイスです。


必要なもの

このプロジェクトを行うには、以下のコンポーネントが必要です。

COMPONENT

PURCHASE LINK

ブレッドボード

購入

ジャンパーワイヤー

購入

抵抗器

購入

LED

購入

ボタン

購入

Fusion HAT+

-

Raspberry Pi

-


回路図

このプロジェクトでは、ノーマルオープン型のボタンをRaspberry Piの入力として使用します。ボタンが押されると、GPIO17はハイレベル信号(3.3V)を受け取ります。Raspberry Piはこの信号を検出し、LEDを点灯させます。回路の接続は以下の図のとおりです。

../_images/2.1.1_sch.png

配線図

以下の手順に従って回路を組み立ててください。

  1. LEDのアノード(長い脚)を、電流制限用抵抗を介してGPIOピン(GPIO22)に接続します。

  2. LEDのカソード(短い脚)をGNDに接続します。

  3. ボタンの一方の端子をGPIO17に、もう一方の端子をGNDに接続します。

../_images/2.1.1_bb.png

サンプルの実行

このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。 以下の手順でサンプルを実行してください。

cd ~/ai-lab-kit/python/
sudo python3 2.1_Button.py

このPythonスクリプトは、ボタンでLEDを制御するインタラクティブな構成を示しています。実行すると、次のように動作します。

  1. ボタン(GPIO17に接続)を押すと、LED(GPIO22に接続)が点灯します。

  2. ボタンを離すと、LEDが消灯します。

  3. プログラムは継続的に動作し、ボタンの押下および解放イベントを監視してLEDを制御します。


コード

以下のPythonコードは、ボタンの押下と解放に応じてLEDを切り替えます。

#!/usr/bin/env python3
from fusion_hat.pin import Pin, Mode, Pull
from signal import pause  # Import pause function from signal module

# Initialize an LED object on GPIO pin 22
led = Pin(22,mode=Mode.OUT)
# Initialize a Button object on GPIO pin 17
button = Pin(17, mode=Mode.IN, pull=Pull.DOWN)

# # Link the button's "when_activated" event to the LED's high() method
button.when_activated = led.high

# # Link the button's "when_deactivated" event to the LED's low() method
button.when_deactivated = led.low

# Run an event loop that waits for button events and keeps the script running
print("CTRL + C to exit")
pause()

コードの解説

  1. ライブラリのインポート

    fusion_hat ライブラリはGPIO制御のためのシンプルなインターフェースを提供し、 signal モジュールはプログラムを継続実行させるために使用します。

    #!/usr/bin/env python3
    from fusion_hat.pin import Pin, Mode, Pull
    from signal import pause  # Import pause function from signal module
    
  2. コンポーネントの初期化

    LEDはGPIO22に接続し、ボタンはGPIO17に接続します。

    # Initialize an LED object on GPIO pin 22
    led = Pin(22,mode=Mode.OUT)
    # Initialize a Button object on GPIO pin 17
    button = Pin(17, mode=Mode.IN, pull=Pull.DOWN)
    
  3. イベント処理

    when_activatedwhen_deactivated のイベントを、それぞれLEDの high() メソッドと low() メソッドに関連付けます。これにより、ボタンを押すとLEDが点灯し、ボタンを離すと消灯します。

    button.when_activated = led.high
    button.when_deactivated = led.low
    
  4. イベントループ

    pause() 関数によりプログラムを継続実行し、ボタンの押下および解放イベントを待機します。

    pause()
    

トラブルシューティング

  1. LEDが点灯しない

    • 原因: GPIOピンの接続ミス、またはLEDの配線に問題がある可能性があります。

    • 対処方法: LEDのプラス側の脚がGPIO22に接続され、マイナス側の脚が抵抗を介してGNDに接続されていることを確認してください。

  2. ボタンを押しても反応しない

    • 原因: ボタンの配線、またはGPIOピンの設定が正しくない可能性があります。

    • 対処方法: ボタンがGPIO17とGNDに正しく接続されていることを確認してください。

  3. ボタンの状態に関係なくLEDが点灯したまま、または消灯したままになる

    • 原因: ボタンのイベントが正しく検出されていない可能性があります。

    • 対処方法: マルチメーターや簡単な回路を使って、ボタン自体が正常に動作しているか確認してください。


拡張アイデア

  1. LEDの状態をトグルする

    ボタンを押すたびにLEDを単純に点灯・消灯するのではなく、状態を切り替えるようにスクリプトを変更できます。

    def toggle():
       if led.value() == 1:
          led.off()
       else:
          led.on()
    
    button.when_activated = toggle
    
  2. 複数のLED

    1つのボタンで複数のLEDを制御し、異なる点灯パターンを切り替えることができます。

    leds = [LED(17), LED(27), LED(22)]
    current_led = 0
    
    def cycle_leds():
       global current_led
       leds[current_led].off()
       current_led = (current_led + 1) % len(leds)
       leds[current_led].on()
    
    button.when_activated = cycle_leds
    
  3. ボタンの押下時間

    ボタンを押している時間の長さに応じて、異なる動作を行う機能を追加できます。

    from time import time
    
    press_time = None
    
    def start_timer():
       global press_time
       press_time = time()
    
    def check_duration():
       global press_time
       duration = time() - press_time
       if duration < 2:
          led.on()
       else:
          led.off()
    
    button.when_activated = start_timer
    button.when_deactivated = check_duration
    
  4. デバウンス処理

    より正確にボタン押下を検出するために、ソフトウェアデバウンスを実装できます。

    from time import time
    
    press_time = None
    debounce_time = 0.2
    
    def press():
       global press_time
       press_time = time()
    
    def debounce():
       global press_time
       current_time = time()
       duration = current_time - press_time
       if duration < debounce_time:
          return
       else:
          led.on()
    
    button.when_activated = press
    button.when_deactivated = debounce
    

まとめ

このプロジェクトでは、Fusion HAT+を使ってボタンでLEDを制御する方法を紹介しました。ボタンは汎用性の高いコンポーネントであり、基本的な回路から複雑なインタラクティブシステムまで、さまざまなアプリケーションに活用できます。