« モールス受信練習機で「はてなボタン」を作ろう | メイン | 拡張PIC16実験 内蔵温度センサを試す(1/2) »

モールス受信練習機でセンサ・オルゴールを作ろう


 エレキジャックNo.20のモールス受信練習機でできることは、モールス練習だけではありません。今回は明るくなったらメロディが鳴るセンサ・オルゴールを作ってみます。

■準備しよう
  まずはモールス受信練習機を完成させます。モールス受信練習機は部品セットを利用できます。プログラムを変更するために、PICkit3 (デバッガ兼プログラマ、秋月電子マルツパーツ館共立エレショップなどで入手できる)と MPLAB IDE が必要です。以下では MPLAB IDE 8.80 を使っています。以前の記事を参考にMPLAB IDE をインストールしておきます。

■プログラムを書き換える
 EJ-melody1822_CdS.zipをダウンロードして適当なフォルダ(C:\など、日本語がパスに入らないところがよい)に展開します。モールス受信練習機をつないだPICkit3をパソコンにつないでおきます。EJCW.mcpをダブルクリックすると、MPLAB IDEが起動します。メニューのProjectにあるBuildをクリックしてコンパイルします。コンパイルできたら、Programアイコンをクリックするか、ProgrammerメニューからProgramをクリックしてPICマイコンにプログラムを書き込みます。エラーがなければOKです。

■書き込んだプログラムの内容

 ソース・ファイルmain.cを見てみましょう。main関数を探すと、
void
main(void)
{
    init();                 // 初期化

    for (;;) {              // 以下をずっと繰り返す
        while (BIT_SW != 0) // タクト・スイッチ SW1 が押されるまで待つ
        {
        }
        play_melody("G2a2b6a2G2 6G2a2b2a2G2a6"); // チャルメラ
    }
}
と書いてあります。for(;;)は続く{と}の間のプログラムをずっと繰り返します。つぎのwhileでは、BIT_SW != 0が成立する間、次の{と}の間のプログラム(今回は何もしない)を繰り返します。BIT_SWはスイッチを押すと0に、押していないときには1になります。
 したがって、マイコンは電源が入っている間、スイッチが押されるとメロディ(チャルメラ)を演奏することを繰り返します。

■スイッチの代わりにボリュームを使う
 PIC12F1822マイコンの5ピンにボリュームがつながっています。ボリュームを回すと5ピンの電圧が0[V]から3[V](電源の電圧)の範囲で変わります。次のように書くとPICマイコン内蔵のA-D変換器(コンバータ)を使って、5ピンの電圧を0から255の数値として知ることができます。
GO_nDONE = 1;    // GO_nDONEを1にすると A-D 変換開始
delay(10);              // 一定時間待つ
GO_nDONE = 0;   // GO_nDONE を0にする
 C言語では = は、等しいではなく代入(変数に値を入れる)という意味です。delayは指定した数値×[μ秒]だけプログラムの実行を止めます。変換した結果はADRESH変数に入っています。

 A-D変換結果の数値は5ピンの電圧に比例していて、
(5ピンの電圧)÷(電源電圧)×256
で計算できます。そこで、
void
main(void)
{
    init();                 // 初期化

    for (;;) {              // 以下をずっと繰り返す
        do                  // 5ピンの電圧が下がるまで待つ
        {
            GO_nDONE = 1;   // GO_nDONEを1にすると A-D 変換開始
            delay(10);      // 一定時間待つ
            GO_nDONE = 0;   // GO_nDONE を0にする
        } while (ADRESH>128);    // 条件が成り立っているなら上を繰り返す
        play_melody("G2a2b6a2G2 6G2a2b2a2G2a6"); // チャルメラ
    }
}
と書き換えてから、さきほどと同じようにBuild, Programをクリックして、コンパイル、プログラムの書き込みをしてみます。ボリュームを右に回してA-D変換結果が128以下(電源電圧の半分以下)になるとメロディが流れます。

 上のプログラムで do { と } while で囲まれた範囲があります。まず1回 {と}の範囲を実行して while の次の式 ADRESH>128 が成り立っていれば、{と}の間を繰り返します。{と}にはA-D変換が書いてあるので、ADRESH>128の間はずっとA-D変換を繰り返して待ちます。

■光センサ(CdS)をつける
 光センサとして明るくなると抵抗値が小さくなるCdSを使います。CdSは秋月電子マルツパーツ館共立エレショップなどで購入できます。CdSを写真のようにPICマイコンの5ピンと8ピン(グラウンド・ピン)の間につなぎます。

CdS.jpg
光センサCdS。今回の工作では大きさは気にしなくていい。

kiban.jpg
CdSを5ピンと8ピンの間につなぐ。向きはない。写真では挿しているだけだが、はんだ付けする。

 こうすると明るくなると抵抗値が下がって、5ピンの電圧が低くなります。ボリュームを回して、CdSに光が当たらないとき(CdSを手などで塞いだとき)にメロディが流れず、光が当たるときにメロディが流れるようにすれば完成です。

 短いメロディのほうが調整はやりやすいので、
play_melody("c2");
などと変更しておき、調整してからメロディを書き換えるといいでしょう。

■応用しよう
 このセンサ・オルゴールをプレゼントの箱の中に入れると、箱を開けたときにメロディが流れます。誕生日プレゼントなどにも使えそうです。箱を開けるときの明るさと電池がなくならないように注意してくださいね。
void
main(void)
{
    init();                 // 初期化

    for (;;) {              // 以下をずっと繰り返す
        OSCCON = 0b00001000; // 動作周波数を 31[kHz] にする(省電力のため)
        do                  // 5ピンの電圧が下がるまで待つ
        {
            GO_nDONE = 1;   // GO_nDONEを1にすると A-D 変換開始
            delay(10);      // 一定時間待つ
            GO_nDONE = 0;   // GO_nDONE を0にする
        } while (ADRESH>128);    // 条件が成り立っているなら上を繰り返す
        OSCCON = 0b01101000; // 動作周波数を 4[MHz] にする
        play_melody("G2a2b6a2G2 6G2a2b2a2G2a6"); // チャルメラ
    }
}
とすると、待っている間のPICマイコンのクロックを下げられます。少し省電力になって電池の持ちがよくなります。
(光永 法明)

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/6280





カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1
/*yahoo remove*/