BoeBot上のブレッドボードに写真のように配線します。右下の赤は3.3V、青はGNDです。左上から右下に斜めに繋がっているものは5Vのラインです。右側のコネクタはサーボーモーターです。


これに下側のユニバーサル基板の右側に5Vの3端子レギュレータとDCジャックを下の写真のように取り付けます。電源プラグの先は006Pの電池ホルダーになっています。



ブレッドボードにCPUを取り付けます。チェック用のLEDも付けています。
Cpu.PWMChannel.PWM_2は下の写真ではCPUの上の列左から4番目となります。



全体を上から見ると下の写真のようになります。



PWMで音を出す

.NetMF4.2では4.1と比べてかなりクラスが変更されているようです。このPWMクラスも例外ではありません。4.2になって、このプログラムはすごく簡単に作れるようになりました。

とにかく音を出してみる


ここで用いるPWMクラスのコンストラクタ
public PWM(
  Cpu.PWMChannel channel,
  double frequency_Hz,       // 周波数 単位はHz
  double dutyCycle,          // デューティサイクル 0.0~1.0の範囲
  bool invert                // 出力を反転させるかどうか
)    

1kHzと2kHzを0.1秒ずつ
        public static void Main()
        {
            PWM speaker = new PWM(Cpu.PWMChannel.PWM_2,1000.0,0.5,false);           
            while (true)
            {
                speaker.Start();
                speaker.Frequency = 1000;
                speaker.DutyCycle = 0.5;
                CPU.delay(100);
                speaker.Frequency = 2000;
                speaker.DutyCycle = 0.5;
                CPU.delay(100);
                speaker.Stop();
                CPU.delay(1000);
            }
        }
 1 
 2 
 3 PWM_2はPC7である
 4 
 5 
 6 
 7 1kHzに設定
 8 
 9 
10 2kHzに設定
11 
12 
13 
14 
15 
16 

音階をスピーカーに出力する


音階をスピーカーに出力する
        public static void Main()
        {
            // 周波数         ド   レ   ミ   ファ  ソ  ラ   シ    ド
            double[] scale = { 261.63, 293.66, 329.63, 349.23, 392.0, 440.0, 493.88, 523.25 };
            PWM speaker = new PWM(Cpu.PWMChannel.PWM_0, 1000.0, 0.5, false);
            speaker.Start();
            while (true)
            {
                foreach (double frequency in scale)
                {
                    speaker.Frequency = frequency;
                    speaker.DutyCycle = 0.5;
                    CPU.delay(500);
                }
           }
        }
 1 
 2 
 3 
 4 周波数データ
 5 PWMオブジェクトを作る
 6 波形出力開始
 7 
 8 
 9 配列の始めから最後まで
10 
11 周波数の変更
12 
13 
14 
15 
16 

曲を流してみよう

音程+持続時間の2つのペアが一つのデータになります。2次元配列でも良いですが、一次元配列の方がこの場合簡単かもしれません。

花は咲くの冒頭
        const int シ = 0, ド = 1, レ = 2,ミ = 3,ファ = 4;
        const int ソ = 5, ラ = 6, し = 7, ど = 8, 休 = 9;
        public static void Main()
        {
            // 周波数         シ  ド   レ   ミ   ファ  ソ  ラ   シ    ド      休符
            double[] freq = { 246.94, 261.63, 293.66, 329.63, 349.23, 392.0, 440.0, 493.88, 523.25, 0 };
            int[] music = { レ,1, ド,1, シ,1, レ,1, ソ,3,ラ,1, ど,1,し,1,し,2,し,2,休,2,
                          ソ,1,ラ,1,し,1,ソ,1,ソ,1,レ,1,レ,3,ド,1,シ,4,休,2};
            PWM speaker = new PWM(Cpu.PWMChannel.PWM_0, 1000.0, 0.5, false);
            while (true)
            {
                for (int i = 0; i < music.Length; i += 2)
                {
                    if (music[i] != 休)
                    {
                        speaker.Frequency = freq[music[i]];
                        speaker.DutyCycle = 0.5;
                        speaker.Start();
                    }
                    CPU.delay(500 * music[i + 1]);
                    speaker.Stop();
                    CPU.delay(10);
                }
            }
        }
 1 音程データ
 2 
 3 
 4 
 5 
 6 音程の周波数データ
 7 曲データ
 8 
 9 PWMオブジェクトを作る
10 
11 
12 
13 
14 休符だったら音は出さない
15 そうでなければ出す
16 周波数の設定
17 
18 音発生開始
19 
20 持続時間
21 
22 
23 
24 
25 
26 
27 


二重奏にする



二重奏にする
        public static void Main()
        {
            PWM speaker1 = new PWM(Cpu.PWMChannel.PWM_0, 100.0, 0.5, false);
            PWM speaker2 = new PWM(Cpu.PWMChannel.PWM_3, 200.0, 0.5, false);

            while (true)
            {
                speaker1.Frequency = 1000;
                speaker1.DutyCycle = 0.5;
                speaker1.Start();          // 一つ目の音1kHzを出す
                CPU.delay(1000);           // 1秒待つ

                speaker2.Frequency = 1500;
                speaker2.DutyCycle = 0.5;
                speaker2.Start();          // 2つ目の音を1.5kHz出す

                CPU.delay(1000);           // 二つ目の音を重ねる

                speaker1.Stop();           // 1つ目の音を止める
                CPU.delay(1000);           // 二つ目の音だけになる
                speaker2.Stop();           // 2つ目の音も止める
                CPU.delay(1000);
            }
        }
 1 
 2 
 3 1つ目のオブジェクト
 4 2つ目のオブジェクト
 5 
 6 
 7 
 8 
 9 
10 
11----
12   |
13   |
14   |
15   |---
16   |   |
17   |   |
18   |   |
19----   |
20       |
21--------
22 
23
24 

[課題] カエルの歌を輪唱してみよう

曲を流してみよう二重奏にするを参考にして下の楽譜の通りに曲をつくってみよう。