💬

Arduino(11) ブザーを鳴らしてみる

2021/09/08に公開

はじめに

ブザーが鳴らせれば、エラー発生時に鳴らして注意喚起出来たりで、実装の幅広がりますよね。
手近いにあったブザーを繋げて、音出してみました。

こんなのです。

配線


ブザーは「PS1240P02CT3」という型名らしいです。電圧をかけると音なる様です(ざっくり)。こいつをGPIOの13番に接続です。ちなみに電圧は印加し続けても音鳴らなくて、周期パルスとして印加する必要があるようです。

実装1

const int BUZZ_PIN = 13;

void setup() {
  // put your setup code here, to run once:
  pinMode( BUZZ_PIN, OUTPUT);
}

void loop() {
  int i;
  // put your main code here, to run repeatedly:
   for(i=0;i<50;i++){
    digitalWrite(BUZZ_PIN,HIGH);
    delay(1);
    digitalWrite(BUZZ_PIN,LOW);
    delay(1);
  }

  delay(200);
}

動作確認として、loop関数内に1ms毎にHi/Loする様な実装を書きました。これで、なんか音は鳴ります。
ここで気づいたんですが、音が鳴っている間は、絶えずHi/Lo処理を実施するので、他処理が出来ないのでは!!。ブザー音が長いと、その間はなにも処理出来無いではないですか…。
これは困りました。

並列処理

そこで並列処理での実装です。ただしArduino Uno/MegaともにCPUコアが1個なので、並列処理は出来ないらしいです。それでも仮想的ですが並列処理が出来る、「TimeAction」という物があるそうです。
https://playground.arduino.cc/Code/TimedAction/
このページの「Download here」から「TimeAction-1_6.zip」をダウンロードして下さい。
解凍したものを
ユーザー名/Documents/Arduino/libraries
に置いて下さい。
このまま使用すると「WProgram.h~」とかいうエラーが出ちゃいます。これを回避するには、
先ほど解凍した中にある、TimeAction.hを開いて、
33行目にある、「#include "WProgram.h"」を「#include "Arduino.h"」に書き換えて下さい。

実装2

スケッチ例から「TimeAction/HelloTimeAction」を開いて、ブザー実装を入れ込みました。

//this sketch will blink an LED at pin 13 each second
#include <TimedAction.h>
void blink();

//this initializes a TimedAction class that will change the state of an LED every second.
TimedAction timedAction = TimedAction(1000,blink);

//pin / state variables
const int BUZZ_PIN = 13;
boolean ledState = false;


void setup(){
  pinMode( BUZZ_PIN, OUTPUT);
}

void loop(){
  timedAction.check();
  //do something else
}

void blink(){
   int i,j;

  for(i=0;i<50;i++){
    digitalWrite(BUZZ_PIN,HIGH);
    delay(1);
    digitalWrite(BUZZ_PIN,LOW);
    delay(1);
  }
}

残件

確かに定期的に音はなっているが、並列処理出来てるのかが疑問。
どの程度まで並列に動くのか…。何とか確認できないかな。

Discussion