![見出し画像](https://assets.st-note.com/production/uploads/images/35074164/rectangle_large_type_2_d7c79463e2c87ed5f62fb4ba3348178b.png?width=1200)
KUMIKOMI NO SEKAI ~ #4 Making the Buzzer go BEEP
こんにちは。今回はブザーを鳴らしてみたいと思います。前回使ったロータリースイッチをボリューム調整用のつまみとして位置づけます。早速鳴らしてみましょう。
関連モジュール
今回関連するモジュール(ハードウェア)はブザーとロータリースイッチになります。
PWM制御
PWM(Pulse Width Modulation)制御とは、パルス波のデューティー比を変化させて変調する変調方法です。何のこっちゃ?と思いますよね。簡単に言うと、ONとOFFを繰り返して切り替えることで、出力する電力を制御することです。前回、前々回でLEDを点けたり、消したりしていましたが、これを一定周期で高速で繰り返すと、明るさを調整できるようになります。図示すると以下のイメージです。
①は100%HighでLEDとしては点きっぱなしになります。②は一定期間において25%Lowで75%High、③は50%Lowで50%Highです。①が一番明るく、②が若干暗く、③が最も暗く見えるのは想像がつくでしょうか?見た目上①が出力100%、②が出力75%、③が出力50%となるわけです。
PWM制御に登場する用語として、パルス幅、周期、デューティー比があります。これらを図にすると以下の通りです。パルス幅と周期については、図の通りなのですが、デューティー比とはHigh期間とLow期間の比のことを言います。下の図はHighとLowが同じ比率なので、デューティー50%となります。比はHighに着目します。先程上で書いた①②③の図はそれぞれ、デューティー100%、デューティー75%、デューティー50%でした。
PWM制御をブザーに使うとどうなるか
さて、このPWM制御をブザーに使用するとどうなるかと言いますと、ボリュームになります。ボードのユーザーズマニュアルには下図のような記述がありました。0 ~ 255までの間でデューティーサイクルを決められるようです。analogWrite関数に0~255までの値を渡せば、図の通りのボリュームでブザーがなるはずです。
ソースコード作成
以下がソースコードです。
int BuzzerPin = 5;
int Potentiometer = A0;
void setup() {
pinMode(BuzzerPin, OUTPUT);
}
void loop() {
int potentioValue, Value;
potentioValue = analogRead(Potentiometer); // ロータリースイッチの値を取得
Value = map(potentioValue, 0, 1023, 0, 255); // 0~1023の値を0~255に丸める
analogWrite(BuzzerPin, Value); // PWM出力
}
コードの内、map関数の意味が分からないと思うので補足します。ロータリースイッチから取得する値は0~1023の値ですが、analogWrite関数に渡す値は0~255の範囲でないといけません。そのため、map関数を使い0~1023の値を0~255の範囲に変換して貰います。0=0、512=128、1023=255のように変換してくれます。analogWrite関数は引数で指定したデューティーサイクルで出力してくれますし、map関数は値の変換をしてくれます。至れり尽くせりですねぇ。
動作確認
ソースコードをコンパイル後、ボードに書き込んで動かしてみました。ロータリースイッチを右み回すと0になるので音が消えるはず・・・消えた。よしよし。次に左に回すと音が大きくなるはず・・・ん?お、オカシイ・・。音無しの状態からゆっくり左に回すと段々大きくなって行くのですが、途中から段々小さくなって行き、最後まで左に回し切ると音が消えました。はぁ?何で?
こうなるんとちゃうんかい?analogWrite(BuzzerPin, 255);でMAXなんとちゃうん?試しにanalogWrite関数の第二引数を255直接入力してもアカンやん。壊れてるやつ?ちょっと分かりませんが、私の環境では想定通りの動きをしませんでした。なんか間違ってんのかなぁ?いや、そんなはずはない。
まとめ
今回はPWM制御を使用してブザーを鳴らしてみました。私の環境はちょっとオカシイ感じがしましたが、鳴るには鳴ったんで、まぁええか。次回はちょっとカッコいいOLEDディスプレイを使ってみましょうかね。今回までの制御はarduinoに備え付けの関数を使用したものでしたが、OLEDディスプレイはちょっとそれでは済みません。ライブラリを取り込む必要があります。ライブラリの話も同時にしたいと思います。それでは、今回はこの辺で。お疲れ様でした。
この記事が気に入ったらサポートをしてみませんか?