電子工作の知恵袋

 
 

 

PixiModule UART
USB-UART変換ケーブル




 

    *コンテンツはお客様ご自身のご判断と責任においてご利用ください。
     また、掲載内容を他に流用・転載することは一部・全てを問わず固くお断りいたします。
     引用する場合はリンク表示にてお願いいたします。
     


電子工作の知恵袋


PIC16F690のスイッチ入力処理

 

 

    マイコンボードで使うスイッチの接続と処理例をご説明します。

    スイッチはどこにでもある汎用的な電気部品の一つです。

    しかし、マイコンで使用するには、実はちょっとしたコツが必要だということをご存じでしたか?

     

     


     

     

     

    このページでは、当店提供の汎用Cソースコードを使います。

    PIC16F690マイコンモジュールで使用することができる各種Cソースコードはユーザーサポートページからダウンロードできます。

     

    また、ここでご説明する内容は当店の商品であるPIC16F690マイコンモジュールを前提としています。

    他社製マイコンボードでの作動は一切関知していませんのでご注意ください。 

     

     

     

      

     

 

    (1)使用するボードと配線の一例

     

    PIC16F690マイコンモジュール(*例に挙げているマイコンモジュールは販売終了しました。)のIO0〜IO7は10kΩのプルダウン抵抗をボード上に実装した構成となっています。

    これは、入力で使用する場合に、回路のインピーダンスを下げて、外来ノイズに少しでも強くするためです。

    また、オフした時にオープンになるタイプのスイッチでも使用できるようにするためでもあります。

     

    以下は、使用するマイコンボードの大まかなブロック図です。

     

     

     

     

     

    今回の説明では、以下のようにIO0にスイッチを接続します。

     

     

     

    抵抗・LEDと電源とスイッチを接続するだけのシンプルな回路構成です。

     

    さて、スイッチで金属接点を使ったタイプは、押したり離したりした瞬間にチャタリング(バウンス)という現象が発生します。(ゴム接点を使ったタイプは発生しにくい)

     

    現象としては、スイッチ内部の接点が接触(オン)したり跳ねたり(オフ)することを短時間のうちに何回か繰り返すことを指します。

    ボールを高いところから落とすと、何回か跳ねますが、それと良く似た現象です。

    その他、クリップタイプ接点構造のスイッチ(スライドスイッチなど)はチャタリングとは異なるオンオフ現象を起こします。

     

    微妙に異なる現象がいろいろあって紛らわしいのですが、結局は電気的にみればオン・オフ・オープンを短時間に繰り返す現象としてとらえることができます。

     

    このチャタリングの継続時間はまちまちで、新品と古いもの温度や湿度などで異なるのはもちろんのこと、Aという人とBという人の違いにも影響されます。

    一般的には継続時間は数百μSから数十mSのものが多いようです。

     

     

    では、これらのチャタリングがあるスイッチの信号をマイコンで読み取った場合、どうなるでしょうか?

     

    マイコンは猛烈なスピード(通常μ秒単位)で作動していますので、ポートにつながったスイッチの信号も一瞬で読み取ってしまいます。

    もし、読み取った瞬間がチャタリングの最中だったら、どうなるでしょうか?

    例えば、スイッチが一回オンするたびに、カウントするプログラムを作ったとします。

    しかし、チャタリングのせいで、一回スイッチを操作するたびに、何十回もカウントが進んでしまうことになってしまいます。

     

    これは、困ります。

     

    信号を確定できない程度ならまだいいのですが、何十回も余計にカウントしてしまうということになるわけですから、マイコンは誤動作ばかりおこしてしまうでしょう。

     

     

     

     

     

    (2)ソフトウエア

     

    さて、困った問題ではありますが、マイコンのソフトウエアで、バウンスやチャタリングの起こっている信号をキャンセルというかフィルタリングする必要があります。

    一般的な手法としては、時間差で数回読み取って確定させる手法が主流です。

     

    一例として、信号の変化を検出したら、時間をおいて再度読み取り、一致したら確定します。

    また、他の方法として、一定期間毎に読み取り、例えば3回連続で一致したら確定とみなす方法があります。

     

    これは、チャタリングがある時間継続するということと、その最中は信号が確定していないという現象を利用した方法です。

     

     

     

     

     

    (プログラム例)

    信号の変化を検出したら、時間をおいて再度読み取り、オンでLEDを点灯させオフで消灯させるプログラムの一例

     

     

    unsigned char temp=0;    //テンポラリー変数

    unsigned char qportc=0;    //過去値記憶用

     

    //メインルーチン開始------------------------------------------

     

        while(1){

     

            while(temp==qportc){            //信号変化街待ち

                   temp=PORTC & 0x01;

            }

     

            wait(30);                       //30mS待機

     

            if((PORTC & 0x01) != temp){

                   break;                   //一致しない場合は、最初に戻る

            }

     

            qportc=temp; //過去値更新

     

       

            if(temp==0x01){

                pwmsetduty(0xff);               //LED点灯

            }

            else{

                pwmsetduty(0);                  //LED消灯

            }

     

        }

     

        //メインルーチン終了------------------------------------------

     

     

    上記は、IO0の信号を読み取るプログラムの例です。

    IO0はマイコンボードの内部では、以下表のようにマイコンポートのRC0に接続されています。

     

     

     

    プログラムでは、スイッチの確定情報は’temp’に入ります。

    スイッチの情報が変化すると30mS後に再度読み取りを行い、一致した時のみLEDの点消灯プロセスを行います。

     

    確定に30mS必要ですが、人間の感覚としてはほぼリアルタイムに検出できますので問題ありません。

    ただ、ロータリースイッチなどでは、ぐるぐる回すとスイッチの切り替え速度が速いことがあり、30mSでは長すぎることがあります。

    その場合は、実際に実験しながら時間を決めていきます。

     

    しかし、世の中、どうしてもチャタリングがあると困るという場合もありますので、そういう時はフォトインタラプター等の電子的にオンオフする素子を使って根本原因から解消しなければなりません。

     

     


カテゴリ
電子工作の知恵袋 最新情報