これまで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″と表示されています。
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(入力)”に戻っていることを確認します。