コンパス

I2C接続のコンパスから方位を読み取り、その結果をシリアルポートに出力します。もし時間があれば、LEDやボタンをなんとか利用して方位を出力してみてください。

ヒント:

  • lsm303agr クレートと microbit-v2クレートのドキュメント、ならびにmicro:bitハードウェア仕様を確認してみてください。
  • LSM303AGR慣性計測器は内部のI2Cバスに接続されています。
  • TWIはI2Cの別名なので、I2CマスタはTWIMという名前になっています。
  • LSM303AGRドライバはembedded_hal::blocking::i2c::WriteReadを実装するものを必要とします。 microbit::hal::Twim構造体がこれを実装しています。
  • 様々なピンや周辺I/Oのための microbit::Boardという構造体があります。
  • nRF52833データシートを見ることもできますが、この練習問題のためには必要ないはずです。

練習問題のテンプレート をダウンロードして、compassというディレクトリの中にある下記のファイルを見てください。

src/main.rs:

#![no_main]
#![no_std]

extern crate panic_halt as _;

use core::fmt::Write;
use cortex_m_rt::entry;
use microbit::{hal::uarte::{Baudrate, Parity, Uarte}, Board};

#[entry]
fn main() -> ! {
    let 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 = "2021"
publish = false

[dependencies]
cortex-m-rt = "0.7.3"
embedded-hal = "1.0.0"
lsm303agr = "0.3.0"
microbit-v2 = "0.13.0"
panic-halt = "0.2.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

Ctrl+A Ctrl+Q でpicocomを終了します。