Python GPIO ボタン 入力 方法を配線から学ぶ

0
16
Python GPIO ボタン 入力 方法を配線から学ぶ

ボタンを押したらLEDが点灯する。たったそれだけの動作でも、画面の中だけだったPythonプログラムが、手で触れられる作品につながる最初の一歩になります。ここでは Python GPIO ボタン 入力 方法として、Raspberry Piにタクトスイッチをつなぎ、押された状態をPythonで読むための配線、コード、つまずきやすい点を順番に確認します。

Raspberry PiのGPIOは電子工作に便利ですが、5Vを誤って入力すると故障につながる場合があります。まずは3.3V系の基本を守り、部品を少なくした安全な回路から始めましょう。LED、ブザー、サーボモーター、レーザーカットしたケースに組み込む操作パネルなど、次の工作へ応用できる土台になります。

用意するもの

今回使うのは、Raspberry Pi本体、GPIOピンに接続できるブレッドボード、ジャンパーワイヤー、タクトスイッチ1個です。タクトスイッチは、押している間だけ導通する小さなボタンです。4本足の製品が多いですが、同じ側に並ぶ2本ずつは内部でつながっています。

Raspberry Pi OSが動作し、Python 3を使える状態にしておいてください。GPIOを扱うライブラリには複数の選択肢がありますが、初めてなら記述が読みやすい`gpiozero`がおすすめです。最近のRaspberry Pi OSでは利用できることが多く、入っていなければターミナルで次を実行します。

sudo apt update
sudo apt install python3-gpiozero

作業前にはRaspberry Piの電源を落とし、USB電源ケーブルも外します。通電したまま配線を差し替えると、意図しないショートや誤接続に気付きにくくなります。電子工作は急がず、「電源を切る、配線する、確認してから電源を入れる」を習慣にすると安心です。

Python GPIO ボタン入力の配線

ここではGPIO17を入力に使います。GPIO17は、40ピンヘッダーの物理ピン番号では11番ピンです。GPIO番号と物理ピン番号は別物なので注意してください。Pythonのライブラリや作例では、GPIO17のようなGPIO番号で説明されることがよくあります。

タクトスイッチの片側をGPIO17へ、反対側をGNDへ接続します。GNDは物理ピン番号6番を使うと分かりやすいでしょう。この回路では、ボタンを押すとGPIO17がGNDにつながり、入力がLOWになります。

Raspberry Pi GPIO17(物理11番) ── タクトスイッチ ── GND(物理6番)

4本足のタクトスイッチは向きが少し分かりにくい部品です。ブレッドボード中央の溝をまたぐように差すと、左右の端子を別々に扱いやすくなります。同じ側の端子同士を使ってしまうと、ボタンを押しても状態が変わりません。テスターがあれば、押す前と押した後の導通を測ると構造を確かめられます。

この配線では抵抗を1本も使っていません。理由は、Raspberry PiのGPIOにある内部プルアップ抵抗を利用するためです。ボタンを押していないときはGPIOを内部的に3.3V側へ引き上げ、押したときだけGND側へ落とします。入力ピンの電圧が宙に浮く「浮遊状態」を避けられるため、読み値が安定します。

なお、GPIO17に5Vピンを直接つなぐのは避けてください。Raspberry Piの一般的なGPIO入力は3.3V系です。ボタン入力では5Vを使う必要はありません。

最小のコードで押した状態を読む

まずは、押している間だけメッセージを表示するプログラムを書きます。ホームディレクトリなどに`button_test.py`という名前で保存してください。

from gpiozero import Button
from signal import pause

button = Button(17)

def pressed():
    print("ボタンが押されました")

def released():
    print("ボタンが離されました")

button.when_pressed = pressed
button.when_released = released

pause()

ターミナルで次のように実行します。

python3 button_test.py

ボタンを押すと「ボタンが押されました」、離すと「ボタンが離されました」と表示されれば成功です。終了するときは`Ctrl + C`を押します。

`Button(17)`はGPIO17をボタン入力として準備する指定です。gpiozeroの`Button`は初期設定で内部プルアップを使うため、先ほどの「GPIOとGNDの間にボタンを置く」配線とそのまま組み合わせられます。押下時にLOWになるという電気的な細部を、コード側で強く意識せずに扱えるのが利点です。

一方で、既存の回路が外部プルダウン抵抗を使い、押したときに3.3Vになる設計なら、`Button(17, pull_up=False)`のように設定を変える必要があります。配線とプログラムの前提が一致しているかを確認しましょう。

ループで状態を表示する方法

イベント処理は「押された瞬間」に動作を始める用途に向いています。対して、ボタンが押されている間だけモーターを動かす、画面に現在の状態を表示し続けるといった用途では、一定間隔で状態を読む方法も役立ちます。

from gpiozero import Button
from time import sleep

button = Button(17)

while True:
    if button.is_pressed:
        print("押されています")
    else:
        print("離されています")
    sleep(0.1)

`button.is_pressed`は、現在ボタンが押されているかどうかを`True`または`False`で返します。`sleep(0.1)`を入れないと、非常に速い周期で表示が繰り返され、ターミナルが読みにくくなります。0.1秒程度なら、手で操作するボタンでは十分に自然な反応です。

ただし、ループ内で長い処理をすると、その間はボタンの状態確認が遅れます。写真撮影、ファイル保存、ネットワーク通信のように時間がかかる処理を行う場合は、イベント処理を使うか、処理の設計を分ける方法を検討してください。

チャタリングを抑えて1回だけ反応させる

実際のボタンは、押した瞬間にきれいに1回だけONになるとは限りません。金属接点が細かく振動し、ごく短時間にONとOFFを何度も繰り返すことがあります。これをチャタリングと呼びます。カウンターが一度押しただけで2つ、3つ増えるときは、まずチャタリングを疑いましょう。

gpiozeroでは`bounce_time`を指定することで、短時間の連続した変化を無視できます。

from gpiozero import Button
from signal import pause

button = Button(17, bounce_time=0.05)
count = 0

def add_count():
    global count
    count += 1
    print(f"回数: {count}")

button.when_pressed = add_count
pause()

`bounce_time=0.05`は、反応後の約0.05秒間を無視する設定です。値は部品や用途で変わります。一般的なタクトスイッチなら0.02秒から0.1秒程度を試すとよいでしょう。長すぎる値にすると素早い連打を拾えなくなるため、「誤動作しない最小値」を実機で探すのがポイントです。

電子回路側でコンデンサーや専用ICを使ってチャタリングを抑える方法もあります。しかし、学習用の小さな作品ではまずソフトウェア処理で仕組みを理解し、必要になったら回路の工夫へ進むと段階的に学べます。

LEDをつないで、押す操作を作品にする

画面に文字が出るだけでも動作確認にはなりますが、LEDを加えると入力と出力の関係を目で見て理解できます。GPIO27にLEDの長い足側を、短い足側を220Ωから1kΩ程度の抵抗を通してGNDへ接続します。LEDには向きがあるため、足の長さや本体の平らな面を確認してください。

from gpiozero import Button, LED
from signal import pause

button = Button(17, bounce_time=0.05)
led = LED(27)

button.when_pressed = led.on
button.when_released = led.off

pause()

これで、ボタンを押している間だけLEDが点灯します。次は「1回押すごとに点灯と消灯を切り替える」「3秒以上押したら別の動作をする」といった仕様に変えてみましょう。プログラムを少し変えるだけで、照明スイッチ、クイズ用の早押しボタン、デジタル工作の操作部へ近づいていきます。

ケースを作るなら、ボタンの直径をノギスで測り、CADで穴の寸法を設計してから3Dプリンターやレーザーカッターで加工するのもおすすめです。コード、回路、形を一つの作品として考えると、使いやすさや見た目を改善する楽しさが増します。

動かないときは配線から確認する

ボタン入力で多い原因は、コードよりも配線です。まずGPIO17とGNDにつながっているか、物理ピン番号11とGPIO番号17を取り違えていないかを見直します。GNDではなく3.3Vや5Vへ誤って接続していないかも、必ず電源を切って確認してください。

次に、タクトスイッチの端子の選び方を確かめます。ボタンを押さなくても常に「押されました」と表示されるなら、同じ側の端子を使っているか、GPIOとGNDがどこかで短絡している可能性があります。反対にまったく反応しない場合は、ブレッドボードの列を1つずらしている、ジャンパーワイヤーが奥まで刺さっていない、といった物理的な原因もよくあります。

ライブラリの指定ピンも確認します。今回なら`Button(17)`です。物理ピン11番をそのまま`Button(11)`と書くと、GPIO11を指定したことになり、意図した場所を読めません。番号の種類をメモや配線図に書いておくと、後から作品を修理するときにも役立ちます。

ボタンは小さな部品ですが、入力、プルアップ、イベント、ノイズ対策という電子工作の大事な考え方が詰まっています。まずはLEDを押して光らせ、次は自分で作った箱やパネルにボタンを取り付けてみましょう。手で押す操作に自分のプログラムが応えた瞬間から、アイデアは画面の外で動き始めます。