トーンを鳴らす
このセクションでは、ボタンが押されたときに音を鳴らすシンプルなプログラムを作成します。面白くするために、micro:bit ボード上の両方のボタンを使います。Button A が押されたら、音程 A4 のトーンを再生します。Button B が押されたら、トーンを停止します。
ボタンの仕組みと、Buttons の章でボタン押下を検出する方法には、すでに慣れているはずです。したがって、このセクションではそれらの詳細には再び立ち入りません。
テンプレートからプロジェクトを作成する
このプロジェクトでは、microbit-bsp(Embassy あり)を使用します。テンプレートを使って新しいプロジェクトを生成するには、次のコマンドを実行します。
cargo generate --git https://github.com/ImplFerris/mb2-template.git --rev 3d07b56
-
プロジェクト名の入力を求められたら、"play-tone" のような名前を入力します。
-
async を使用するかどうかを尋ねられたら、"true" を選択します。
-
"BSP" または "HAL" のどちらかを選ぶよう求められたら、"BSP" を選択します。
初期化
まず、ボードを初期化しましょう。このボードインスタンスから、pwm0 ペリフェラルと内蔵スピーカーにアクセスできます。この両方を、基本的な PWM 出力を設定する embassy-nrf crate のヘルパー構造体 SimplePwm に渡します。
次に、その SimplePwm インスタンスを microbit-bsp crate の構造体 PwmSpeaker に渡します。これにより、音程と長さを指定してトーンを再生できるようになります。
#![allow(unused)] fn main() { let board = Microbit::default(); let mut speaker = PwmSpeaker::new(SimplePwm::new_1ch(board.pwm0, board.speaker)); }
ボタン
microbit-v2 crate とは異なり、microbit-bsp crate ではボタンは別個の buttons 構造体にまとめられていません。代わりに、以下のように board.btn_a と board.btn_b を使って直接アクセスできます。
#![allow(unused)] fn main() { let mut button_a = board.btn_a; let mut button_b = board.btn_b; }
待って...その時を
ここでは、ボタン押下を継続的に確認するためにループを使います。どちらのボタンが押されたかに応じて、再生状態が変化します。Button A が押される(つまり low になる)と、トーンの再生を開始します。Button B が押される(つまり low になる)まで、再生し続けます。
wait_for_low() async 関数を使うことで、ボタンが押されるまでプログラムを一時停止できます。しかも、ブロックしたり CPU リソースを無駄にしたりしません。
#![allow(unused)] fn main() { loop { button_a.wait_for_low().await; speaker.start_note(Pitch::Named(NamedPitch::A4)); button_b.wait_for_low().await; speaker.stop(); } }
完全なコード
#![no_std] #![no_main] use embassy_executor::Spawner; use embassy_nrf::pwm::SimplePwm; use microbit_bsp::{ Microbit, speaker::{NamedPitch, Pitch, PwmSpeaker}, }; use {defmt_rtt as _, panic_probe as _}; #[embassy_executor::main] async fn main(_spawner: Spawner) -> ! { let board = Microbit::default(); let mut button_a = board.btn_a; let mut button_b = board.btn_b; let mut speaker = PwmSpeaker::new(SimplePwm::new_1ch(board.pwm0, board.speaker)); loop { button_a.wait_for_low().await; speaker.start_note(Pitch::Named(NamedPitch::A4)); button_b.wait_for_low().await; speaker.stop(); } }
既存のプロジェクトをクローンする
作成済みのプロジェクトをクローン(または参照)して、bsp-embassy/play-tone フォルダーに移動することもできます。
git clone https://github.com/ImplFerris/microbit-projects
cd microbit-projects/bsp-embassy/play-tone
書き込み
このプログラムを micro:bit に書き込むと、トーンが聞こえるはずです
cargo flash