チャタリング対策をソフトウェアだけで行う方法:今岡通博の俺流!組み込み用語解説(8)(1/2 ページ)
今岡通博氏による、組み込み開発に新しく関わることになった読者に向けた組み込み用語解説の連載コラム。第8回は、第7回で取り上げた「チャタリング」への対策をソフトウェアだけで行う方法を紹介する。
はじめに
前回の記事ではマイコン入力の大敵であるチャタリングを取り上げましたが、今回はその対策編となります。
筆者は学生の頃からアルバイトでZ80のボードを半田ごてとオシロスコープでデバッグしてたのですが、メカニカルスイッチのチャタリングの罠にはずいぶん悩まされたものです。今世紀に入っての話ですが、FPGAでロータリーエンコーダーをハンドリングするロジックについては随分悩んだことを思い出しました。FPGAの製品によっては入力ピンをシュミットトリガーに設定する技などいろいろあるのですが、今回はマイコンを対象として、純粋にソフトウェアだけでいかにチャタリング対策できるかに焦点を当てた議論を展開したいと思います。
検証環境
図1はチャタリングの対策プログラムを検証するためのArduinoマイコンボードです。
Arduino Pro Micro 5v/16mhzですが純正品ではなく互換ボードです。ArduinoIDEからターゲットボードを指定する際には「leonardo Arduio」を選択してください。
このマイコンボードはミニブレッドボード上に刺さっています。ブレッドボード上にはタクトスイッチと半固定抵抗と発光ダイオード(LED)が装着されています。タクトスイッチは3番ピンとGND間にあります。プログラムからタクトスイッチの値を読み込もうとすれば3で参照可能です。
タクトスイッチを押下すると、3番ピンの値は0あるいはLOWが読み出されます。またスイッチが解放の時は3番ピンの値は1あるいはHIGHとなります。
LEDは半固定抵抗を介して接続しています。普通なら適切な固定抵抗をLEDに接続するのですが、他のLEDに変えた場合でも抵抗値を変えて対応できて便利なので採用しました。……と言いたいところですが、実のところ固定抵抗を探しに行くのが面倒だったので、たまたま手元にあった半固定抵抗を使いました。
この半固定抵抗の片側のピンはArduinoの9番ピンに接続されています。半固定抵抗の真ん中のピンはLEDのアノードに接続されています。そしてもう一方のカソードは9番ピンの対面の10番ピンに接続されています。一般的にLEDの使い方としてアノードが+側に接続されているのであればカソード側はグランドに接続するのですが、10番ピンを0あるいはLOWに設定することによりグランドの代わりに使っているのです。マイコンの貴重なピンを1本消費してしまうわけですが、その分配線の手間を省くことができます。今回はマイコンのピンは十分余っているので、このような方法でジャンパーを使うことなくブレッドボードに回路を実装しました。
リスト1はここまで紹介したArduinoによる検証環境の設定を行っているプログラムです。
2: int LED=9,GND=10,sw=3; 3: void setup() { 4: pinMode(sw, INPUT_PULLUP); 5: pinMode(LED,OUTPUT); 6: pinMode(GND,OUTPUT); 7: digitalWrite(GND,LOW); 8: }
2行目ではArduinoのピン番号をグローバル変数に代入しています。LEDは発光ダイオードが接続される9番ピン、GNDが発光ダイオードのカソードを接続するグランド代わりの10番ピン、swはタクトスイッチが接続される3番ピンです。それぞれのピン番号を示す値を代入します。
4行目はタクトスイッチが接続されるピンの設定です。pinMode関数で入力設定をしていますが、外付けのプルアップ抵抗が不要になるようにマイコン内部でプルアップする設定になっています。
5行目と6行目でLEDピンとGNDピンを出力設定しています。
7行目では、Arduinoの10番ピンを発光ダイオードのカソードを接続するグランドとして使うためにこのピンをLOWに落としています。
今回紹介するプログラムはArduinoIDEで開発しており、Arduino Pro Microとブレッドボード上に実装した回路で検証したものとします。
Copyright © ITmedia, Inc. All Rights Reserved.