非公式Rock研究所

Radxaのシングルボード(主にRock4c+)について書いています

Digital Read-スイッチの読み取りまでの道のり

mraaというライブラリは本当に情報が少ないです。

LEDチカチカに関する記載は、いくつかサイトもあったんです。それにmraaのドキュメントサイトにもコード例が掲載されてあったんで、それ見りゃなんとなくいけたのですが、スイッチの読み取り方法を紹介しているサイトはググっても全然見つかりません。

出てくるのは、難しいmraaのドキュメントのページだけ。APIの仕様説明だけで、コード例は書いてない。しかも英語。。

しかし、わからないなりにも「mraaのドキュメント」とArduinoやRaspberry PIで検索すると豊富にヒットする「別ライブラリのコード例」を参考に、あれこれ試してみました。

1st Take

「今回の動きはLEDチカチカと反対の動きだから…」という視点でドキュメントを調べると、以下にようなそれっぽい処理が見つかりました。

これをもとに作成したコード

# これは失敗例です!
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)

実行結果

1st Take実行結果

ボタンを押しても押さなくてもずっと"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())     #(状態を出力)
2nd Take_DIR_IN実行結果



import mraa
import time

gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_OUT)    #(DIR_OUTにして、)
print(gpio_sw.readDir())     #(状態を出力)
2nd Take_DIR_IN実行結果

DIR_INとDIR_OUTで違う値を返すので、少なくとも何らかの状態変更は起きているようです。

3rd Take

不要なコードを削ぎ落としてみました。

import mraa

gpio_sw = mraa.Gpio(8)
gpio_sw.dir(mraa.DIR_IN) 
print(gpio_sw.read())  #(ループやめて、一回だけ読み込み)
3rd Take実行結果

やっぱり"1"が返ってくる。。

4th Take

だめだ、わからん。もしかしてPin壊れてる?

現実逃避でLEDチカチカのコードを実行すると、ちゃんと動く。

5th Take

どうすりゃいんだ。と何気なく1st Takeのコードを実行してみる。

5th Take実行結果

あれ、"0"になってる。ボタン押したら反応してるぞ??

再起動して、1st Takeを再度実行すると、

5th 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)
6th Take実行結果

っしゃああああ!!!

まとめ

最後に、

以上を加えて完成版にしています。

【GPIO】「Digital Read-スイッチの読み取り」 - 非公式Rock研究所
https://informal-r-labo.net/posts/gpio003

なんとか実現までこぎつけることはできました。しかし、先人のコード例がない中、これが本来の正しい使い方なのか自信を持って答えることができないのが本音です。

読者「おまえ、それ合ってんのか?」
私「あ、いや、たぶん。。まぁ、動いてますし、はい。」


誤りや指摘がございましたら、問い合わせよりご連絡いただけると幸いです。

【Contacts】「Contact-お問い合わせ」 - 非公式Rock研究所
https://informal-r-labo.net/posts/contact