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

Rustでmicro:bitのマイクの音量レベルを表示する

まずはシンプルなRustプログラムから始めましょう。このプログラムでは、micro:bitのマイクから取得した音量レベルをシステムコンソールに表示します。これにより、静かな部屋や騒がしい場所など、さまざまな環境で音量レベルがどのように変化するかを観察できます。

後で、拍手や突然の音を検出したときにmicro:bitがLEDマトリクスに絵文字を表示する、楽しいプロジェクトも作成します。

テンプレートからプロジェクトを作成する

このプロジェクトでは、microbit-bsp(Embassy付き)を使用します。テンプレートを使って新しいプロジェクトを生成するには、次のコマンドを実行します。

cargo generate --git https://github.com/ImplFerris/mb2-template.git --rev 3d07b56
  • プロジェクト名の入力を求められたら、"mic-sound-level" のような名前を入力します。

  • asyncを使用するかどうかを尋ねられたら、"true" を選択します。

  • "BSP" と "HAL" のどちらを使用するかを尋ねられたら、"BSP" を選択します。

割り込みのバインド

温度センサーと加速度センサーの章で、すでに似たようなコードを見てきました。ここでは、saadc::InterruptHandler をSAADC割り込みにバインドしています。

これは、SAADCがマイクからの信号を数値に変換し終えるたびに、割り込みハンドラに通知されることをシステムに伝えるものです。この場合は、embassy-nrfクレートが提供する割り込みハンドラを使用しており、これらのイベントの処理をバックグラウンドで担ってくれます。

#![allow(unused)]
fn main() {
bind_interrupts!(struct Irqs {
    SAADC => saadc::InterruptHandler;
});
}

これにより、マイクのセットアップ時に使用するユニット構造体 "Irqs" が得られます。

マイク

マイクを使うには、Microphone::new() を呼び出して4つの引数を渡します。これには、SAADC(board.saadc)、マイクの入力ピン(board.microphone)、マイクを有効化するためのピン(board.micen)、そして先ほど作成した割り込み用のユニット構造体 "Irqs" が含まれます。

#![allow(unused)]
fn main() {
let mut mic = Microphone::new(board.saadc, Irqs, board.microphone, board.micen);
}

マイクのセットアップが完了したら、sound_level() 関数を呼び出せます。これによりマイクがオンになり、音のサンプルが取得され、0から255までの数値が返されます。その後、この値をコンソールに表示できます。

#![allow(unused)]
fn main() {
info!("Sound Level: {}", mic.sound_level().await);
}

完全なコード

#![no_std]
#![no_main]

use defmt::info;
use embassy_executor::Spawner;
use embassy_nrf::{
    bind_interrupts,
    saadc::{self},
};
use embassy_time::Timer;
use microbit_bsp::{Microbit, mic::Microphone};
use {defmt_rtt as _, panic_probe as _};

bind_interrupts!(struct Irqs {
    SAADC => saadc::InterruptHandler;
});

#[embassy_executor::main]
async fn main(_spawner: Spawner) -> ! {
    let board = Microbit::default();

    let mut mic = Microphone::new(board.saadc, Irqs, board.microphone, board.micen);
    loop {
        info!("Sound Level: {}", mic.sound_level().await);
        Timer::after_millis(100).await;
    }
}

既存のプロジェクトをクローンする

作成済みのプロジェクトをクローン(または参照)して、bsp-embassy/mic-sound-level フォルダーに移動することもできます。

git clone https://github.com/ImplFerris/microbit-projects
cd microbit-projects/bsp-embassy/mic-sound-level

実行

それではプログラムをテストしてみましょう。次を使ってmicro:bitに書き込みます。

cargo run

実行が始まると、コンピューターのコンソールに音量レベルの読み取り値が表示されるはずです。

micro:bitの近くで拍手をしたり音を立てたりしてみてください。周囲が騒がしいと音量レベルの値が上がり、静かになると再び下がることがわかるでしょう。