音出しプログラムと入力スイッチを組み合わせて、モールス練習器やタイマーの実験をしました。
押しボタンスイッチを押している間だけ「ピー」という音が出るプログラムです。PB0〜GND間に押しボタンスイッチをつけました。回路は下記の通りです。ICのクロックは内蔵RC発振です。
プログラムは下記の通りです。条件分岐を用いて、スイッチの接点が閉じたとき(「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個付いているモールス練習器です。回路図を下に掲げます。PB0に接続されたスイッチS1を押すと長点が連続して出ます。「ピーピーピーピー・・・」という感じです。PB6に接続されたスイッチS2を押すと短点が連続して出ます。こちらは「ピピピピ・・・」と鳴ります。両方のスイッチを同時に押すと長点と短点が交互に出ます。
プログラムは下記の通りです。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 | 終わり。 |
ボリュームで時間をセットしてから押しボタンスイッチを押すとタイマーがスタートします。時間が来ると「ピピピピ」と鳴って知らせます。回路は下記の通りです。タイマー時間のセットにはA⁄D変換を利用しました。
プログラムは下記の通りです。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 | 終わり。 |
入力スイッチをチョンと押すと「ピー」という音が出て、もう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」に戻るので、音が止まります。