APDahlen Applications Engineer
マイクロコントローラとデュアルインラインパッケージ(DIP)スイッチのインターフェースは、ごく一般的なアプリケーションです。「DIP」という通称を持つスイッチには、ブレッドボード試作に適した伝統的なDIPから、面実装の「ピアノ」タイプ、16進値が読みやすいロータリスイッチまで、幅広いデザインがあります。
この投稿では、ロータリスイッチを詳しく見ていき、マイコン設計にどのように組み込むことができるかを探ります。この記事で紹介するテクニックは、一般的にすべてのマイクロコントローラ設計に適用できます。
ルールから始めましょう
フローティング入力は許されないというシンプルなルールから始めましょう。フローティング入力とは、マイクロコントローラのピンが入力として設定されているが、何も接続されていない状態のことです。ここに例を示します。スイッチが閉じているとき、関連するピンはプラスレールに接続されます。スイッチが開いているときは、ピンはフローティングです。
フローティングピンはロジックハイと判定されることもあれば、ロジックローと判定されることもあるため、非常に望ましくありません。トラブルシューティングの観点からは、マイクロコントローラの判定には何の根拠も理由もありません。このピンはノイズの影響を受けやすく、隣接するマイクロコントローラのピンの値に緩く追従することがよくあります。
解決策は、下図のようにプルダウン抵抗を追加することです。この小さな変更により、スイッチが閉じているときはマイクロコントローラのピンがレールにプルアップされ、スイッチが開いているときはグランドにプルダウンされます。一瞬の間のスイッチの跳ね返りを無視すると、マイコンにはクリーンな入力が得られます。
最適化されたソリューション
最近のマイクロコントローラは、このタイプのインターフェースに対応した設計になっており、ほぼすべてのマイクロコントローラは、I/Oピンに対してプルアップまたはプルダウンするための内部抵抗を備えたI/Oセクションになっています。スイッチをマイクロコントローラに直接接続するだけで良く、外部抵抗が不要になるため、これは望ましいことです。
技術的なヒント: マイコンの中には、プルアップ抵抗とプルダウン抵抗の両方を備えているものがあります。しかし、プルアップのみの方が一般的です。これらの周辺回路はしばしば「弱いプルアップ」と呼ばれ、数十~数百uAを消費します。これは、15kΩから150kΩの外部プル抵抗を接続することに相当します。
Arduino の例では次のように設定します。
pinMode(SW_PIN_D0, INPUT_PULLUP);
この回路図は、マイクロコントローラをスイッチにインターフェースする1つの方法を示しています。この例ではロータリDIPスイッチを使用していますが、この回路はすべてのスイッチに適用できます。以下の2点にご注目ください:
-
内部プルアップ抵抗は、マイクロコントローラの専用のファンクションレジスタを使用して有効にします。
-
スイッチのコモン端子はグランドに接続されています。
技術的なヒント: オプションの直列抵抗セットが、オプションのマルチプレクサ部と 共に回路図に示されています。これにより、I/Oピンが二重の役割を果たすことができます。例えば、このニブル幅のインターフェースは、スイッチの読み取りとLCDディスプレイのD3~D0の駆動に使用可能です。これは、回路とコーディングは複雑になりますが、マイクロコントローラのピン数を減らし、PCB全体のサイズを小さくできる可能性があるため、望ましいことです。
まとめの前に、ロータリDIPスイッチに関連する物理的なスイッチコードを見てみましょう。代表的な16進コードをオムロンのデータシートから引用します。それぞれモデル A6A-16R と A6A-16C に対応する「BCD 16進コード」と「BCD 16進コンプリメンタリコード」の2つのスイッチ構成があることに注意してください。
関連するプルアップ抵抗付きのマイクロコントローラの回路図に目を向けると、反転していることがわかります。例えば、スイッチが1の位置にある場合、2+4+8の各ビットは3つの正論理入力になります。一方、コンプリメンタリスイッチを取り付けた場合、1信号に対応する正論理(アクティブハイ)入力は1つになります。
プログラミングの観点からは、この物理的なスイッチコードの違いは取るに足らないことです。単純なビット反転命令でそれらは等価になります。トラブルシューティングや教育の観点からは、マイクロコントローラのピン上に正の論理値が存在することになるため、コンプリメンタリバージョンの方が理解しやすいかもしれません。
ご健闘をお祈りします。
APDahlen