Arduino入門 第6回 スピーカーを追加

目次

YouTube動画

今回のゴール

今回はブレッドボードにスピーカーを追加して、時間になったらアラーム音を鳴らす、という動作を実現します。

ブレッドボードの回路とスケッチは次のようになります。

ブレッドボード回路

圧電スピーカーの2つの端子を、ArduinoボードのA0端子とGND端子に接続します。

スケッチ

設定時間になったら、「ピピピッ」というアラーム音を1回鳴らします。

 /*
  Arduino入門 第6回 スピーカーを追加
    スイッチが押されたらLEDの点滅を開始して、
    設定時間になったらアラームを鳴らす
*/

#define TIMER 3 // タイマー時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // LED接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 指定した時間、LEDを点滅する
  for(int i=0; i<TIMER; i++) {
    // LEDをピカッと点滅(1秒間)
    digitalWrite(LED_PIN, HIGH);
    delay(LED_ON_INTERVAL);
    digitalWrite(LED_PIN, LOW);
    delay(LED_OFF_INTERVAL);
  }

  // アラームを鳴らす
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);

  tone(SPEAKER_PIN, ALARM_TONE);
  delay(60);
  noTone(SPEAKER_PIN);
  delay(60);
  
  tone(SPEAKER_PIN, ALARM_TONE);
  delay(120);
  noTone(SPEAKER_PIN);
}

要点まとめ

圧電スピーカーの仕組みと音に関する用語

圧電スピーカーの本体内には振動する板が入っています。電圧を加えることによりこの板を振動させて音を出します。

例えば1秒間に262回振動させると「ド」の音程の音に聞こえます。

1秒間に振動する回数のことを「周波数」と呼び、単位は「Hz」」(ヘルツ)です。

スピーカーを鳴らすには?

Arduinoにはスピーカーを鳴らす命令が用意されています。

toneは指定した端子に指定した音(矩形波信号)を発生する命令です。toneは音を出したままにしますので、noToneで音を止めます。

変数

キッチンタイマーでは1秒間に1回、LEDをピカッと点滅制御しています。例えば5秒のタイマー時間にしたい場合、この点滅を5回繰り返すことができれば、時間計測ができます。

一定回数繰り返すには、今まで何回点滅制御したか記録しておく必要があります。Arduino(C++)には、数字を記録しておくためのメモ用紙のような「変数」と呼ばれる仕組みがあります。

変数の宣言

変数を用意してもらうことを「変数の宣言」と呼び、次のように書きます。

変数の型

基本的な変数型は以下のようなものがあります。

変数名

変数名に使用できる文字は次のようなものがあります。変数名の付け方は自由ですが、Arduino公式スケッチでは、基本的に小文字、複数単語から構成される場合は、2単語目から先頭のみ大文字にしています。

for文

一定回数、処理を繰り返す場合、一般的にfor文が使われます。

一定回数、処理を繰り返す、という動作は非常に多く出てきます。一般的には次のように書かれることが多いので、最初はこの典型的なパターンを覚えてしまうと良いと思います。

変数の有効範囲

変数を宣言した場合、スケッチのどこでも使えるわけではありません。

例えばwhile文を使って次のようにスケッチを書いた場合、使える範囲は変数を宣言した直後から、波括弧の終わりまで使えます。

forでの次のように変数宣言した場合は、forの波括弧内のみで使用できます。

チャレンジ課題解答例

アラーム音を3回鳴らす、という動作をします。アラーム音を鳴らす処理をfor文を使って、3回繰り返すことができます。

 /*
  Arduino入門 第6回 スイッチ追加
  チャレンジ課題解答例
  forを使った例
*/

#define TIMER 3 // タイマー時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // LED接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数
#define ALARM_COUNT 3   // アラームを鳴らす回数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 指定したタイマー時間(秒)、LEDを点滅する
  for(int i=0; i<TIMER; i++) {
    // LEDをピカッと点滅(1秒間)
    digitalWrite(LED_PIN, HIGH);
    delay(LED_ON_INTERVAL);
    digitalWrite(LED_PIN, LOW);
    delay(LED_OFF_INTERVAL);
  }

  // LEDをONにする
  digitalWrite(LED_PIN, HIGH);

  // アラームを鳴らす
  for(int i=0; i<ALARM_COUNT; i++) {
    tone(SPEAKER_PIN, ALARM_TONE);
    delay(60);
    noTone(SPEAKER_PIN);
    delay(60);

    tone(SPEAKER_PIN, ALARM_TONE);
    delay(60);
    noTone(SPEAKER_PIN);
    delay(60);
    
    tone(SPEAKER_PIN, ALARM_TONE);
    delay(120);
    noTone(SPEAKER_PIN);
    
    delay(1000); // アラーム音同士の間隔を1秒あける
  } // 変数iはここで破棄されます

  // LEDをOFFにする
  digitalWrite(LED_PIN, LOW);
}

また、whileを使って書くこともできます。whileの方が動作の仕組みがわかりやすいと思います。

 /*
  Arduino入門 第6回 スイッチ追加
  チャレンジ課題解答例
  whileを使った例
*/

#define TIMER 3 // タイマー時間(秒)

#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1  // スイッチOFFのdigitalReadの値

#define LED_PIN 12 // LED接続端子
#define LED_ON_INTERVAL   50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間

#define SPEAKER_PIN A0  // スピーカー接続端子
#define ALARM_TONE 1760 // アラーム音の周波数
#define ALARM_COUNT 3   // アラームを鳴らす回数


void setup() {
  // LED接続端子を出力制御にする
  pinMode(LED_PIN, OUTPUT);

  // スイッチ接続端子をプルアップ機能有効にする
  pinMode(SW_PIN, INPUT_PULLUP);
}

void loop() {
  // スイッチが押されるまで待つ
  while( digitalRead(SW_PIN) == SW_OFF ) {
  }

  // 指定したタイマー時間(秒)、LEDを点滅する
  for(int i=0; i<TIMER; i++) {
    // LEDをピカッと点滅(1秒間)
    digitalWrite(LED_PIN, HIGH);
    delay(LED_ON_INTERVAL);
    digitalWrite(LED_PIN, LOW);
    delay(LED_OFF_INTERVAL);
  }

  // LEDをONにする
  digitalWrite(LED_PIN, HIGH);

  // アラームを鳴らす
  // whileを使って3回鳴らします
  int i = 0; // 変数i(メモ用紙)にアラームを鳴らした回数を記録します
  while(i<3) { // アラームを鳴らした回数が3より小さい(=2以下)の場合、処理を繰り返します
    tone(SPEAKER_PIN, ALARM_TONE);
    delay(60);
    noTone(SPEAKER_PIN);
    delay(60);

    tone(SPEAKER_PIN, ALARM_TONE);
    delay(60);
    noTone(SPEAKER_PIN);
    delay(60);
    
    tone(SPEAKER_PIN, ALARM_TONE);
    delay(120);
    noTone(SPEAKER_PIN);
    
    delay(1000); // アラーム音同士の間隔を1秒あける

    i++; // 1回アラームを鳴らしたので、ここで変数i(鳴らした回数)を1プラスします
  } // 変数iはここで破棄されます

  // LEDをOFFにする
  digitalWrite(LED_PIN, LOW);
}
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次