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

Compass

Мы будем считывать направление с I2C-компаса и записывать показания в последовательный порт. Если останется время, попробуйте как-нибудь вывести его и на светодиоды или использовать кнопки.

Подсказки:

  • Посмотрите документацию крейтов 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.