BBC micro:bit v2搭載のペリフェラルを順に動かしてみています。前回は6軸センサLSM303AGRでした。今回はボード部品面の中央に鎮座する「スピーカ」を鳴らしてみたいと思います。回路図には「スピーカ」と書いてありますが、ビープ鳴らすくらいがせいぜい、ブザーという方が穏当かもしれません。PWM駆動とな。
※「GoにいればGoに従え」Go関連記事の総Index
スピーカ(ブザー)何というピン名で駆動したらよいの?
BBC micro:bit v2の回路図を参照すれば、speaker駆動するMOSFETを駆動するn信号名はSPEAKERであり、アプリケーションプロセッサnRF52833のP0_00端子に接続しております(KL27マイコンからも接続ありますがとりあえず無視。)
このSPEAKER端子を「ペコペコ」動かせば音が鳴る筈。デジタル出力なのでソフトウエア・ループで動かすこともできますが、ここはPWMにお任せしてソフトは設定するだけ、といたしとうございます。
さて、nRF52833のデータシートを参照するとハード的には以下のようです。
-
- PWMは0~3の合計4チャンネル搭載
- 出力は32本のIO端子全てに接続可能
いつもお世話になっております TinyGo の以下のドキュメントには、microbitの場合のSpeaker端子のお名前がどうだとか書いてません(例によってv1.x系の端子番号で書かれているのでv2から登場のSpeakerについては言及ないものと想像されます。)かろうじてPWMConfig構造体の説明があるので、PWMは使える雰囲気がでてますが。
PWMを試用する場合は、以下のチュートリアル・ドキュメントの方が参考になります。今回は以下を見て真似しました(アザーす。)
ただし、上記はRaspberry Pi Pico用じゃないかと思われるので、操作方法は真似できますが、端子番号などは参考になりませぬ。
結局、TinyGoのインストール・ディレクトリに忍び込み、micro:bit v2の場合、P0_0端子はなんと「P27」というお名前になっていること発見。P27にはさらに別名
BUZZER = P27
がつけられていることが分かりました。なんだ、BUZZERというお名前で呼べば良いのね。。。
スピーカ・テストのためのTinyGoソース
さて、上記のチュートリアル・ドキュメントのほぼほぼパクリの実験ソースが以下に。ただし、スピーカを鳴らし続けると耳障りなので、Aボタンを押したら鳴る。Bボタンを押したら鳴りやむという制御をつけました。
また周波数は440Hz(いつもテストに使うラ、A4の音)としましたが、チュートリアルの書き方だとエラーになります(チュートリアルの500Hzであれば割り切れるので問題ない。)
また、既にPWM0という「チャネル」を指定してコンフィグしているのに、後からChannelというメソッドでmachine.BUZZERに接続できるチャネルはどこ?と書いている変なソースに見えるのですが、ここはChannel呼ばないとマズイ感じです。実際にはChannelメソッドの中でPWM用のペリフェラルモジュールと端子を紐づける操作をしているので。PWM0だとchも0が返ってくるので良いのですが、他の番号だとどうなんだろ~。知らんけど。
package main import ( "fmt" "machine" "time" ) // var period uint64 = 1e9 / 500 var period uint64 = uint64(1e9) / 440 var pat = 0 func main() { keyA := machine.BUTTONA keyB := machine.BUTTONB keyA.Configure(machine.PinConfig{Mode: machine.PinInput}) keyB.Configure(machine.PinConfig{Mode: machine.PinInput}) keyA.SetInterrupt(machine.PinFalling, func(machine.Pin) { pat = 1 }) keyB.SetInterrupt(machine.PinFalling, func(machine.Pin) { pat = 0 }) pwm0 := machine.PWM0 pwm0.Configure(machine.PWMConfig{ Period: period, }) ch, er := pwm0.Channel(machine.BUZZER) if er != nil { fmt.Printf(er.Error()) return } for { if pat == 1 { pwm0.Set(ch, pwm0.Top()/2) } else { pwm0.Set(ch, 0) } fmt.Printf("PWM0 ON/OFF= %d\r\n", pat) time.Sleep(time.Second * 2) } }
実機実行結果
micro:bit V2機をUSB接続後、以下でビルド&フラッシュ書き込み(書き込み後、即実行)です。通常、tinygoの接続先は自動で検出されます。
$ tinygo flash -target=microbit-v2
ボタンAを押せば、結構耳障りなビープ音が響きます。Bを押せば止まります(PWMのデューティを0%にして波形が出ないようにしているだけだけれど。)