【 第13回 】取り敢えず圧電スピーカーをいろんな方法で鳴らしてみた

0
2228

これまでScratch 1.4からGPIOに接続したLED、タクトスイッチ、人感センサーなどを操作してきましたが、今回は圧電スピーカーをいろんな方法で鳴らしてみたいと思います。

今回使った部品

  • Raspberry Pi 3 Model B × 1
  • 40Pinフラットリボンケーブル
  • 40Pin T型GPIO拡張ボード
  • ブレットボード × 1
  • 圧電スピーカー(PKM13EPYH4000-A0) × 1
  • 抵抗 1kΩ × 1
  • ジャンプワイヤー(オス/オス) × 3

実体配線図

右上のデータシートを見ると、ハードウェアPWM出力の機能が割り当てられているGPIOが4Pinありますが、その中で今回はGPIO12番を使います。

圧電スピーカーは、1kΩと並列に接続します。2本のリード線に向きはないので、どちらに接続しても大丈夫です。

圧電スピーカーをデジタル出力で鳴らしてみる

【第5回】のときと同じように「Scratch 1.4」を起動してGPIOサーバーを開始しておきます。

カテゴリー「制御」のブロック「▼を送る」を右クリックして「新規/編集…」を左クリックします。

出てきた「メッセージの名前:」画面の入力欄に”gpio12on”と入力して「OK」ボタンをクリックします。

できた「gpio12on▼を送る」をクリックしても【第4回】のときのLEDのようには音は出ませんでした。

LXTerminalを起動して、下のコマンドを実行します。

gpio readall

ブロック「config12on▼を送る」の実行で、BCM列”12(GPIO12)”番の出力が”1(High)”になると同時に、設定も”IN(入力)”から”OUT(出力)”に変わっています。

できたブロック「gpio12on▼を送る」をスクリプトエリアに引き出します。

カテゴリー「制御」のブロック「1秒待つ」をブロック「goio12on▼を送る」の下に繋げます。

カテゴリー「制御」のブロック「gpio12on▼を送る」を右クリックして「新規/編集…」を左クリックします。

出てきた「メッセージの名前:」画面の入力欄を”gpio12off”で上書きして「OK」ボタンをクリックします。

できたブロック「goio12off▼を送る」をブロック「1秒待つ」の下に繋げます。

カテゴリー「制御」のブロック「1秒待つ」をブロック「goio12off▼を送る」の下に繋げます。

カテゴリー「制御」のブロック「ずっと」でブロック全体を包み込みます。

できたスクリプトをクリックすると、1秒間隔で「カチッ」、「カチッ」と秒針を刻むような音がしました。

ブロック「1秒待つ」の”1″をコンサートピッチ:440Hzでで割った値を更に1/2にした”0.0011363″で2箇所共、上書きします。

できたスクリプトをクリックすると、今度は「カチカチカチカチ・・・」と連続音がしますが、コンサートピッチ:440Hzとは程遠いものでした。

音を止めるには、ステージ右上の赤?ボタンをクリックします。

圧電スピーカーをPWM出力で鳴らしてみる

ブロック「ずっと」の内側に抱え込まれたブロックを全て外に引き出します。

引き出したブロックを右クリックして削除します。

カテゴリー「制御」のブロック「▼を送る」を右クリックして「新規/編集…」を左クリックします。

出てきた「メッセージの名前:」画面の入力欄に”config12pwmout”を入力して「OK」ボタンをクリックします。

できたブロック「config12pwmout▼を送る」をブロック「ずっと」の内側に抱え込ませます。

もうひとつブロック「config12pwmout▼を送る」をブロック「ずっと」の上に繋げます。

カテゴリー「演算」のブロック「ハローとワールド」を下側のブロック「config12pwmout▼を送る」の”config12pwmout▼”に当て嵌めます。

ブロック「ハローとワールド▼を送る」の”ハロー”を”gpio12pwm”で上書きします。

カテゴリー「変数」のボタン「新しい変数を作る」をクリックします。

出てきた「変数名?」画面の入力欄に”beep”と入力して「OK」ボタンをクリックします。

できた変数「beep」をブロック「gpio12pwmとワールド▼を送る」の”ワールド”に当て嵌めます。

ステージ上の変数モニター「beep」を右クリックして「スライダー」を左クリックします。

できたスクリプトをクリックしても音は未だ出ません。

変数モニター「beep」のスライダーをマウスで右にスライドさせると「ピ~」という音が出ましたが、スライダーを左右に振ってみても音はそれほど変わりません。

これも音を止めるには、ステージ右上の赤?ボタンをクリックします。

圧電スピーカーをハードウェアPWM出力で鳴らしてみる

Adafruit’s Raspberry Pi Lesson 8. Using a Servo Motor

ここ ↑ に、ハードウェアPWMを使うと特定の周波数を出力できるという情報があったので、実行してみました。

LXTerminalで次のコマンドを実行すると、GPIO12の出力モードがハードウェアPWMに設定されます。

gpio -g mode 12 pwm

下のコマンドで実行結果を確認します。

gpio readall

BCM列”12(GPIO12)”番の”Mode”列が、既定の”IN(入力)”から”ALT0”に変わっています。この”ALT0”は上にあるSoCのデータシートで拡張機能”ALT0″を示していて、GPIO12の”ALT0”列を見ると”PWM0″と表示されています。

上の情報によれば、

・PWM Frequency in Hz = 19,200,000 Hz / pwmClock / pwmRange

でPWM出力の周波数が設定されるということなので、

PWM Frequencyをコンサートピッチ:440Hzにできるだけ近づける為、

・pwmClock = 85

・pwmRange = 512

としてみました。このときのPWM周波数は、

・PWM Frequencyin Hz = 19,200,000 Hz ÷ 85 ÷ 512 = 441.176 Hz

となります。

デューティ比を50%とした場合、次のコマンドで設定します。

gpio pwm-ms
gpio pwmc 85
gpio pwmr 512
gpio -g pwm 12 256

「チ~」という音が鳴りました。これが本当に441.176Hzなのでしょうか。

音を止めるには、次のコマンドでデューティー比を”0″にします。

gpio -g pwm 12 0

次のコマンドでGPIO12の設定を既定に戻しておきます。

gpio -g mode 12 in

下のコマンドで実行結果を表示します。

gpio readall

BCM列”12(GPIO12)”番の”Mode”列が、”ALT0”から既定の”IN(入力)”に戻っていることを確認します。

今回は、圧電スピーカーをどうにか鳴らすことができただけなので、次回はもう少しなんとかできないか試してみたいと思います。