MB2 のスピーカー
MB2 にはスピーカーが内蔵されています。これは、ボード裏面の中央にある、 “SPEAKER” とラベル付けされた大きな黒い正方形のデバイスです。
このスピーカーは GPIO ピンに応答して空気を動かすことで動作します。スピーカーのピンが ハイ (3.3V) のとき、内部の振動板 — 「speaker cone」 — はいちばん外側まで押し出されます。 スピーカーのピンがロー (GND) のときには、いちばん内側まで引き戻されます。空気が押し出され、 また吸い戻されると、デバイスの側面にある小さな長方形の穴 — 「speaker port」 — を通って 空気が出入りします。これを十分に速く行うと、圧力の変化によって音が出ます。
適切なハードウェアで駆動できれば、このスピーカーコーンは、適切な電流によってその可動範囲内の 任意の位置へ実際に移動させることができます。そうすれば、「普通の」スピーカーのように、 どんな音でもかなりよく再現できます。残念ながら、スピーカーを制御する MB2 のハードウェアには 制約があるため、簡単に利用できるのは、完全に内側と完全に外側の位置だけです。
では、スピーカーコーンを 1 秒間に 220 回、外側へ押し出してから内側へ戻してみましょう。 これにより、1 秒あたり 220 周期の「矩形」圧力波が生じます。「cycles-per-second」という単位は ヘルツです。つまり、220Hz の音(音楽でいう「A3」)を生成することになります。これは、この 甲高いスピーカーでもそれほど不快ではありません。
この音を 5 秒間鳴らしてから止めることにします。ここで覚えておくべき重要な点は、この プログラムが MB2 のフラッシュ上にあることです — つまり、MB2 をリセットするたびに、さらには 電源を入れるたびにも、その音は再び鳴り始めます。音を永遠に鳴らし続けるようにすると、この挙動は すぐにかなり煩わしいものになりかねません。
コードは次のとおりです (examples/square-wave.rs)。
#![no_main]
#![no_std]
use cortex_m::asm;
use cortex_m_rt::entry;
use embedded_hal::{delay::DelayNs, digital::OutputPin};
use panic_rtt_target as _;
use rtt_target::rtt_init_print;
use microbit::{
hal::{gpio, timer},
Board,
};
/// The "period" is the time per cycle. It is
/// 1/f where f is the frequency in Hz. In this
/// case we measure time in milliseconds.
const PERIOD: u32 = 1000 / 220;
/// Number of cycles for 5 seconds of output.
const CYCLES: u32 = 5000 / PERIOD;
#[entry]
fn main() -> ! {
rtt_init_print!();
let board = Board::take().unwrap();
let mut speaker_pin = board.speaker_pin.into_push_pull_output(gpio::Level::Low);
let mut timer = timer::Timer::new(board.TIMER0);
for _ in 0..CYCLES {
speaker_pin.set_high().unwrap();
timer.delay_ms(PERIOD / 2);
speaker_pin.set_low().unwrap();
timer.delay_ms(PERIOD / 2);
}
loop {
asm::wfi();
}
}