Posts スピーカーを鳴らしてみよう
Post
Cancel

スピーカーを鳴らしてみよう

この記事で使うソースコード

この記事ではスピーカーの制御を行います。

スピーカーはCanSatの起動音に使ったり、エラーのとき鳴らしたりすることができます。 今回はドレミの音階を順番に鳴らすプログラムです。

プログラムが起動するとスピーカーからドレミファソラシドと音が鳴ります。

speaker スピーカー

ソースコードの説明


各音階の周波数をマクロで定義しています。

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);
This post is licensed under CC BY 4.0 by the author.

スイッチの動作確認をしよう

基板の設計ミスと修正に関して