押しボタンを押してLEDを点灯させ、放して消灯させるプログラムです。GPIOピンは出力だけでなく、入力にも使用できます。
目次
押しボタンの値の読み取り
押しボタンでLEDを点けたり消したりするには、押しボタンが持っている、ボタンが押されているか押されていないかを表す状態の値を読み取り、押されているときの値のときにLEDを点け、押されていないときの値のときには点けない、というようにします。
押しボタンでLEDを点けたり消したりするには、まず押しボタンの値の読み取り方を知る必要があります。
配線
配線は次のようにします。
Raspberry Pi Pico | 押しボタン |
---|---|
3V3(out) | ピン1 |
GP14 | ピン2 |
押しボタンには足が2つのものと4つのものがあります。どちらも溝をまたぐ形でブレッドボードの穴に挿します。2つのものは両方の足を使い、4つのものは、上図のように対角線上にある足を使うか、別の列にある足を使います。
ジャンパー線をGP14ピン(Picoの左下隅から上に2つめ)の左のブレッドボードの穴に挿し、片方を、押しボタンの足を挿したのと同じ行にあるブレッドボードの穴に挿します。ジャンパー線をもう1本用意し、溝を越えた位置に挿した押しボタンの足と同じ行にある穴に挿し、片方を電源レールに挿します。
Picoの右上隅から5番めにある3V3(OUT)ピンの右のブレッドボードの穴にジャンパー線を挿し、片方を電源レールに挿します。
これで、Picoの3V3 -> (電源レール) -> ボタンの足の1つ -> ボタンの足の1つ -> GP14ピンがつながったことになります。
プルアップ抵抗とプルダウン抵抗
押しボタンは、下図のような、回路の橋渡しの役目を果たします。ボタンが押されている状態では、Picoの入力側につながり電圧がかかります。押されていない状態では、Picoの入力側につなっていない状態になります。
このつながっていない状態の電圧は0V(ボルト)ではなく、フローティングと呼ばれる、電気的に“浮いた”不安定な状態です。この状態では、ボタンを押していないときでも押した状態になる可能性があり、これを避けるために、Picoが内部に持っているプルアップかプルダウンと呼ばれる抵抗をつないで、電気的に安定させる必要があります。
プルアップ抵抗はmachieのPin.PULL_UPでピンに設定できます。これは、ボタンが押されていないとき、入力が1になるということを意味します。プルダウン抵抗はmachieのPin.PULL_DOWNで設定できます。これは、ボタンが押されていないとき、入力が0になるということを意味します。
押されていないとき0で、押されていると1になるというPin.PULL_DOWNの方が直感的で、分かりやすいように思えます。
プログラムコード
少し電気の話が入ったので難しく思えるかもしれませんが、コードは単純です。要は、押しボタンを作成するときには、ピンの番号からPinオブジェクトを作るとき、プルアップかプルダウンかどちらかを指定すればよい、ということです。次のコードではプルダウンを設定しているので、押されたとき1になります。
import machine
import utime
# GP14ピンを、入力用のプルダウン抵抗を使用するピンとして設定。
button = machine.Pin(14,machine.Pin.IN,machine.Pin.PULL_DOWN)
while True:
print(button.value()) # 値はvalue()メソッドで得られる
utime.sleep(1)
このプログラムを実行すると、Thonnyの[シェル]に、ボタンを押していないとき0が、押しているとき1が出力されるのが確認できます。
ボタンを押してLEDを光らせ、放して消す
配線は、前のLチカのものを加えます。
配線
Raspberry Pi Pico | 抵抗器 | LED |
---|---|---|
GP15 | <---> | VCC(+、長い足) |
GND | GND(-、短い足) |
Raspberry Pi Pico | 押しボタン |
---|---|
3V3(out) | ピン1 |
GP14 | ピン2 |
GP15 –> (抵抗) -> (+)LED(-) -> (グランドレール) -> GND
プログラムコード
import machine
import utime
led_external = machine.Pin(15, machine.Pin.OUT)
button = machine.Pin(14,machine.Pin.IN,machine.Pin.PULL_DOWN)
while True:
if button.value() == 1:
print("ボタンが押された")
led_external.on()
utime.sleep(0.1)
else:
led_external.off()
whileループでは、button.value()が1かどうかをずっと調べつづけています。ボタンが押されたとき、プルダウン抵抗の設定によって、このボタンの値は1になるので、ifの条件が満たされ、LEDが点灯します。
そうでないとき、つまりボタンの値が1でないとき(押されていないとき)は、else文のled_external.off()が実行され、ボタンは消灯します。仕組みは実に単純で明快です。
このelseをなくし、led_external.off()をif文の外に出すこともできます。すると、押されている間はLEDが点き、その後消灯することになりますが、utime.sleep()で時間を取っていないので、消灯は人間の目には見えません。elseがない分、MicroPythonの仕事が減ることになり、プログラムはその分わずかながらも軽快になります。
while True: if button.value() == 1: print("ボタンが押された") led_external.on() led_external.off()
PicoのメモリはPCと比べると圧倒的に小さいので、何かにつけ“いたわる”方にします。このelseを使わないのもその1つです。また、ここまでimport machine と記述してmachineライブラリをインポートしていますが、使用する機能に絞ってインポートするようにすると、使わない関数などがインポートされないので、これも“いたわり”になります。
from machine import Pin
この場合、machineと書く必要がなくなり、machine.PinはPinと、machine.Pin.INはPin.INと記述できるので、コードが短くなります。