ブレッドボードラジオAVRマイコン入門

BASCOM-AVR 音出し(その4)

 音出しプログラムと入力スイッチを組み合わせて、モールス練習器やタイマーの実験をしました。

1. モールス練習器(その1)

 押しボタンスイッチを押している間だけ「ピー」という音が出るプログラムです。PB0〜GND間に押しボタンスイッチをつけました。回路は下記の通りです。ICのクロックは内蔵RC発振です。

 第1図

 プログラムは下記の通りです。条件分岐を用いて、スイッチの接点が閉じたとき(「Pinb.0 = 0」のとき)、出力PA0を高速でオンオフさせて音を出します。周波数は約810Hzです。

 プログラムファイル afosc4a.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = Output ポートAを出力に設定。
5 Config Portb = Input ポートBを入力に設定。
6 Portb = 1 ポートBを「1」にする。PB0をプルアップ。
7
8 Do Doループの範囲ここから。
9  If Pinb.0 = 0 Then 条件分岐。「Pinb.0 = 0」ならば、
10  Toggle Porta.0 PA0の出力を反転する。
11  Waitus 600 600μ秒間そのまま。
12  End If 条件分岐プログラムここまで。
13 Loop Doループの範囲ここまで。8行目へ戻る。
14
15 End 終わり。

2. モールス練習器(その2)

 押しボタンスイッチが2個付いているモールス練習器です。回路図を下に掲げます。PB0に接続されたスイッチS1を押すと長点が連続して出ます。「ピーピーピーピー・・・」という感じです。PB6に接続されたスイッチS2を押すと短点が連続して出ます。こちらは「ピピピピ・・・」と鳴ります。両方のスイッチを同時に押すと長点と短点が交互に出ます。

 第2図

 プログラムは下記の通りです。PB0(S1)とPB6(S2)の状態をそれぞれ条件分岐プログラムで判断します。音出しには「Sound」命令を使いました。長点と短点の周波数や間隔の設定は別項の「CQを出すプログラム」と同じにしました。

 プログラムファイル afosc4b.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = Output ポートAを出力に設定。
5 Config Portb = Input ポートBを入力に設定。
6 Portb = &B01000001 PB0とPB6をプルアップ。
7
8 Do Doループの範囲ここから。
9  If Pinb.0 = 0 Then 条件分岐1。「Pinb.0=0」(S1が押された)ならば、
10  Sound Porta.0 , 300 , 100 長点を出力する。D=300, P=100。
11  Waitms 100 0.1秒間そのまま。
12  End If 条件分岐1ここまで。
13  If Pinb.6 = 0 Then 条件分岐2。「Pinb.6 = 0」(S2が押された)ならば、
14  Sound Porta.0 , 100 , 100 短点を出力する。D=100, P=100。
15  Waitms 100 0.1秒間そのまま。
16  End If 条件分岐2ここまで。
17 Loop Doループの範囲ここまで。8行目へ戻る。
18
19 End 終わり。

3. キッチンタイマー

 ボリュームで時間をセットしてから押しボタンスイッチを押すとタイマーがスタートします。時間が来ると「ピピピピ」と鳴って知らせます。回路は下記の通りです。タイマー時間のセットにはA⁄D変換を利用しました。

 第3図

 プログラムは下記の通りです。A⁄D変換値を10倍してから17で割っていますが、これで最長10分間のタイマーになります。たとえば入力電圧が5VのときはA⁄D変換値が1023、これを10倍してから17で割ると約600ですから、18行目は「Wait 600」となり、600秒後(10分後)に終了音が鳴ります。ボリュームのツマミに10分割の目盛を付けておけばだいたいの目安になると思います。

 設定した時間が来ると19〜22行目のForループを実行します。これは先のプログラムでやったモールス符号の短点を10回出すものです。

 プログラムファイル afosc4c.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Adc=Single , Prescaler=Auto A⁄D変換の設定。単独変換、分周値自動。
5 Config Porta = Output ポートAを出力に設定。
6 Config Portb = Input ポートBを入力に設定。
7 Portb = 1 PB0をプルアップ。
8
9 Dim T As Word ワード型変数「T」を使用する。
10 Dim N As Byte バイト型変数「N」を使用する。
11
12 Do Doループの範囲ここから。
13  Start Adc A⁄D変換を開始する。
14  T = Getadc(9) ADC9のA⁄D変換値を変数「T」に代入する。
15  T = T * 10 「T×10」を新たな「T」とする。
16  T = T ⁄ 17 「T÷17」を新たな「T」とする。
17  If Pinb.0 = 0 Then 条件分岐。「Pinb.0 = 0」ならば、
18  Wait T 「T」秒間待つ。
19  For N = 0 To 9 「For」ループ。10回繰り返し。
20  Sound Porta.0 , 100 , 100 「ピッ」という音を出す。D=100, P=100。
21  Waitms 100 0.1秒間そのまま。
22  Next N 「For」ループここまで。19行目へ戻る。
23  End If 条件分岐ここまで。
24 Loop Doループの範囲ここまで。12行目へ戻る。
25
26 End 終わり。

4. スイッチを押すと「ピー」と鳴る、もう1回押すと止まる

 入力スイッチをチョンと押すと「ピー」という音が出て、もう1回押すと音が止まるプログラムです。スイッチをチョンと押すたびに音が出る、止まるを繰り返します。入力状態の判定に「Debounce」命令を使います。上記「モールス練習器(その1)」と同じ回路で実験できます。

 プログラムファイル afosc4d.bas

1 $regfile = "at26def.dat" ATtiny26Lを使用する。
2 $crystal = 1000000 クロック周波数を1MHzに設定。
3
4 Config Porta = Output ポートAを出力に設定。
5 Config Portb = Input ポートBを入力に設定。
6 Portb = 1 ポートBを「1」にする。PB0をプルアップ。
7 Declare Sub Switch サブルーチン「Switch」を使用する。
8 Dim N As Bit ビット型変数「N」を使用する。
9 N = 0 変数「N」の初期値を「0」にする。
10
11 Do Doループの範囲ここから。
12  Debounce Pinb.0 , 0 , Switch , Sub 「Pinb.0 = 0」ならばサブルーチン「Switch」を実行。
13  If N = 1 Then 条件分岐。「N = 1」ならば、
14  Toggle Porta.0 PA0の出力を反転する。
15  Waitus 600 600μ秒間そのまま。
16  End If 条件分岐プログラムここまで。
17 Loop Doループの範囲ここまで。11行目へ戻る。
18
19 End メインプログラム終わり。
20
21 Sub Switch サブルーチン「Switch」ここから。
22  Toggle N 変数「N」の値を反転する。
23 End Sub サブルーチン「Switch」ここまで。

 スイッチが押されるとPB0が「0」になるので12行目「Debounce Pinb.0, 0, Switch, Sub」によってサブルーチン「Switch」が実行されます。ここで変数「N」の値が「1」に変わります。これは13行目「If N = 1 Then」の条件に合いますので、14行目「Toggle Porta.0」、および15行目「Waitus 600」により約800Hzの音が出ます。次にスイッチが押されたときは変数「N」の値が「0」に戻るので、音が止まります。