シンプルな組み込み Rust プロジェクト: 拍手すると microbit にスマイリーを表示する
前の例では、micro:bit に内蔵されたマイクから音量レベルを読み取り、その値をシステムコンソールに出力する方法を見てきました。今回は、それをさらに一歩進めます。このシンプルな Rust プロジェクトでは、音量レベルの検出を使って拍手を認識し、micro:bit の 5x5 LED マトリクスにスマイリーフェイスを表示します。
プロジェクトを作成する
値を出力するまでの手順は前のセクションと同じです。同じ手順をもう一度たどる代わりに、プロジェクトをクローンして "clap2smile" のような名前に変更することをおすすめします。
または、私が作成したプロジェクトをクローンして、それをベースに作業することもできます。
git clone https://github.com/ImplFerris/microbit-projects
# 任意のディレクトリにコピー
cp microbit-projects/bsp-embassy/mic-sound-level clap2smile
cd clap2smile
スマイリーフェイス
microbit-v2 crate を使っていたときは、スマイリーを表現するためにシンプルな 2 次元マトリクスを使っていました。microbit-bsp crate では、Frame 構造体と Bitmap 構造体を使って形状を定義する必要があります。
5x5 LED マトリクスの各行は、Bitmap::new 関数を使って 2 進数 (u8) として表現します。
#![allow(unused)] fn main() { let smile_frame = Frame::<5, 5>::new([ Bitmap::new(0b00000, 5), Bitmap::new(0b01010, 5), Bitmap::new(0b00000, 5), Bitmap::new(0b10001, 5), Bitmap::new(0b01110, 5), ]); led_matrix.set_brightness(Brightness::MAX); }
しきい値
拍手を検出するには、音量レベルのしきい値を定義する必要があります。micro:bit のマイクは 0 から 255 までの値を返し、値が大きいほど音が大きいことを示します。拍手は通常、この値に急激なスパイクを発生させます。
#![allow(unused)] fn main() { const CLAP_THRESHOLD: u8 = 180; }
しきい値は 180〜200 あたりから始めることができます。拍手にどれくらいの大きさを求めるかという好みや、周囲の環境に応じてこの値を調整できます。
そしてロジックはシンプルです。音量レベルがこのしきい値を超えたら、それを拍手とみなし、スマイリーフェイスの表示をトリガーします。
#![allow(unused)] fn main() { if mic.sound_level().await > CLAP_THRESHOLD { led_matrix .display(smile_frame, Duration::from_secs(1)) .await; } }
完全なコード
#![no_std] #![no_main] // use defmt::info; use embassy_executor::Spawner; use embassy_nrf::{ bind_interrupts, saadc::{self}, }; use embassy_time::{Duration, Timer}; use microbit_bsp::{ Microbit, display::{Bitmap, Brightness, Frame}, mic::Microphone, }; use {defmt_rtt as _, panic_probe as _}; bind_interrupts!(struct Irqs { SAADC => saadc::InterruptHandler; }); const CLAP_THRESHOLD: u8 = 180; #[embassy_executor::main] async fn main(_spawner: Spawner) -> ! { let board = Microbit::default(); let mut led_matrix = board.display; let mut mic = Microphone::new(board.saadc, Irqs, board.microphone, board.micen); let smile_frame = Frame::<5, 5>::new([ Bitmap::new(0b00000, 5), Bitmap::new(0b01010, 5), Bitmap::new(0b00000, 5), Bitmap::new(0b10001, 5), Bitmap::new(0b01110, 5), ]); led_matrix.set_brightness(Brightness::MAX); loop { // info!("音量レベル: {}", mic.sound_level().await); if mic.sound_level().await > CLAP_THRESHOLD { led_matrix .display(smile_frame, Duration::from_secs(1)) .await; } Timer::after_millis(100).await; } }
既存のプロジェクトをクローンする
私が作成したプロジェクトをクローンする(または参照する)こともできます。そして bsp-embassy/clap2smile フォルダに移動します。
git clone https://github.com/ImplFerris/microbit-projects
cd microbit-projects/bsp-embassy/clap2smile
実行する
それでは、プログラムをテストしてみましょう。次を使って micro:bit に書き込みます。
cargo run
実行が始まったら、micro:bit の近くで拍手してみてください。LED マトリクスにスマイリーフェイスが表示されるはずです。ちなみに、これは拍手そのものを特別に検出しているわけではなく、単に音量レベルがしきい値を超えたかどうかをチェックしているだけです。そのため、叫び声のような大きな音でもスマイリーがトリガーされます。