【Raspberry Pi Pico入門 – 5】スイッチでモード切替をする

2023年10月16日Raspberry Pi Pico入門,基本編

概要

前回はボタンを押している間だけLEDが点灯する回路を作りましたが、今回はボタンを押すたびにON/OFFが切り替わる回路を作ります。

実行環境

IDE:Arduino IDE 2.1.1
MCU:Raspberry Pi Pico

今回のテーマ

  • スイッチのチャタリング対策を学ぶ

回路

回路は前回のものをそのまま使います。

コーディング

新しくスケッチを作成し、以下の内容をコピペしてください。

const int SW_PIN = 16;
int led_state = 0;

void setup() {
  Serial.begin(115200);
  pinMode(SW_PIN, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if (digitalRead(SW_PIN) == LOW) {
    delay(20);
    if (digitalRead(SW_PIN) == LOW) {
      led_state = 1 - led_state;
      digitalWrite(LED_BUILTIN, led_state);
    }
    while (digitalRead(SW_PIN) == LOW) {};
  }
}

動作確認

スイッチを押すたびにON/OFFが切り替われば成功です。

解説

チャタリングとは

チャタリングとはスイッチを切り替えた瞬間に一瞬だけON/OFFを繰り返す現象のことを言います。原理は諸説ありますが接点の弾性振動によるものとする説が多いようです。(個人的にはそれだけじゃ説明できない気がしてます)
実際のチャタリングは下図のようになっています。この図では2.6[ms]の間、何度もON/OFFを繰り返しています。

※wikipediaより引用

このような現象が起こると、今回のようにスイッチでモード切替機能を作ろうとすると一瞬だけモードが何度も切り替わってしまうことになります。これを防ぐには大きく分けて2種類の方法があります。

チャタリング対策(ソフトウェア)

今回はこちらで対策しています。何度もON/OFFするのであれば、最初の一回以外は無視すればいい!という考え方です。
とはいえ、どんな変化にも反応しているとノイズ等で一瞬だけ電圧が揺れたときも反応してしまうので注意が必要です。

最初のif文は1回目のLow→Highの変化で反応します。
その後は何もせずに20[ms]待機して、待機が終わった時点でまだLowのままだったらモード切替の処理に入ります。

その後はボタンが離されるまで何もしないwhile文をぐるぐるループして待機します。
これをやらないとボタンを押している間は20[ms]間隔で何度もモード切替処理をしてしまいます。

チャタリング対策(ハードウェア)

チャタリングをノイズの一種として考え、電子回路にノイズ対策回路を追加する方法です。
※スターターキットでは部品が足りないので、興味がある方は部品を追加購入してください。

ノイズ対策にも種類が色々ありますが、手軽に作れるのは抵抗とコンデンサーで作るCRフィルタです。
CRフィルタは「ローパスフィルタ」の一種で、電圧の急激な変化を抑えてノイズをつぶしてしまう回路となります。
原理についてはここで説明すると長くなるので参考サイトにお任せします。

今回の場合、すでに3.3kΩの抵抗が付いているので下図のように0.33~1uF程度のコンデンサを追加することでCRフィルタを形成することが出来ます。

CRフィルタには「カットオフ周波数」というパラメータがあります。大雑把に言えば「この数字より大きい周波数は通さない」というパラメータです。
この数字は抵抗値とコンデンサーの容量から計算することが出来ます。

その他のチャタリング対策

チャタリング対策はソフトでもハードでもいろんな種類があります。
他の方法については別途、解説の投稿をする予定です。