Embassy をサポートする Microbit BSP クレート
これまで、ブロッキングモードで動作する microbit-v2 BSP クレートを使ってきました。ここでは、Embassy による async プログラミングをサポートする別の BSP クレート microbit-bsp を紹介します。Embassy との統合に加えて、このクレートには scroll 関数のような便利なユーティリティも含まれており、LED マトリクスにスクロールテキストを簡単に表示できます。
それでは、このクレートを使ってシンプルな async プログラムを作成してみましょう。
Embassy Project Template
これまでは、この本のために特別に設計されたカスタムプロジェクトテンプレートを使ってきました。Ulf Lilleengen によって作成された Embassy Project Template も利用できます。このテンプレートは Embassy ベースのプロジェクト向けに設計されており、幅広いマイクロコントローラーをサポートしています。実際、これは microbit-bsp クレートをメンテナンスしているのと同じ人物によって作成されました。
cargo generate --git https://github.com/lulf/embassy-template.git
ターゲットのマイクロコントローラーを選択するよう求められたら、"nrf52833" を選んでください。これにより、nrf52833 チップ(micro:bit v2 を動かしているチップ)向けの Embassy サポートが設定された新しいプロジェクトが作成されます。
もともと、私は Embassy プロジェクトを生成するためにこのテンプレートを使っていました。しかし、執筆時点では embassy-nrf の最新の GitHub リビジョンが含まれていませんでした。私は embassy-nrf と microbit-bsp の両方にあるいくつかの新機能を使いたかったため、カスタムテンプレートに切り替えました。
それでも、これは優れていて便利なテンプレートなので、ここに残してあります。この本を読み終えてさらにいろいろ試してみたくなったときに役立つでしょう。
テンプレートからプロジェクトを作成
このプロジェクトでは、microbit-bsp(Embassy 対応)を使用します。テンプレートを使って新しいプロジェクトを生成するには、次のコマンドを実行してください。
cargo generate --git https://github.com/ImplFerris/mb2-template.git --rev 3d07b56
-
プロジェクト名の入力を求められたら、"led-scroll" のような名前を入力します。
-
async を使うかどうかを尋ねられたら、"true" を選択します。
-
"BSP" と "HAL" のどちらを使うかの選択を求められたら、"BSP" を選択します。
プロジェクトが生成されたら、Cargo.toml ファイルを開いてください。そこには microbit-bsp クレートと、その他の Embassy 関連クレートが含まれていることがわかります。
BSP のボイラープレートコード
src/main.rs ファイルを開いてください。そこには、Microbit 構造体のインスタンスを作成するボイラープレートコードがあります。これにより、ボードの周辺機器にアクセスできます。
#[embassy_executor::main] async fn main(_spawner: Spawner) -> ! { let board = Microbit::default(); loop { Timer::after_secs(1).await; } }
このテンプレートには、Timer を使って 1 秒待機するシンプルなループが含まれています。これを削除して、このプロジェクト用に独自のループロジックを書いていきます。
ディスプレイを初期化する
LED マトリクスディスプレイを使うには、まずボードからその所有権を取得する必要があります。
#![allow(unused)] fn main() { let mut display = board.display; }
これで内蔵の 5x5 LED ディスプレイにアクセスできるようになり、パターンやアニメーションを表示し始めることができます。
明るさの調整
BSP クレートには、LED マトリクスの明るさを制御する便利な関数があります。明るさの値は 0(Brightness::MIN)から 10(Brightness::MAX)まで指定できます。さまざまな値を試して、LED の明るさがどのように変わるかを確認してみてください。
#![allow(unused)] fn main() { display.set_brightness(Brightness::new(5)); }
スクロールするテキスト
BSP クレートには、LED ディスプレイ上でテキストをスクロールさせるための関数が 2 つ用意されています。scroll 関数はテキストの長さに基づいて時間を自動計算し、scroll_with_speed は Duration を指定することでスクロール速度を完全に制御できます。
この例では、テキストがどれくらいの速さでスクロールするかを制御できるように、scroll_with_speed を使います。
#![allow(unused)] fn main() { display.scroll_with_speed("EMBASSY", Duration::from_secs(10)).await; }
完全なコード
メインループの中では、テキスト "EMBASSY" をディスプレイ上で繰り返しスクロールさせます。各スクロールの後に、embassy_time::Timer を使って短い待機を入れてから繰り返します。
#![no_std] #![no_main] use embassy_executor::Spawner; use embassy_time::{Duration, Timer}; use microbit_bsp::Microbit; use microbit_bsp::display::Brightness; use {defmt_rtt as _, panic_probe as _}; #[embassy_executor::main] async fn main(_spawner: Spawner) -> ! { let board = Microbit::default(); let mut display = board.display; display.set_brightness(Brightness::new(5)); loop { display .scroll_with_speed("EMBASSY", Duration::from_secs(10)) .await; Timer::after_secs(1).await; } }
既存のプロジェクトをクローンする
私が作成したプロジェクトをクローン(または参照)して、bsp-embassy/led-scroll フォルダに移動することもできます。
git clone https://github.com/ImplFerris/microbit-projects
cd microbit-projects/bsp-embassy/led-scroll
書き込み
プログラムを micro:bit に書き込んで、スクロールするテキストを確認できます。また、明るさの値を調整して観察してみてください。
cargo flash