💬
Arduino(11) ブザーを鳴らしてみる
はじめに
ブザーが鳴らせれば、エラー発生時に鳴らして注意喚起出来たりで、実装の幅広がりますよね。
手近いにあったブザーを繋げて、音出してみました。
こんなのです。
配線
ブザーは「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」という物があるそうです。
解凍したものを
ユーザー名/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