GPIO制御とチャタリング対策

GPIO入力に対するチャタリング対策は、機械接点のバウンス特性とソフトウェア・ハードウェアの活用が求められる領域です。ソフトウェアデバウンスのカウンター方式やシフトレジスタ方式、長押しや連続押しを含む状態の設計、割り込み駆動での無効化とタイマー二段構え。これらの実装パターンを組みあわせることで、押下感を損なわず誤動作も抑えた入力を実現しやすくなります。この記事ではGPIO基礎、ソフトウェアデバウンス、状態設計、割り込み駆動の4テーマで整理します。

GPIO入力の基本とチャタリングが起きる仕組み

GPIO入力とチャタリング対策の図。1つ目のGPIO入力の基本では、3.3Vからのプルアップ抵抗とスイッチで構成する回路を示し、プルアップ/プルダウンで入力を安定させること、入力しきい値(VIH/VIL)はデータシートで確認することを挙げる。2つ目のチャタリング(接点バウンス)では、押下時と解放時に1〜数ミリ秒のあいだONとOFFが細かく振動する波形を示す。3つ目のハードウェアデバウンスの例では、RC回路とシュミットトリガの組み合わせ、SRラッチ、シュミットトリガ単体の3方式を比較している。

GPIO入力はマイコンの基本機能でありながら、現場でトラブルが多い領域です。プルアップ抵抗の選定、入力しきい値、そしてチャタリングという物理現象の理解が、安定したボタン入力設計の前提となります。

プルアップ・プルダウンと入力しきい値の決め方

オープン状態の入力ピンは不安定な電位(フローティング)となるため、プルアップかプルダウン抵抗で電位を確定させます。内蔵プルアップ抵抗の値は製品ファミリで異なります。例として、あるマイコンでは min 25 kΩ、typ 40 kΩ、max 55 kΩと規定されています。

この値はメーカや製品ファミリにより異なるため、採用する製品のデータシートを必ず確認してください。

ノイズ環境では、内蔵プルアップ(typ 40 kΩ程度)より低い抵抗値として外付け10 kΩ程度を選ぶと、ノイズ耐性が向上します。適切な値は消費電流、配線長、入力リーク、立ち上がり時間などで変わるため、要件にあわせて決めます。3.3 V系と5 V系の混在時は、入力しきい値(VIH、VIL)をマイコンデータシートで確認したうえで、必要に応じてレベルシフターを用いるなどの対策が必要です。各社のマイコンには、5 Vトレラント入力に対応する製品もあります。

機械接点バウンスの典型値と波形

タクトスイッチやリレーの接点は機械的に振動し、押下や解放の瞬間に短時間のON、OFFの繰り返しを生じます。このONとOFFの繰り返しを、本記事ではチャタリング(接点バウンス)と呼びます。典型値は1〜数ミリ秒程度です。

複数種類の機械スイッチを実測した報告では、バウンス時間が150ミリ秒を超えるケースも確認されています。安価なスイッチや経年劣化したものでは、さらに長いバウンスに達する可能性もあります。オシロスコープで波形を見ると、押下1回が複数のパルス列として観測されます。

ハードウェアデバウンス(RC回路、SRラッチ、シュミットトリガー)の選択肢

ハードウェアデバウンスには主に3方式があります。一つ目の方式として、RC積分回路にシュミットトリガーICを組みあわせる方式があります。SR(Set-Reset)ラッチ方式は双投スイッチ(SPDT)の場合に用いられ、長年推奨されている手法です。

シュミットトリガー単体は波形整形(スローエッジの除去)には有効です。ただし、しきい値近傍のアナログ的な揺れを抑えられるだけで、接点が論理的にONとOFFを繰り返す真正のバウンスは残ります。デバウンス専用の手法というよりも補助的な位置付けです。

高いリアルタイム性を求める、メモリに制約があるといったケースでは、ハードウェアデバウンスの実装がおすすめです。なおソフトウェアデバウンスで足りる用途では、ハードウェアデバウンスの実装を省略する場合も多いです。

ソフトウェアデバウンスの実装パターン

ソフトウェアデバウンスは追加部品なしで実装できるかわりに、CPU資源とサンプリング設計を要します。カウンター式とシフトレジスタ式は代表的な方式で、システムの目的や確定時間の長さなどを考慮して選びます。

周期サンプリングと一致カウンター方式

10ミリ秒(ms)周期のタイマー割り込みでGPIO状態を読み、同じ値がN回連続したら確定とする方式です。実装が単純で、単発ボタン1〜数個の監視に向きます。確定までの経過時間は、サンプリング周期Tsと一致回数Nから Td = Ts ×(N−1)で見積もれます。10 ms周期なら3回一致で20 ms、4回一致で30 msです。

シフトレジスタ方式で複数入力を省リソース監視

8 bit変数に毎周期のサンプル値を左シフトしながら格納し、0xFF(連続8回High)または0x00(連続8回Low)を検出する方式です。1入力につき8 bitで済むため、多数の入力ピン監視に向きます。広く紹介されている定番手法で、シフト回数を変えれば確定時間を調整できます。

サンプリング周期と確定時間の決め方

サンプリング周期はチャタリング時間より細かく、確定時間はチャタリング時間より長く取ります。1〜5 msバウンスのスイッチなら、5 ms周期と5回の一致で確定時間を20 msとする設定が一つの方法です。ISR(Interrupt Service Routine)の実行時間の見積もりも忘れず、ワースト実行時間がサンプリング周期の30%以内に収まる設計が、経験的目安をもとにした安全な水準です。

長押し・連続押しまで含む状態設計

押下と解放を検出するだけのデバウンスでは、長押しやダブルクリック、連続押下といった操作には対応できません。状態マシンで管理すれば、これらの操作判定とチャタリング対策を分離して実装できます。

IDLE、PRESS、HOLD、RELEASEの4状態モデル

IDLE(未押下)から始まり、PRESS(押下確定)、HOLD(押下継続中)、RELEASE(解放確定)と遷移する4状態で管理します。各状態間の遷移条件にデバウンス確定を組み込めば、誤検出を防ぎつつ操作種別を区別できます。

長押し、短押し、ダブルクリックの判定

PRESSからRELEASEまでの経過時間で短押し(300ミリ秒未満)と長押し(500ミリ秒以上)を分けます。中間領域(300〜500ミリ秒)は短押しか長押しのいずれかへ寄せるか、無効として扱うかを製品のUI仕様で明示的に定義します。RELEASE後の一定時間内(300ミリ秒)に再PRESSがあればダブルクリックとして扱います。

チャタリング対策と状態遷移の責務分離

低層モジュールがデバウンス確定信号を生成し、上位モジュールが状態遷移と操作判定を担う構成にすると、テストと保守が楽になります。デバウンス層を差し替えれば、物理ボタン以外(タッチセンサやリモコン)にも応用できます。

割り込みエッジ検出のチャタリング対策

GPIO割り込みでボタンを監視する設計は応答性に優れる反面、チャタリングによる連続的な割り込みはCPUを過剰に消費するおそれがあります。この事態を解決する方法の一つに、割り込みとタイマーを組みあわせた手法があります。

外部割り込みが連続発火する問題

外部割り込みの名称や構成はマイコンのベンダーにより異なり、専用の外部割り込みコントローラを備えるものや、割り込みコントローラ経由でIRQピンを扱うものがあります。立ち下がりエッジで割り込みを設定すると、チャタリングのパルスごとにISRが呼ばれてしまいます。1回の押下でISRが十数回呼び出され、優先度の高い処理を妨げる可能性もあります。割り込み単体、つまり無効化やタイマーによる確認を伴わない構成に頼ったデバウンスは、一般に動作不良を起こしやすい設計です。

割り込み無効化とタイマー二段構えの定番手法

外部割り込み受信後、ISR内で当該ピンの割り込みを無効化し、デバウンスタイマーを起動します。タイマーの値は使用するスイッチの実測バウンス時間に基づいて調整し、典型的には10〜50 msを目安とします。タイマーのISRでGPIOを再読み込みし、確定なら本処理を起動、その後に割り込みを再有効化する二段構えで対策します。連続割り込みが抑えられ、CPU負荷も下がります。

省電力モードとの両立

バッテリ駆動の機器ではボタン待ちでマイコンをスリープに入れたい場面があります。外部割り込みをウェイクアップ要因に設定すると押下で復帰でき、復帰後にタイマー二段構えでデバウンス処理を完了させます。スリープ復帰時の発振安定時間で確定時間を調整します。

チャタリングは機械接点である以上避けられない物理現象で、ハードウェアとソフトウェアを組み合わせて対策します。ソフトウェアデバウンスはカウンター方式とシフトレジスタ方式、長押しは4状態のモデル、割り込み駆動は無効化とタイマー二段構えが標準的な手法です。このように、GPIOの割り込み処理で用いた「初期化、ハンドラ最小化、上位タスク委譲」のパターンは、I2C、SPI、DMAなどのほかの周辺機能でも同様に適用されます。

組み込みソフトの世界 トップへ戻る