謎のスイッチの問題
https://gyazo.com/9e14160f2cd3a328bbb72e4b7f8f0c6b
回路を間違えている可能性に配慮してシンプルバージョンを作って見たがやはり片方押すと両方押されたと判定される…
スイッチが押されたかどうかを読み取るプログラムを作った
解釈:
信号線は抵抗でプルアップされ通常時は3.3V、スイッチが押されると信号線がグラウンドとつながることで0Vになる。
マイコンは信号線の電圧がLO(1.2Vぐらいよりも小さい)時に、スイッチが押されたと判断する
事実:
片方のスイッチを押すと、なぜか両方が押されたと判定される
問:
何が起きているか説明せよ
答えは試行錯誤編の後
試行錯誤編
ピンはもちろんIN
7.5KΩだと思っている抵抗が実は何を間違えたか75Ωくらいで、1個スイッチを押しただけでVccの電圧が低下してしまう…とか考えたけどさすがにそんなことないか
紫緑赤金だったので抵抗値が間違っているという線は消えた
チャタリング対策みたいに、一定時間の入力ピン電圧をウオッチしてます?
現状、GPIOから読んだ値をそのままLEDにassignして人間の肉眼で観察しているのでチャタリングの影響はありません。
一度諦めて分解して片付けようとしたが、説明のためにもう一度組み立ててみたら、片方のボタンを押しても1個しかLOにならず、もう片方を押すとどちらもLOにならない。あれれ?
別のケーブルに変えるとすんなり動く
その状態からGNDやVccを引きぬいて試してみたところ、Vccを抜いた時に元通りの現象が再現
解答:
ケーブルのうちの1本が断線している
最初に作った回路のVccが断線していたため「HI」だと思っていたものが実は「ハイインピーダンス」だった。
そのためスイッチが一つでも押されてGNDと短絡するとプルアップ抵抗とブレッドボード上のVccの線を通して全ての信号線がLOになる。
感想
ソフトウェアとハードウェアの大きな違い。ソフトウェアの部品は一つのインスタンスが仕様通りに動くことを確認したらどのインスタンスでも仕様通りに動く。ハードウェアの部品はたまに仕様通りに動かないインスタンスが混ざっている。