Digital Read-スイッチの読み取りまでの道のり
mraaというライブラリは本当に情報が少ないです。
LEDチカチカに関する記載は、いくつかサイトもあったんです。それにmraaのドキュメントサイトにもコード例が掲載されてあったんで、それ見りゃなんとなくいけたのですが、スイッチの読み取り方法を紹介しているサイトはググっても全然見つかりません。
出てくるのは、難しいmraaのドキュメントのページだけ。APIの仕様説明だけで、コード例は書いてない。しかも英語。。
しかし、わからないなりにも「mraaのドキュメント」とArduinoやRaspberry PIで検索すると豊富にヒットする「別ライブラリのコード例」を参考に、あれこれ試してみました。
1st Take
「今回の動きはLEDチカチカと反対の動きだから…」という視点でドキュメントを調べると、以下にようなそれっぽい処理が見つかりました。
- dir.(mraa.DIR_IN)
- .read()
これをもとに作成したコード
# これは失敗例です!
import mraa
import time
gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_IN)
while True:
result = gpio_sw.read()
print(result)
time.sleep(0.1)
実行結果
ボタンを押しても押さなくてもずっと"1"が表示。。Pinの番号をいろいろ変えて実行するも、うまくいかず。
1stを抜け出すまでにかなり頭抱えました。
2nd Take
そもそもDIR_INはちゃんと反映されているのか調べるため、現在の向き先の状態を返してくれると思われる"readDir"を使って、以下の2パターンのコードを作成し、それぞれの挙動を試してみました。
import mraa
import time
gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_IN) #(DIR_INにして、)
print(gpio_sw.readDir()) #(状態を出力)
import mraa
import time
gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_OUT) #(DIR_OUTにして、)
print(gpio_sw.readDir()) #(状態を出力)
DIR_INとDIR_OUTで違う値を返すので、少なくとも何らかの状態変更は起きているようです。
3rd Take
不要なコードを削ぎ落としてみました。
import mraa
gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_IN)
print(gpio_sw.read()) #(ループやめて、一回だけ読み込み)
やっぱり"1"が返ってくる。。
4th Take
だめだ、わからん。もしかしてPin壊れてる?
現実逃避でLEDチカチカのコードを実行すると、ちゃんと動く。
5th Take
どうすりゃいんだ。と何気なく1st Takeのコードを実行してみる。
あれ、"0"になってる。ボタン押したら反応してるぞ??
再起動して、1st Takeを再度実行すると、
また"1"に戻る。
6th Take
LEDチカチカのコードは最後に"write(0)”の状態で終了するので、もしかして事前にwrite(0)を書き込む必要がある?
初期化処理を追加したコード
import mraa
import time
gpio_sw = mraa.Gpio(8)
#(DIR_OUTにして、write(0)の処理を入れた)
gpio_sw.dir(mraa.DIR_OUT)
gpio_sw.write(0)
gpio_sw.dir(mraa.DIR_IN)
while True:
result = gpio_sw.read()
print(result)
time.sleep(0.1)
っしゃああああ!!!
まとめ
最後に、
- 上記のコードだとたまに最初の表示に"1"が混入することがあるので、初期化の後に1秒待機の処理を追加
- ".dir(mraa.DIR_OUT)"を".dir(mraa.DIR_OUT_LOW)"に、1行で"LOW"を設定できる処理に置き換え
以上を加えて完成版にしています。
【GPIO】「Digital Read-スイッチの読み取り」 - 非公式Rock研究所
https://informal-r-labo.net/posts/gpio003
なんとか実現までこぎつけることはできました。しかし、先人のコード例がない中、これが本来の正しい使い方なのか自信を持って答えることができないのが本音です。
読者「おまえ、それ合ってんのか?」
私「あ、いや、たぶん。。まぁ、動いてますし、はい。」
誤りや指摘がございましたら、問い合わせよりご連絡いただけると幸いです。
【Contacts】「Contact-お問い合わせ」 - 非公式Rock研究所
https://informal-r-labo.net/posts/contact