mbed(5) 入力ポート、スイッチ入力

入力ポートのプルアップやスイッチ接続など。

●入力ポートのプルアップ

mbedの入力ポートはプルアップ、プルダウンすることができます(全部のポートが対応しているかは未確認)。入力ポートとしてインスタンスを作成したあと、次のようにします。

// 入力ポートのインスタンス生成
DigitalIn myPort(p5);

———–

// プルアップ有効
myPort.mode(Pullup);

ここでは、ポートのインスタンスを”myPort”とします。引数は “Pullup” 、”PullDown” 、”PullNone”のどれか。おそらく内蔵pull up抵抗器の抵抗値は大きめだ思うので、電流を増やしたいときは外部の抵抗器でプルアップした方がよいでしょう。

●チャタリングキャンセル

状態変化割込みを使う場合、チャタリングがあると、割込みをまともに捕捉できなくなるため、スイッチなどを接続する場合はチャタリングを除去しておく必要があります。

確実に除去するにはフリップ・フロップ回路を使いますが、タクトスイッチのように押したときだけONするようなスイッチでは、コンデンサと抵抗を使ってローパスフィルタ(積分)回路を付けると効果があります。できれば、図(上)のように、シュミットトリガのゲートIC(HC14など)で受けるとよいでしょう。この回路はmbed以外のマイコンにも使えます。

なお、HC14などのインバータをつけると、スイッチ入力の論理が逆(押したときに”H”レベル)になるので、プログラムで対応する必要があります。割込み使用時はハンドラ登録時に立ち上がりか立下りを入れ替えるだけで対応できます。

sw22

図(下)の方法も試してみましたが(10kΩはつけないで、内蔵pull upを有効化)、あまり効果はありませんでした。コンデンサ値や抵抗値が適当でないのかもしれませんが、入力ポートのヒステリシスは0.4V程度なので、シュミットトリガとしては少し小さすぎると思います。なので、図(上)のようにちゃんとしたシュミットゲートを入れた方が確実です(この場合は内臓pull upはあまり意味がない)。

●状態変化割込みが使えないポート

p19、p20は状態変化割込みが使えません。コンパイルエラーにはなりませんが、実行すると、オンボードのLEDがエラー表示(?)か点滅します。単純な出力ポートとしては使用できました。なお、それより小さい値のポートと、p21、p22では状態変化割込みが使えました。

このへんの資料がどこかにあるのでしょうが、まだ見つからないので、手探り状態です。

●エッジ割込みの誤検知

状態変化割込みを使用して、スイッチ10個ぐらいつないで、あるプログラムのデバッグをしていのですが、あるスイッチを押すと、押していないスイッチの割込みが入る現象が。チャタリングが残っていても、他のスイッチに影響するはずはないし、最初は原因がわかりませんでした。

試作のため、ブレッドボードで製作しているので、長い配線の影響や、接触不良の可能性もあるのですが、どうもクロストークのような感じです。で、ふと思いつきました。

原因はGNDが弱いせいでした。複数のボードの電源ラインを数か所で並列接続して、GNDのインピーダンスを下げることで改善しました。GNDレベルがふらついていて、他のスイッチの変化につられて誤検知していたようです。

以前もAD変換で測定値が安定しないということがありました。その時も、GND線を数本増やして補強して改善しました。このように、電気的にはつながっていてもGNDが弱くて誤作動するということがあります。ブレッドボードで作るときは特に気を付けないと。

コメントは受け付けていません。