この記事ではスピーカーの制御を行います。
スピーカーはCanSatの起動音に使ったり、エラーのとき鳴らしたりすることができます。 今回はドレミの音階を順番に鳴らすプログラムです。
プログラムが起動するとスピーカーからドレミファソラシドと音が鳴ります。
スピーカー
ソースコードの説明
各音階の周波数をマクロで定義しています。
1
2
3
4
5
6
7
#define mC 261.626 // ド
#define mD 293.665 // レ
#define mE 329.628 // ミ
#define mF 349.228 // ファ
#define mG 391.995 // ソ
#define mA 440.000 // ラ
#define mB 493.883 // シ
スピーカーはモータのPWM制御と同じ要領で制御できます。
モータの制御に0番と1番のチャンネルを使用したので2番のチャンネルを指定しました。 周波数は5000Hzにしています。 また、モータの制御時には分解能を8ビットに設定しましたが、スピーカーの制御では分解能を13ビット(2^13=8192)に設定しています。
1
2
3
#define LEDC_CHANNEL_2 2
#define LEDC_TIMER_13_BIT 13
#define LEDC_BASE_FREQ 5000
以下は引数の値をもとに任意の音を鳴らすtone
関数と音を鳴らさないnoTone
関数です。 先ほどスピーカーの制御はモータと同様と述べました。 tone
関数は第2引数で与えた周波数のPWM信号をマイコンのピンから出力しています。 また、第3引数に何秒音を鳴らすか指定することができます。
1
2
3
4
5
6
7
8
9
10
11
void tone(int pin, int freq, int t_ms) {
ledcSetup(LEDC_CHANNEL_2, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(pin, LEDC_CHANNEL_2);
ledcWriteTone(LEDC_CHANNEL_2, freq);
delay(t_ms);
}
void noTone(int pin) {
ledcWriteTone(LEDC_CHANNEL_2, 0.0);
}
音を鳴らすときはtone
関数を呼び出します。 以下はマクロで定義したドの周波数を2倍にした値を引数として渡しています。 このように周波数を高くすると音が高くなります。
1
2
3
// ド
tone(speaker, mC * 2, 200);
noTone(speaker);