今回は digital read pin、端子から0か1かを読み出すだけの機能について。たまたま目の前にあった「スイッチ回路」をmicro:bitに接続して端子を読み出そうとしたら、スイッチ押しても離しても0なのです。昨日、別なデバイスに接続したときはちゃんと0と1読めてたのに。なぜ?
※「ブロックを積みながら」投稿順 index はこちら
(実験に使用した BBC micro:bitは v1.5、開発環境はオンラインのMakeCodeエディタです)
もうちょっと「高級なこと」を実験するつもりで、micro:bitの端子にスイッチを接続しました。昨日、別なデバイスに接続して実験につかっていたままのブレッドボードの回路(回路というほどでもない)です。micro:bitとの接続は以下のとおりです。
実はこのブレッドボードは以前から、22kΩ-プッシュスイッチ-330Ωという直列接続になっており使い回し、していました。今となっては何故この抵抗値に決めたのかは忘却の彼方であります。ともあれ、R1とSW1の間から入力信号をとりだすことで、
-
- スイッチ押さなかったら論理1
- スイッチ押したら論理0
を読み出して使えていました。だからBBC micro:bitに接続するにあたっても回路的な問題が起こるなどとは考えていませんでした。micro:bit接続にあたり注意したのは入力に使用するエッジコネクタのピンの選択です。内部で使われている信号がそのまま出力されている端子もあるので、それを避けるようにP16を選びました。ピンアウト情報はこちら。
勿論 digitalReadPinのドキュメントも読んでみました。例題を見ると、特に初期化などは無しにReadすれば端子のレベルが読み取れるように書かれていました。ところが、上記回路でdigitalReadPinを使って読み取ったところ
スイッチ押しても、押さなくても常に0
でした。何が悪いの?P16端子が悪いの?念のため端子をP16からP0端子に変更してdigital readしてみることにいたしました。こんな感じ。間違えようがないくらいシンプル。
しかし、状況は変わりません。digital read pin すると常に0が読めます。
DMMで当たってみると
まあ、こういうときはテスターで信号を当たってみるというもんですね。結果は、
-
- スイッチを押したとき 47mV
- スイッチを押さなかったとき 1.25V
電源電圧3.3Vなので、スイッチ押したときの47mVはR1、R2の分圧比を考えるとそれらしいです。しかし、スイッチ押さないときの1.25Vって何?念のため3.3V電源端子をテスタであたると3.26Vくらいが出てます。
この1.25Vから逆算すると、プルアップしているR1の22kΩに対して13~14kΩくらいの抵抗値で引っ張り下げているヤツがいる感じ。
試みに、入力信号の端子を pull up で初期化してみました。変更はこんな感じ。(端子はP16に戻してます。)
動作OKとなりました。スイッチ押さないと1、スイッチ押したら0と反応が返ってきます。
外付けでPULL UP抵抗があるので、内部プルアップは無しで良いよね、ということで取り外したものがこちら。勿論、これでも問題なく動作します。
この修正を行いながら、set pull pin のドキュメントを読むと以下の記述がありました。1か所引用させていただきます。
The pull-up and -down resistors are about 13kOhm.
13kΩということで当方推定値と一致しました。ということは、何も初期化しないと、デフォルトで入力ピンの
pull-downが生きてる
状態にあるということですかね。どっかに書いてあったのかな。見た記憶ないのだけれど。そうならそうと言ってよ。。。
MakeCodeなのか、チップの初期値なのか?MakeCodeはデフォルトでいろいろやってくれて便利ではあるのだけれど、それが回路と適合しているかどうかは分からないってことですかね。基本通り、必要な設定は自分でやれ、ということでしょう。