4本足、2本足のスイッチ・ボタンを使う
スイッチ・ボタンを使うと、ボタンを押した時に何かする(例えばLEDを点灯したり、写真をとる)プログラムが書けるようになります。また、普通にボタンを押すときと長押ししたときで別々のことをする(例えば普通に押したら写真撮影で、長押ししたら動画撮影)、ということもできます。
ここでは、スイッチ・ボタンに4本足か2本足がついているものを使います。4本足のものは、大抵以下のような形状をしています。もし手元に電子工作キットがあれば、それに含まれているかもしれません。小さいものだと底面部分が6 mm x 6 mmで、1cm x 1cmのサイズのものもあります。もっと大きいものもあるかもしれません。また、指で押すボタン部分の形や色には色々なバリエーションがあります。丸いもの、四角いもの、黒、黄色、赤などなど。
2本足のものは、例えばこんな形状をしています。4本足のもの同様に、大きさ、形、色にはいろいろなバリエーションがあります。
4本足、2本足問わず、こういう部品は英語で「tactile switch button」と呼ばれています。購入するときにこれをキーワードにして検索するとたくさん見つかるはずです。例えば、以下のようなものがあります。
接続
4本足、2本足とも、動作原理は同じで、プログラミングのしかたも同じです。まずは4本足のものを説明します。
ボタンに4本足がついていても、実際に使うのはそのうち2本だけです。以下の写真で、Aの足とDの足は同じ役割を果たすことになっており、BとCも同じ役割です。ですので、電気回路を作るときには、A、Dのどちらか1つと、B、Cどちらか1つを使います。
ボタン内部の配線は写真右のようになっています。AとDはつながっていて、BとCもつながっています。つまり、AとDの間には電気が通り、BとCの間にも電気が通る状態です。ただし、A-D側とB-C側は切断されていて電気は流れません。ボタンを押したときだけA-D側とB-C側がつながって電気が流れます。
電気回路を作るときには、A、Dどちらかから電気をボタンへ流し入れ、B、Cどちらかから電気を出すようにします。そして、ボタンが押されているかどうかは、以下のように判断します。
- 電気が流れていないときはボタンが押されていない
- 電気が流れたらボタンが押されている
なお、このスイッチ・ボタンには、電気的な「向き」はありません。A-D側から電気を流し入れても、B-C側から流し入れても構いません。
2本足のスイッチ・ボタンは、AとDを1つの足にまとめ、BとCを1つの足にまとめたものです。これにも「向き」はないので、どちらの足から電気を入れても構いません。
プログラミング
ここでは、ボタンの片側の足をGPIOの5番を接続し、別の側の足をGNDに接続してください。
4本足のスイッチ・ボタンではなく2本足のものを使う場合には、1本をGPIO 5に、もう1本をGNDにつないで下さい。以下で説明するプログラムは、4本足、2本足どちらのスイッチ・ボタンでも(変更せずにそのまま)使えます。
ボタンが押されたか、押されていないかを判定するプログラムがbutton-on-off.pyです。ボタンを使う場合には、まずプログラムの先頭部分で以下のようにします。
from gpiozero import Button
そして、以下のようにしてボタンを使う準備をします。ここで数字の「5」は、ボタンへ電気を流すのに使うGPIOピンの番号です。
button = Button(5)
ボタンが押された・押されていない、の判定には以下のコードを使います。
if button.is_pressed == True:
print("Pushed!")
button.is_pressedがTrueならボタンが押された、Falseならボタンは押されていない、ということを意味します。TrueはYES、FalseはNOの意味です。
文字をShellに出力する以外のことをしたい場合は、関数print()を呼んでいる部分を別のものに置き換えてください。例えば、
- ボタンを押したらLEDを点灯させる
- ボタンを押したらカメラで写真をとる(あるいは動画をとる)
- ボタンを押したらスピーカーから音を出す(あるいは音楽を流す)
といったことができるようになります。
このプログラムは、ボタンが押されたかどうかをずっと繰り返し調べ続けます(無限ループを使って)。プログラムの実行を止めるにはCtrl-Cしてください。
複数のボタンを使う
上記の例ではボタンを1つ使いましたが、複数個使うことも(もちろん)できます。1つのボタンを使うのにGPIOのピンを2本使うので、ボタンを2つ使うにはGPIOのピンを4本使います。ボタン3つならGPIOのピンは6本使います。
回路図とプログラムは省略しますが、興味があればトライしてみてください。片方のボタンが押されたら「何か」をし、もう片方が押されたら「別の何か」をし、両方同時に押されたら「さらに別の何か」をする、というようなことが実現できます。もしうまくいかないことがあったらいつでも質問してください。
ボタンの長押しを検知する
ボタンを短い時間押したか、長い時間押したかを区別して、実行することに変化をつけることもできます。例えば、短く押したら写真を撮影し、長押しなら動画撮影、というふうに。
長押ししたかどうかを調べるプログラムがlong-push.pyです。以下の部分の変数longPushDurationに数字を秒数で入れて、それ以上の時間ボタンを押し続けると「長押し」と判定します。この例では3秒以上ボタンを押すと長押しとなります。
longPushDuration = 3
このプログラムを実行してボタンを押すとまず
Pushed:
とShellに表示され、すぐに指を離すと(3秒未満)、
Pushed: Short push
と表示されます。3秒以上ボタンを押し続けると、ボタンを離したときに
Pushed: Long push
と表示されます。
このプログラムは、ボタンが押されたかどうか、そして押し続ける時間が短いか長いかをずっと繰り返し調べ続けます(無限ループを使って)。プログラムの実行を止めるにはCtrl-Cしてください。
プログラムの全体像は以下のようになっています。
interval = 0.1
while True:
try:
ボタンが押されたかどうかを調べ、押された場合には
押し続けた時間が短かったか長かったかを調べる
time.sleep(interval)
except KeyboardInterrupt:
break
このように、0.1秒ごとに、ボタンが押されたかどうかを調べ、押された場合には押し続けた時間が短かったか長かったかを調べています。ボタンが押されたかどうか調べるのは、前のプログラムでやったのと同じ方法です。
新しいのは、ボタンを押したのが短かったか長かったかを調べる部分です。これを調べるために以下の2つの変数を使います。
pushed
:0.1秒前にボタンが押されていたかを記録する変数。これにはTrueかFalseの値が入る。TrueはYES、FalseはNOの意味。- pushedがTrueなら、直近の0.1秒以内にボタンが押されたということ。つまり、今ボタンが押されたばかり(ついさっきボタンが押されたばかり)であることを意味する。
- pushedがFalseなら、直近の0.1秒以内にボタンは押されなかったということ。
pushCount
:0.1秒ごとにボタンが押されたか調べ続ける過程で、過去何回連続でボタンが押され続けているかを表す変数。最初の値はゼロで。ボタンが押され続けていると、0.1秒ごとにこの値が1づつ増える。つまりこの値が1だと、過去0.1秒間ボタンが押されていたことを意味する。この値が5なら、過去0.5秒間ボタンがずっと押されっぱなしだったことを意味する。ボタンが押されっぱなしになっている秒数は、interval * pushCount
で計算できる。これが3秒(longPushDuration
の値)以上なら、長押しされたということ。
ここまでの文章をもとに、プログラムをじっくり読んで下さい。わからない点、質問があればいつでも質問してください。