注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 Enthusiast Community on Facebookへようこそ!他の愛好家と一緒に、Raspberry Pi、Arduino、ESP32の世界により深く入り込みましょう。
参加する理由
専門家サポート: 購入後の問題や技術的な課題を、コミュニティと私たちのチームの助けを借りて解決します。
学習と共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。
限定プレビュー: 新製品の発表や先行プレビューに早期アクセスできます。
特別割引: 最新製品を特別割引でお楽しみいただけます。
季節限定キャンペーンとプレゼント: プレゼント企画やホリデーキャンペーンに参加しましょう。
👉 一緒に発見し、創造する準備はできましたか? [こちら] をクリックして、今すぐ参加しましょう!
2.1 ボタン
はじめに
このプロジェクトでは、ボタンを使ってLEDを制御する方法を学びます。ボタンは、さまざまな電子工作プロジェクトにおいて、回路やシステムとやり取りするための基本的な入力デバイスです。
必要なもの
このプロジェクトを行うには、以下のコンポーネントが必要です。
COMPONENT |
PURCHASE LINK |
|---|---|
- |
|
Raspberry Pi |
- |
回路図
このプロジェクトでは、ノーマルオープン型のボタンをRaspberry Piの入力として使用します。ボタンが押されると、GPIO17はハイレベル信号(3.3V)を受け取ります。Raspberry Piはこの信号を検出し、LEDを点灯させます。回路の接続は以下の図のとおりです。
配線図
以下の手順に従って回路を組み立ててください。
LEDのアノード(長い脚)を、電流制限用抵抗を介してGPIOピン(GPIO22)に接続します。
LEDのカソード(短い脚)をGNDに接続します。
ボタンの一方の端子をGPIO17に、もう一方の端子をGNDに接続します。
サンプルの実行
このチュートリアルで使用するすべてのサンプルコードは ai-lab-kit ディレクトリに含まれています。
以下の手順でサンプルを実行してください。
cd ~/ai-lab-kit/python/
sudo python3 2.1_Button.py
このPythonスクリプトは、ボタンでLEDを制御するインタラクティブな構成を示しています。実行すると、次のように動作します。
ボタン(GPIO17に接続)を押すと、LED(GPIO22に接続)が点灯します。
ボタンを離すと、LEDが消灯します。
プログラムは継続的に動作し、ボタンの押下および解放イベントを監視して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()
コードの解説
ライブラリのインポート
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
コンポーネントの初期化
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)
イベント処理
when_activatedとwhen_deactivatedのイベントを、それぞれLEDのhigh()メソッドとlow()メソッドに関連付けます。これにより、ボタンを押すとLEDが点灯し、ボタンを離すと消灯します。button.when_activated = led.high button.when_deactivated = led.low
イベントループ
pause()関数によりプログラムを継続実行し、ボタンの押下および解放イベントを待機します。pause()
トラブルシューティング
LEDが点灯しない
原因: GPIOピンの接続ミス、またはLEDの配線に問題がある可能性があります。
対処方法: LEDのプラス側の脚がGPIO22に接続され、マイナス側の脚が抵抗を介してGNDに接続されていることを確認してください。
ボタンを押しても反応しない
原因: ボタンの配線、またはGPIOピンの設定が正しくない可能性があります。
対処方法: ボタンがGPIO17とGNDに正しく接続されていることを確認してください。
ボタンの状態に関係なくLEDが点灯したまま、または消灯したままになる
原因: ボタンのイベントが正しく検出されていない可能性があります。
対処方法: マルチメーターや簡単な回路を使って、ボタン自体が正常に動作しているか確認してください。
拡張アイデア
LEDの状態をトグルする
ボタンを押すたびにLEDを単純に点灯・消灯するのではなく、状態を切り替えるようにスクリプトを変更できます。
def toggle(): if led.value() == 1: led.off() else: led.on() button.when_activated = toggle
複数の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
ボタンの押下時間
ボタンを押している時間の長さに応じて、異なる動作を行う機能を追加できます。
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
デバウンス処理
より正確にボタン押下を検出するために、ソフトウェアデバウンスを実装できます。
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を制御する方法を紹介しました。ボタンは汎用性の高いコンポーネントであり、基本的な回路から複雑なインタラクティブシステムまで、さまざまなアプリケーションに活用できます。