しかし現代の電子回路であるマイコン制御となると話は変わってきます。図3は、マイコンの入力端子にタクトスイッチをつなげた回路図です。
タクトスイッチは押しボタンスイッチの一種で、押下した状態でスイッチの電極の両端が導通します。図3だと、スイッチを押下していない状態では、入力端子に接続されているプルアップ抵抗により+電圧に引っ張られていますので、入力端子の電位はVCCに近い電圧、すなわちマイコンからすればHIGHあるいは1となる値を示します。
タクトスイッチを押下するとスイッチの両接点が導通しますので、入力端子の電位はプルアップ抵抗でVCC電圧まで引っ張られます。しかし、VCCの電圧÷プルアップ抵抗の抵抗値の電流が流れるとグランド電位まで下がります。よってマイコン側から入力端子の値はLOWあるいは0となります。
1: void setup() { 2: pinMode(sw,INPUT_PULLUP); 3: pinMode(led, OUTPUT); 4:} 5:void loop(){digitalWrite(led,(!digitalRead(sw)));}
リスト1は、タクトスイッチの押下をマイコン基板上のLEDの点灯/消灯で確認するためのプログラムです。これらのプログラムはArduinoで動作することを前提としています。
1行目の、マイコンが起動してから一度しか実行されないsetup関数内で、マイコン基板上のLEDが接続されているピンを出力用のピンに設定しているものとします。
2行目では、タクトスイッチが接続されているピンを入力ピンとして設定しています。swには適切なピン番号が設定されているものとします。
5行目の一定間隔で繰り返されるloop関数内では、digitalRead関数で入力端子に接続されているスイッチの開閉の状態を読み込みます。この関数の第1引数で入力端子のピン番号を指定します。スイッチが閉じている場合は0、そしてスイッチが開いている場合は1がこのdigitalRead関数の戻り値となります。
同じく5行目のdigitalWrite関数では、第1引数で指定した出力ピンに対して第2引数(digitalRead)の値を出力します。第1引数のLEDはArduino基板上のLEDに接続されているものとします。
よってこれを実行すると、スイッチを押下するとLEDは点灯し、スイッチを開放すると消灯することになります。このプログラムの場合は、チャタリングが何らかの悪さをすることはありませんが、取りあえず基本的な動作を確認するためのものです。
リスト2は、一度タクトスイッチを押下するとLEDが点灯し、再度タクトスイッチを押下するとLEDが消灯するプログラムです。いわゆるトグル動作をさせようとするプログラムですね。setup()関数は前述のプログラムと同じなのでこのリスト2では割愛しています。
1:void loop() { 2: while(digitalRead(sw)); 3: digitalWrite(led, HIGH); 4: while(digitalRead(sw)); 5: digitalWrite(led, LOW); 6:}
リスト2をプログラマー視点で解釈すると、2行目のdigitalRead関数のwhileループで、この関数の値が0になるまでループを抜けることはありません。すなわちdigitalRead関数の値が1の間は、タクトスイッチが押下されるまでその行にとどまります。そしてスイッチが押下されるとdigitalRead関数の戻り値が0になるので、ループを抜けて次の行に移ります。そして3行目でLEDを点灯させます。
そして次の4行目のループも同様にタクトスイッチが押下されるまでその行を繰り返します。タクトスイッチが押下されループを抜けると5行目に移ってLEDを消灯します。
プログラムを見る限り、タクトスイッチのトグル動作でLEDの点灯と消灯を実現できそうなのですが、実際にArduinoで動作させてみると思う通りには動きません。その原因がタクトスイッチのチャタリングなのです。
今回はチャタリングの原因と現象について確認しました。次回はチャタリングの対策について考察してみたいと思います。お楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.