【Lesson3】タクトスイッチを使ったLEDのコントロール Controlling an LED with a button

0
3129

今回学ぶこと

今回はタクトスイッチを使ってLEDの点灯をコントロールするプログラムを実行します。タクトスイッチを使ってLEDのON-OFFというとRaspberry Piを使わなくてもできてしまいますが、マイコンを使うと様々な制御に繋がります。例えば、

  1. スイッチを押したときにLEDが点灯して、離すと消灯する。
  2. LEDは常に点灯していて、スイッチを押すとLEDが消灯する。
  3. タクトスイッチを1回押すとLEDが点灯し、もう一回押すと消灯する。

など、プログラムでその動きをいろいろコントロールできるようになるわけです。

スイッチを使う場合、良く出てくるのが「プルアップ/プルダウン抵抗」です。今回はこの取り扱いについても学びます。

使用する部品

  • Raspberry Pi 3 Model B × 1
  • 電源アダプター5V 2.5A × 1
  • ブレットボード × 1
  • LED × 1
  • タクトスイッチ×1
  • 抵抗 220Ω × 1
  • ジャンプワイヤー(オス/オス) × 4

※これらの部品はFabshopがふるさと納税で提供している「ふるさと納税Raspberry Piスターターキット」もしくは当サイトで購入可能な「Raspberry Pi スターターキット」の電子工作キットに同梱されています。

実体配線図

配線はLEDの点滅させる場合と同様なもので、その配線図にさらにタクトスイッチが付いたものになります。

タクトスイッチは図のような回路図になっていて、4つ足が出ていて、2つの回路のON-OFFを同時にできるようになっています。

プルアップ・プルダウン抵抗

スイッチなどを使う時には通常プルアップ/プルダウン抵抗を使います。スイッチは回路図のようにONになってないときには回路がきれてしまいます。この状態ですと同線の微小な抵抗値が影響してスイッチがONなのかOFFなのか正しく判定できなくなってしまいます。そのため、ONならHIGH、OFFならLOWと明確に電圧の差を作るためにこの抵抗を用います。

今回の回路にはプルアップ・プルダウン抵抗を直接回路では作りませんが、RPi.GPIOにはこれらを疑似的に実現するライブラリが用意されているので、setup関数の中でそれを使います。

今回の場合、スイッチがOFFの時には3.3Vがかかった状態にしておきたいの「プルアップ抵抗」をセットする設定にします。

プログラムのコピーと保存

ラズベリーパイメニューから「プログラミング」→「Geany」を開きます。

メニューバーから「ファイル」→「新規」をクリックします。

【Lesson1】のときと同じように、この下にある「Controlling an LED with a buttonのプログラム」の枠右上に並んだアイコンの内、右から2番目のアイコンをクリックします。(マウスをアイコンに近づけると”Copy”の表示が現れます)

すると、プログラムの文字列が全て選択されるので、「Ctrl」と「C」キーを同時に押してコピーします。

import RPi.GPIO as GPIO

LedPin = 11
BtnPin = 12

def setup():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(LedPin, GPIO.OUT)
    GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.output(LedPin, GPIO.HIGH)    

def loop():
    while True:
        if GPIO.input(BtnPin) == GPIO.LOW:
            print ('...led on')
            GPIO.output(LedPin, GPIO.LOW)
        else:
            print ('led off...')
            GPIO.output(LedPin, GPIO.HIGH)

def destroy():
    GPIO.output(LedPin, GPIO.HIGH)
    GPIO.cleanup()

if __name__ == '__main__':
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

プログラムの解説

いままでは1つのポートだけをコントロールしていましたが、今回はLEDとタクトスイッチがつながるので2つのポートをコントロールします。

def setup() は各種設定を行う関数を定義しているところですが、この中の3つ目に GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP という記述があります。ここが前述した「プルアップ抵抗を設定しておく」という部分です。

実際の配線の時はGPIOから直接タクトスイッチに入っているだけなので、プルアップ抵抗がないため、プログラム上でプルアップ抵抗を設定しておきます。こうすることでボタンが押されていないときには3.3Vがかかっていることになります。

def loop()のWhile Trueの中で、if GPIO.input(BtnPin) == GPIO.LOW; となっています。ボタンを押していないときはBtnPinは3.3VでHighになっているので、else以降が当てはまることになり、led off… と表示され、LedPin には3.3Vがかかっている状態になります。

LedPinのアノード側にも3.3Vがかかっているため、同じ電圧なのでLEDは光りません。

タクトスイッチを押したときにはBtnPinはGNDに流れ電圧が0Vになります。こうなるとloop()関数のif文と合致するため、LedがONになり、LedPinのカソード側がLOWを出すため、3.3Vと0Vと電位差ができて電気が流れるためLEDが点灯します。

新たに開いたタブ「untitled×」の1行目にマウスカーソルを置いて右クリックして出てくるメニューから「貼り付け」を選択します。

Geanyのメニューバーから「ファイル」→「別名で保存」をクリックします。

新たに「ファイルを保存」画面が現れるので、左ペインの「デスクトップ」をクリックします。

「ファイルを保存」画面の1番上の項目「名前:」の入力欄に拡張子”.py”でプログラム名を入力し、「保存」ボタンをクリックします。

プログラムの実行

Geanyの画面に戻って、ツールバーの紙飛行機のようなアイコンをクリックします。

新たに「ターミナル」画面が開き、スイッチを押す前は”led off…”が縦に並んで表示されていますが、スイッチを押すと”…led on”の表示に変わってLEDが点灯し、スイッチを離すと表示が”led off…”に戻ってLEDが消えます。「Ctrl」と「C」キーを同時に押すとプログラムが停止します。

<<【Lesson2】|【Lesson4】>>