前回のエントリーで、pigpioを使用したボタンを使用したLEDの点灯/消灯について書きました。今回は、ボタンの操作に対するチャタリング対策を記載します。1.チャタリングって?チャタリングとは、H/Wのボタンを押した際に発生する機械的な振動のことです。電気的なHIGH/LOWの変化も発生します。そのため、実際にはボタンを押した回数が1回でも、複数回の割込み処理が発生してしまいます。この「複数回の割込み」へ対処し、1回のボタン押下に対して1回の割込み処理が発生するようにすることが、「チャタリング対応」です。2.チャタリング対策チャタリングは、次のように対策するのが、一般的です。1回目の割込み発生時に、対応するピンへの割込み処理を禁止し、同時にタイマーをスタート。タイマーが満了した際の処理において、ボタンに対する処理を実施します。同時に、再度ピンへの割込み処理を、再度有効にします(禁止の解除)。3.pigpioではどうする?pigpioでは、割込み禁止処理のための明確な関数は用意されていないようです。(違っていたらごめんなさい。)そのため、一度割込みの設定を解除して、タイマーが満了したら再度割り込みを設定しなおす、というものです。具体的なコードは、下記に示します。IRQHandler);で、それぞれ実施されています。この実装には問題があります。1つ目は、「割り込みの再設定」ができない、という問題です。fault」が発生する、問題です。1つ目については、(おそらくですが)タイマースレッドで割り込みの設定を行っていることが原因かと考えています。(実際、上記コードでgpioSetISRFunc()の結果を確認したところ、「OK(0)」が返っていました。)2つ目の問題は、1つ目と関連しており、割り込みの再設定ができておらず、その結果、終了処理の際に2重開放が発生している、というものです。faultが発生する際には、下記のメッセージが表示されるようになっています。(fasttop):そんなわけで、上記に示した実装では、割込み禁止ができませんでした。割込み解除~再設定の代わりに、自前で割込み禁止処理を実装します。自前で「割込み禁止」を示すフラグを用意し、そのフラグが「真」の場合には割込みハンドラ内での処理を実行しないようにします。(割込みハンドラ自体は、呼び出されてしまいます。)具体的なコードを示します。0;}IsInCriticalSectionが、「自前の割込み禁止フラグ」です。割込みハンドラの先頭で、このフラグの真偽を判定し、「真」の場合にのみタイマーをスタートしています。加えて、タイマーが満了していた際に、ボタンが押されていた場合にのみ、ボタンに対する処理を実施します。これは、ボタンを間違って押した場合、およびボタンを放した場合への対処のためです。(基本的に、ボタンを放した場合には割込みは発生しないはずですが、念のため、ということで。)以上、今回はRaspberryPiとpigpioを用いたチャタリング対策と、その実装方法について記載してきました。今回は何も言いますまい!ではっ!!Tweet関連記事Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。RaspberryPiのOS:Raspbianの新しいバージョンが、少し前(...なの記事を読むEV3開発サポートツール(2)-C#のユーザーコントロール開発(2つ目)どもです。前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての記事を読むC言語でEV3開発(21)-モーター出力の制御どもです。前回は、超音波センサから前方障害物との距離を取得し、それを元に安全状態を判断する、とい記事を読むQtでRaspberryPi/GUI開発(3):ためしに時計を作ってみた(其の参)-StyleSheetの適用どもです。前回のエントリーでは、グループ化されたボタンに対するイベントハンドラについて書きました記事を読むC言語でEV3開発(4)どもです。今回のエントリーは、前回のエントリー内容/EclipseでEV3の実行ファイルをビルド記事を読むC言語でEV3開発(9)-opOUTPUT_SPEEDコマンドどもです。今回のエントリーでは、前回に引き続きEV3のモーターを動かしていきます。記事を読むC言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンドどもです。今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE記事を読むフォトレジスタを使ってみた-Arduinoで光検出どもです。今回は、タイトル通り「フォトレジスタの使い方」です。1.フォトレジスタって何?記事を読むRaspberryPiのOS:RaspbianをNOOBSでセットアップしてみたどもです。今回の内容は、「今更!?」ですがNOOBSでRaspbianをセットアップしたとい記事を読む温度(湿度)センサを使ってみた(2)-RaspberryPi/pigpioでDHT11どもです。前回は、DHT11をAdrudinoにつないで温度/湿度を測定してみました。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイト上に表示された文字を入力してください。ENTRYSourcetrailを試してみました(2)-Eclipseと連携どもです。前回のエントリで、ソースコードを解析するオープンソース「Sourcetrailを試してみましたどもです。最近、ソースコードの解析に役に立ちそうなツールを見つ土壌湿度センサーの出力値の比較:SEN0114とSEN0193どもです。今回も、センサーの性能、測定結果を比較してみた結果につい温度センサの出力値の比較どもです。今回は、センサーの性能、測定結果を比較してみたので、それ自宅で電子工作(2)-ラズパイのSPIコネクタ自作どもです。今回は、電子工作です。最近のコメントRasbianの新しいバージョンが出たので、クロス環境を更新してみた。Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。