ボタンでLEDを制御しよう
前回は、LEDがチカチカするプログラムと回路を作成しました。
今回は、ボタンを押してLEDを制御してみようと思います。ボタンを押している間はLEDが光り、ボタンを押すのをやめるとLEDが消えるというのをやります。
ということで、僕の教科書であるfreenoveさんのチュートリアルに従って進めてみます。
用意するもの
- raspberry pi pico
- USB cable
- ブレッドボード
- ジャンパーワイヤー×4
- LED
- 抵抗220Ω×1
- 抵抗10kΩ×2
- 押しボタン

回路作成
まずは回路を組んでみます。


まずはpicoのGP15番に220Ω抵抗をつなぎます。
次に220Ω抵抗の右側を挿した穴の上に、LEDの+側を挿します。足が長い方が+側です。
そして黒いジャンパーワイヤーでLEDの−側からpicoのGNDへ接続します。
これでLEDの接続は完了です。(後から気付くのですが、右側がせますぎるのでもっと左にpicoとLEDをセットした方がいいです。)





次はボタンを接続していきます。
まずは赤いジャンパーワイヤーをpicoの3V3に挿します。もう一方をどこでもいいのですが、ブレッドボード54の穴に挿します。
その下の穴に10kΩの抵抗を挿します。
次にボタンを挿すのですが、まずボタンの向きは写真のように上下に足が出るような向きにします。ブレッドボードの真ん中に溝があるのでそれをまたぐような感じで接続します。抵抗右側の足が挿さっている穴と同じ列にボタンの左の足をつなぎます。




ここでpicoとLEDが右に寄りすぎてて狭いことに気づいたので、左に移動させます。

ボタンの下側の左足に10kΩ抵抗を繋いで、緑色ワイヤーで抵抗の左足からpicoのGP13へ接続します。
最後にボタンの下右足から、picoのGNDへ黒いジャンパーワイヤーを接続します。GNDはどこでもいいので、使っていなくて近いところに接続します。





これで回路が完成しました。

プログラム作成
回路が完成しましたので、次はプログラムを作成していきます。
手順は前回同様で、picoをパソコンに繋いでおいて、チュートリアルのフォルダから02.1_ButtonAndLedのファイルをthonnyで開きます。




こんな感じのプログラムが開かれるので、これをpicoに保存します。名前は今回は02_1_ButtonAndLed.pyとしました。




これで準備は完了です。thonnyの実行を押して、回路内のボタンを押すと…LEDがつきました!
ボタンの挙動を変えてみる
さっきのプログラムでは、ボタンを押している間だけしかLEDがつきません。でも一度押したら指を離してもLEDがついていて、もう一度押すとLEDが消えるみたいな挙動にしたいですよね。
そう思っていたら、次のチュートリアルがそうだったので、今回それもやってみます。
回路はそのまま使えるみたいなので、プログラムだけ変更していきます。
まずはチュートリアルフォルダの02.2_TableLampをthonnyで開きます。


このようなプログラムが開かれます。

このプログラムをpicoに保存します。名前は02_2_TableLamp.pyとしました。

あとはthonnyで実行ボタン押して、回路内の黄色ボタンを押すと…できました!!
プログラムの解説
チュートリアルにプログラムの解説も載っていたので、補足しながら日本語で解説します。

これはmachineモジュールの中にあるPinやtimeモジュールをインポートしています。入出力のピンを使えるようにしたり、時間の調整ができるような能力をセットしているような感じです。

回路ではGPIO15にLEDを、13にボタンを接続しているので、LEDとボタンをそれぞれ定義しています。
4行目は、GPIO15ピンを出力モードに設定し、信号を出す準備をしますよ。この設定をledという変数に格納するというプログラムです。
5行目は、GPIO13ピンを入力モードに設定し、信号を受け取る準備をしますよ。この設定をbuttonという変数に格納するというプログラムです。
変数とか出てきますが、この変数の名前はある程度自由に決められるようです。分かりやすいようにledとかbuttonという名前にしているのでしょうね。
それと、#がついている部分はプログラムに関係ない補足文です。

この部分は全体の意味としては、ボタンが押されているかどうかをずっと監視していて、そのボタンの状態に応じてLEDをON・OFFするというプログラムになっています。ボタンが押されているなら、LEDをON、押されていないならLEDをOFF。
try:
→この中の処理を試して実行する。もしエラーが起きたらexcept:に進む。
while True:
→ずっと繰り返す。
if not button.value():
→ボタンが押されているなら。notがない場合は、ボタンが離れているならという意味になる。
led.value(1)
→LEDを点灯
else:
→それ以外なら
led.value(0)
→LEDを消灯
except:
→エラーが起きたらここに進む。
pass
→何もしない。エラーが起きても無視してプログラムを止めない。
もう一つのプログラムの方も解説します。

この部分は、LEDの状態を反転させるためのプログラムです。
defでreverseGPIOという関数を定義しています。その内容は次のようなものです。
LEDがオンだったらled.value(0)でオフにする。
LEDがオフだったらled.value(1)でオンにする。
プログラムの右に書かれている補足文は意味が逆になっている気がします。

if not button.value():→ボタンが押されていたら
time.sleep_ms(20)→20ミリ秒待つ
またif not button.value()→ボタンが押されていたら
reverseGPIO()を実行する。
while not button.value():
time.sleep_ms(20)
→ボタンが押されている間、20ミリ秒まつことを繰り返す。
まとめると、ボタンが押されていたら20ミリ秒待ってみて、それでもまだボタンが押されていたらreverseGPIOを実行する。ボタンが押されている間は、20ミリ秒待つことを繰り返す。という内容になります。
ボタンが押されていたら20ミリ秒待つというのはチャタリング対策だそうです。チャタリングとはボタンを押したときに短時間に何度もON/OFFしてしまうことです。
最後の20ミリ秒待つのを繰り返す部分は、ボタンの押しっぱなし対策です。この処理があることで、ボタンを押しっぱなしにしてもLEDが何度も切り替わらないようにしています。1回押したらLEDの状態を反転して、ボタンが離されるまで次の反応を待つというおしっぱなし対策です。
これはCTAサンプルです。
内容を編集するか削除してください。