前回の記事
Raspberry Pi タクトスイッチの入力を扱う その1

部品・材料、回路はその1と同じため記述は省く。
違う点は、プログラム。

タクトスイッチを押した瞬間、LEDの点灯ON/OFFを切り替える。
ただし、今回のプログラムは失敗例です。
成功例は次の記事で書く予定。

成功する前に、まずは失敗する理由からやっていく。

プログラム

import RPi.GPIO as GPIO #GPIO制御のためのimport
from time import sleep #sleep命令のimport

#GPIOの初期化命令
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(24, GPIO.IN)

#変数の初期化命令,LEDの状態を保存するため
ledstate = GPIO.LOW

#メインループ
try:
    while True:
        if GPIO.input(24) == GPIO.HIGH: #タクトスイッチの状態を読み、HIGHなら
            ledstate == not ledstate #変数ledstateの中身を逆にする
            GPIO.output(25, ledstate) #ledstateの中身に応じてLED制御
        else: #タクトスイッチの状態を読んでも、HIGHじゃなかった場合は
            GPIO.output(25, ledstate) #ledstateの中身に応じてLED制御
        sleep(0.01) #sleep 0.01秒

except KeyboardInterrupt: #Ctrl+C押したら
    pass

GPIO.cleanup() #GPIOを初期化し終了

#… はコメントアウトですが、実行するときは消したほうが安全かもしれない。
日本語フォントがインストールされていない場合は文字化けするだろうし。

内容はコメントをみれば大体わかると思う。

今回は、ledstateという変数を用意した。
HIGHかLOWどちらかの状態を保存するためである。
これを用いないと、タクトスイッチを押したとき、HIGHとLOWどちらに切り替えればいいのかが、わからなくなる。

次に、気になるのは
ledstate == not ledstate
これは、ledstateに、ledstateの逆を代入するために書いた。

例.今の状態がHIGHなら、LOWを代入する 

以上が、今までのプログラムと比較して変わったところです。

そしてこれを実行すると…
上手くいきません。

原因はプログラムではなく、電子回路。


タクトスイッチを押した瞬間はノイズがある。(チャタリングと呼ばれている)
HIGHLOW
LOW(0V)からHIGHにかわるとき、つまり、スイッチのプラス側の金属端子と、マイナス側の金属端子が接触するとき、それが光の速さでぴちっと接続されれば問題ないかもしれないが実際はそうじゃない。
端子同士の距離がものすごく小さくなったときに、電流がながれ一瞬だけHIGHになるかもしれない。

つまり、一瞬LOWからHIGHに変わり、すぐにLOWへ電圧が落ち、次は安定してHIGHになるかもしれない。
こんな不安定な状態で動かすと、スイッチを押したのにLEDは切り替わらなかったり、点滅してしまう。

解決方法は、プログラムを書き換えることで解決する。次の記事で書く。

とりあえず、今回のプログラムで動かした結果を動画にしたので、よければご視聴ください。
押したときの挙動がおかしいことが、よくわかると思う。



Raspberry Piクックブック (Make:PROJECTS) - Amazon