スピーカーをスイッチとして使う

目次

部品リスト

今回は、次の部品を使用して回路を製作します。

回路製作

次の2種類のArduinoボードを使用して、スピーカーをスイッチとして利用する回路を製作します。

  • Arduino Micro
    ブレッドボードに直接セットできるので、コンパクトに回路製作できます。
  • Arduino Uno
    定番のArduinoボードです。

Arduino Microの回路

Arduino Microをブレッドボードに次のようにセットして、各部品を接続します。

Arduin Unoの回路

Arduino Unoの場合は、ボードのピンソケットとブレッドボードを次のように接続します。

動作確認

最初は、スピーカーを叩いたときに発生する電圧をanalogRead関数で読み取って、その値をシリアルに表示するシンプルなスケッチで動作確認します。

/*
  圧電スピーカーの発生電圧をanalogReadで読み取ってシリアルモニタに表示する
*/

// 圧電スピーカーの接続端子
#define SPEAKER_PIN A0

// 検知判断のしきい値
#define THRESHOLD 10

void setup() {
  // シリアルモニタ初期化
  Serial.begin(9600);
}

void loop() {
  // スピーカーの電圧を読み取る
  int speaker = analogRead(SPEAKER_PIN);

  // しきい値を超えていたら、シリアルにその値を表示
  if (speaker >= THRESHOLD) {
    Serial.println(speaker);
  }
}

LEDの制御

スピーカーを叩いたときに(タッチしたときに)、LEDをON/OFF制御します。

動作仕様は「スピーカーを叩くたびに、LEDのONとOFFを切り替える」という処理にします。

/*
  圧電スピーカーを叩くたびに、LEDのONとOFFを切り替える
*/

// 圧電スピーカーとLEDの接続端子
#define SPEAKER_PIN A0
#define LED_PIN 12

// スピーカーの振動を判定するしきい値
#define THRESHOLD 10

// LEDの点灯状態を保存する変数
int ledState = LOW;

void setup() {
  // シリアルモニタ初期化
  Serial.begin(9600);

  // LED接続ピン設定
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // スピーカー端子の電圧を計測
  int sensorValue = analogRead(SPEAKER_PIN);

  // しきい値以上だったら、スピーカーが振動を検知したと判断
  if (sensorValue >= THRESHOLD) {
    // デバッグ用
    Serial.print("振動検知! : ");
    Serial.println(sensorValue);

    // LEDのON/OFFを切り替える
    //  ↓ if文の処理は次の1行でもOK
    // ledState = !ledState;
    if( ledState == LOW ) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(LED_PIN, ledState);

    // スピーカーの状態が落ち着くまで待つ
    delay(30);
  }
}

スピーカーの制御

スピーカーをタッチしたときに、LEDのON/OFF制御だけでなく、スピーカーから音も出すスケッチです。

/*
  圧電スピーカーの振動を検知したとき、LEDとスピーカーを制御する
*/

// 圧電スピーカーとLEDの接続端子
#define SPEAKER_PIN A0
#define LED_PIN 12

// スピーカーの振動を判定するしきい値
#define THRESHOLD 10

// アラームの1音の長さ(単位:ミリ秒)
#define DURATION 80

// 音程の周波数定義
#define DO_5  523   // ド
#define SO_5  784   // ソ
#define DO_6  1047  // ド

// LEDの点灯状態を保存する変数
int ledState = LOW;

void setup() {
  // シリアルモニタ初期化
  Serial.begin(9600);

  // LED接続ピン設定
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // スピーカー端子の電圧を計測
  int sensorValue = analogRead(SPEAKER_PIN);

  // しきい値以上だったら、スピーカーが振動を検知したと判断
  if (sensorValue >= THRESHOLD) {
    // デバッグ用
    Serial.print("振動検知! : ");
    Serial.println(sensorValue);

    // LEDのON/OFFを切り替える
    //  ↓ if文の処理はこの1行でもOK
    // ledState = !ledState;
    if( ledState == LOW ) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    digitalWrite(LED_PIN, ledState);

    // アラーム音を鳴らすまで少し時間待ち
    // (タッチした瞬間に音を出すと早すぎるため)
    delay(300);

    // アラーム音を鳴らす(この処理でA0端子は出力モードになる)
    // LEDの点灯に合わせてメロディーを変える
    if(ledState){
      // ONになったときのアラーム
      tone(SPEAKER_PIN, DO_5);
      delay(DURATION);
      tone(SPEAKER_PIN, SO_5);
      delay(DURATION);
      tone(SPEAKER_PIN, DO_6);
      delay(DURATION);
      noTone(SPEAKER_PIN);
    } else {
      // OFFになったときのアラーム
      tone(SPEAKER_PIN, DO_6);
      delay(DURATION);
      tone(SPEAKER_PIN, SO_5);
      delay(DURATION);
      tone(SPEAKER_PIN, DO_5);
      delay(DURATION);
      noTone(SPEAKER_PIN);
    }

    // スピーカー端子を入力に戻す
    pinMode(SPEAKER_PIN, INPUT);

    // スピーカーの状態が落ち着くまで待つ
    delay(10);
  }
}
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次