コンパス
I2C コンパスから方位を読み取り、その測定値をシリアル ポートに記録します。時間があれば、何らかの形で LED に表示したり、 ボタンを何らかの形で使ったりしてみてください。
ヒント:
lsm303agrとmicrobit-v2クレートのドキュメント、および micro:bit ハードウェア を 確認してください。- LSM303AGR 慣性計測ユニットは、内部 I2C バスに接続されています。
- TWI は I2C の別名なので、I2C マスターペリフェラルは TWIM と呼ばれます。
- LSM303AGR ドライバには、
embedded_hal::i2c::I2cトレイトを実装するものが必要です。これはmicrobit::hal::Twim構造体が実装しています。 - さまざまなピンやペリフェラル用のフィールドを持つ
microbit::Board構造体が使えます。 - 必要であれば nRF52833 データシート を参照してもかまいませんが、この演習では必要ないはずです。
演習テンプレート をダウンロードし、 compass ディレクトリで次のファイルを確認してください。
src/main.rs:
// Copyright 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 #![no_main] #![no_std] extern crate panic_halt as _; use core::fmt::Write; use cortex_m_rt::entry; use microbit::{hal::{Delay, uarte::{Baudrate, Parity, Uarte}}, Board}; #[entry] fn main() -> ! { let mut board = Board::take().unwrap(); // Configure serial port. let mut serial = Uarte::new( board.UARTE0, board.uart.into(), Parity::EXCLUDED, Baudrate::BAUD115200, ); // Use the system timer as a delay provider. let mut delay = Delay::new(board.SYST); // Set up the I2C controller and Inertial Measurement Unit. // TODO writeln!(serial, "Ready.").unwrap(); loop { // Read compass data and log it to the serial port. // TODO } }
Cargo.toml(これは変更する必要はないはずです):
[workspace]
[package]
name = "compass"
version = "0.1.0"
edition = "2024"
publish = false
[dependencies]
cortex-m-rt = "0.7.5"
embedded-hal = "1.0.0"
lsm303agr = "1.1.0"
microbit-v2 = "0.16.0"
panic-halt = "1.0.0"
Embed.toml(これは変更する必要はないはずです):
[default.general]
chip = "nrf52833_xxAA"
[debug.gdb]
enabled = true
[debug.reset]
halt_afterwards = true
.cargo/config.toml(これは変更する必要はないはずです):
[build]
target = "thumbv7em-none-eabihf" # Cortex-M4F
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
rustflags = ["-C", "link-arg=-Tlink.x"]
Linux では、次のようにしてシリアル出力を確認できます:
picocom --baud 115200 --imap lfcrlf /dev/ttyACM0
または Mac OS では次のようになります(デバイス名は多少異なる場合があります):
picocom --baud 115200 --imap lfcrlf /dev/tty.usbmodem14502
picocom を終了するには Ctrl+A Ctrl+Q を使います。