Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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();
    }
}