図3は今回実験に用いるマイコンとタクトスイッチをブレッドボードに装填したものです。
Arduino Nano Atmega168をブレッドボードに装填していきましょう。このマイコンは片側15ピンでそれがもう片方にあります。ブレッドボードは横に付されている若い番号側を左に置きます。そしてマイコンボードは、図3のようにUSBのコネクターがある方を左にして、1〜15番にマイコンボードのピンを差し込みます。
タクトスイッチはブレッドボードの10番と12番に差し込みます。Arduino側のピンには12番がグランドで10番側が3番入出力ピンに接続されています。すなわち右側のタクトスイッチを押下するとArduinoの3番入出力ピンがグランドに短絡します。もうひとつタクトスイッチがありますが、これは次回登場します。
リスト1はタクトスイッチを押下するたびにカウンターがインクリメントするプログラムです。
1: // COUNTER 2: int sw=3; 3: void setup() { 4: pinMode(sw, INPUT_PULLUP); 5: Serial.begin(9600); 6: } 7: void loop() { 8: static int stat = 0,start = 0,count=0; 9: if (digitalRead(sw) == HIGH) { 10: if (stat == 0) start = millis(); 11: stat = 1; 12: } else { 13: if (stat == 1 && millis() - start >= 10) Serial.println(count++); 14: stat = 0; 15: } 16:}
2行目ではタクトスイッチの接点の一方が接続されているマイコンの入出力ピン番号を宣言した整数変数swに3を代入しています。
3〜6行目の中括弧で囲まれたコードはsetup関数です。電源投入時あるいはリセット時に1度だけ実行されます。
1980年代に外資系のコンピュータ会社で働いていた際に、本社にC言語に関する問い合わせを行う機会が何度かありました。その手段としてテレックスしか使えなかったのですが、リスト1で使用している中括弧({、})が打てないのです。この中括弧をアルファベットだけで表現しなくてはならず苦労したことを思い出します。ちなみに中括弧は“brackets parentheses”です。
さて、その中括弧で囲まれた部分のコードの解説ですが、4行目では3番入出力ピンを入力ピンに設定し、なおかつマイコン内部でプルアップ設定にしています。プルアップについては以下の記事を参照してください。
5行目ではシリアルポートの設定を行っています。ボーレートは9600bpsです。PC側でUSB経由でタクトスイッチの押下計数の値をモニタリングするための準備です。
7行目からloop()関数のコードが始まります。この関数のコードは一定間隔で呼び出される関数です。
8行目はこの関数内で使う変数を宣言しています。これらの変数は整数でかつstatic変数ですから、この関数に再入したときでも値は保持されます。statはチャタリング対策のためタクトスイッチの状態を保持する変数です。取り得る値は0か1のみです。startはタクトスイッチの状態が変化した時点の時間を保持する変数です。次のcountはタクトスイッチを押下した回数をカウントする変数です。初期値は0にしています。
9行目ではタクトスイッチが解放されたとき、10行目では押下からそれが最初ならstartのその時刻をms単位で記録します。そして11行目で、スイッチが押下されていないことを示すstatの値を1にします。
12行目からelseで15行目でクローズしますが、ここで実行されるコードはタクトスイッチが押下されたときに実行されます。まず13行目のif文は、タクトスイッチが押下されたなら、解放されていた時間から10ms経過したのであれば、変数countをインクリメントしてその値をPCにシリアル経由で送ります。その値はPC側のArduinoIDEのシリアルモニターに表示されます。そして14行目ではタクトスイッチが押下されたことを示すstatの値を0にします。
今回は計数動作におけるチャタリング対策について解説しました。次回はチャタリング対策を行いつつ複数の機械系接点開閉回数を数える回路とプログラムに挑戦してみたいと思います。
Copyright © ITmedia, Inc. All Rights Reserved.