*

QtでRaspberryPi/GUI開発(6):pigpioを使用したチャタリング対策

公開日: : C++, C言語, pigpio, Qt, RaspberryPi, 開発

どもです。
前回のエントリーで、pigpioを使用したボタンを使用したLEDの点灯/消灯について書きました。
今回は、ボタンの操作に対するチャタリング対策を記載します。

1.チャタリングって?
チャタリングとは、H/Wのボタンを押した際に発生する機械的な振動のことです。
当然、電気的なHIGH/LOWの変化も発生します。
そのため、実際にはボタンを押した回数が1回でも、複数回の割込み処理が発生してしまいます。
この「複数回の割込み」へ対処し、1回のボタン押下に対して1回の割込み処理が発生するようにすることが、「チャタリング対応」です。

2.チャタリング対策
チャタリングは、次のように対策するのが、一般的です。
即ち、1回目の割込み発生時に、対応するピンへの割込み処理を禁止し、同時にタイマーをスタート。
タイマーが満了した際の処理において、ボタンに対する処理を実施します。
また同時に、再度ピンへの割込み処理を、再度有効にします(禁止の解除)。

3.pigpioではどうする?
pigpioでは、割込み禁止処理のための明確な関数は用意されていないようです。
(違っていたらごめんなさい。)
そのため、一度割込みの設定を解除して、タイマーが満了したら再度割り込みを設定しなおす、というものです。
具体的なコードは、下記に示します。

「割り込みの解除」は、

そして、「割り込みの再設定」は、

で、それぞれ実施されています。

しかしながら、この実装には問題があります。
1つ目は、「割り込みの再設定」ができない、という問題です。
2つ目は、「終了時にSegmentation fault」が発生する、問題です。

1つ目については、(おそらくですが)タイマースレッドで割り込みの設定を行っていることが原因かと考えています。
(実際、上記コードでgpioSetISRFunc()の結果を確認したところ、「OK(0)」が返っていました。)
2つ目の問題は、1つ目と関連しており、割り込みの再設定ができておらず、その結果、終了処理の際に2重開放が発生している、というものです。
Segmentation faultが発生する際には、下記のメッセージが表示されるようになっています。

そんなわけで、上記に示した実装では、割込み禁止ができませんでした。

4.自前で割込み禁止
割込み解除~再設定の代わりに、自前で割込み禁止処理を実装します。
即ち、自前で「割込み禁止」を示すフラグを用意し、そのフラグが「真」の場合には割込みハンドラ内での処理を実行しないようにします。
(割込みハンドラ自体は、呼び出されてしまいます。)
具体的なコードを示します。

IsInCriticalSectionが、「自前の割込み禁止フラグ」です。
割込みハンドラの先頭で、このフラグの真偽を判定し、「真」の場合にのみタイマーをスタートしています。
加えて、タイマーが満了していた際に、ボタンが押されていた場合にのみ、ボタンに対する処理を実施します。
これは、ボタンを間違って押した場合、およびボタンを放した場合への対処のためです。
(基本的に、ボタンを放した場合には割込みは発生しないはずですが、念のため、ということで。)

以上、今回はRaspberryPiとpigpioを用いたチャタリング対策と、その実装方法について記載してきました。

えーっと…。
今回は何も言いますまい!

ではっ!!

関連記事

RasPi_Qt

Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。

どもです。 RaspberryPiのOS:Raspbianの新しいバージョンが、少し前(…なの

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(2)-C#のユーザーコントロール開発(2つ目)

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

no image

C言語でEV3開発(21)-モーター出力の制御

どもです。 前回は、超音波センサから前方障害物との距離を取得し、それを元に安全状態を判断する、とい

記事を読む

no image

QtでRaspberryPi/GUI開発(3):ためしに時計を作ってみた(其の参)-StyleSheetの適用

どもです。 前回のエントリーでは、グループ化されたボタンに対するイベントハンドラについて書きました

記事を読む

no image

C言語でEV3開発(4)

どもです。 今回のエントリーは、前回のエントリー内容/EclipseでEV3の実行ファイルをビルド

記事を読む

no image

C言語でEV3開発(9)-opOUTPUT_SPEEDコマンド

どもです。 今回のエントリーでは、前回に引き続きEV3のモーターを動かしていきます。 ただし、単

記事を読む

no image

C言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE

記事を読む

Arduino_Logo

フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。 1.フォトレジスタって何?

記事を読む

no image

RaspberryPiのOS:RaspbianをNOOBSでセットアップしてみた

どもです。 今回の内容は、「今更!?」ですがNOOBSでRaspbianをセットアップしたとい

記事を読む

Rasp_DHT11

温度(湿度)センサを使ってみた(2)-RaspberryPi/pigpioでDHT11

どもです。 前回は、DHT11をAdrudinoにつないで温度/湿度を測定してみました。 そこで

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

source_trail_eye_catch
Sourcetrailを試してみました(2)-Eclipseと連携

どもです。 前回のエントリで、ソースコードを解析するオープンソース「

source_trail_eye_catch
Sourcetrailを試してみました

どもです。 つい最近、ソースコードの解析に役に立ちそうなツールを見つ

SEN0193_0114_eye_catch
土壌湿度センサーの出力値の比較:SEN0114とSEN0193

どもです。 今回も、センサーの性能、測定結果を比較してみた結果につい

ADT7310_DHT11_eye_catch
温度センサの出力値の比較

どもです。 今回は、センサーの性能、測定結果を比較してみたので、それ

DIY_eye_catch
自宅で電子工作(2)-ラズパイのSPIコネクタ自作

どもです。 今回は、電子工作です。 1.何を作った 今回紹介

→もっと見る

PAGE TOP ↑