目次>6章 第3ステップ(実用品)>(3)拍手スイッチハードウェア編

拍手スイッチ (PIC12F683)

− ソフトウェア編 −

更新日2006.9.10

PIC12F683を使った拍手スイッチの続き(ソフトウェア編:プログラム作成)です。

プログラムの仕様
PICの入力信号

GP3の波形を調べてみました。
以下のオシロスコープの表示は、拍手のパターンが「パパン パパパン」の場合です。

最初の「パパン」の部分を、時間を拡大してみると以下のようになっています。
拍手1回でも、PICの入力としては何回かON/OFFを繰り返しています。今回のケースでは、1回の拍手でピン変化割り込みが何回も発生してしまいます。

この対処は、「スイッチのチャタリング(ノイズ)を取り除く」と似た方法を取ることにします。

プログラムでの処理イメージ

オシロスコープの波形をイメージ的に表し、考え方を説明します。

1回の拍手でピン変化割り込みが何回も発生することを防止するために、一度ピン変化割り込みを検出したら一定時間(図のa)ピン変化割り込みを禁止します。
これで、1回の拍手を1回のピン変化割り込みとして処理できます。

拍手と拍手の間隔は、短いパターン:短拍(図のb)と長いパターン:長拍(図のc)の2種類として区別します。
プログラムでは、短拍を「1」、長拍を「0」として扱いました。
上の「パパン パパパン」は、「1011」となります。

そして、一定の無音時間(図のd)が経過した時、それまでの拍手パターンを判定します。

拍手のパターンとプログラムでの認識,スイッチの制御は以下の通りです。
拍手のパターン(入力)プログラムでの認識スイッチの制御(出力)
パパン パパン101全てのスイッチをOFF
パパパン パン パン1100スイッチ1のみON
パパン パパパパン10111スイッチ2のみON
パパン パパパパパン101111スイッチ3のみON
【参考】
短拍と長拍を組み合わせた理由は、ヘリの音やセミの鳴き声でスイッチが入らないようにするためです。
会社に行っている間に、電車の音でテレビのスイッチが入り、カエルの鳴き声でビデオの録画が始まると困りますので・・


それぞれの時間は以下の通りとしました。
90mS
20mS〜200mS
300mS〜500mS
600mS
関係ない音での誤動作を防止するために、これ以外の信号は無視してリセットするようにしています。

プログラムの概要

プログラムの処理フローを以下に載せておきます。

メイン処理

フローで、「状態」と表現している変数は、プログラムでは「STATE」と定義しています。
状態=1は、ピン変化割込み発生から90mS間ピン変化割込みを禁止する期間です。90mS経過後2に変更します。
状態=2は、次のピン変化割込みを待っている状態です。
状態=3は、SLEEPモードに移行する前段階で、1回のリズムの処理が終わったときか、無関係なリズムを検出したときに3にします。 この状態のときは、ピン変化割込みを禁止し50mS経過後SLEEPモードにします。



プログラム全体
上記の処理を組み込んだプログラムはこちらです。

回路図には載せませんでしたが、GP4に800Ωの抵抗を直列にして緑色LEDを接続して下さい。(GP0〜2と同様な接続)
音を検出したときに90mS間点灯しますので、デバッグや調整に役立つと思います。最終的には不要です。

このソースプログラムをメモ帳などのテキストエディタに取り込んで、CLAP.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。

今まで、PIC16F84Aを使用していた場合は、MPLABのプロジェクトウィザードで「PIC12F683」を選択して下さい。
また、PICライタでも同様に「PIC12F683」を選択して下さい。

この拍手スイッチで何を制御するかは考えて見て下さい。
次の実践編では蛍光灯の制御に使っています。


ハードウェア編に戻る  実践編に続く