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

Hello World

前のセクションでは、一種の「Hello World」プログラムを書きました。しかし、組み込みプログラマにとっての 「本当の Hello World」は、LED を 1 秒ごとに点滅させることです — どの LED でもかまいません。これを行う プログラムは、一般に「blinky」として知られています。

なぜ blinky なのでしょうか? それは、この単純なタスクを実行できる程度には、作業対象のボードを十分に 制御できていることを示すからです。マシンにプログラムをロードして実行できること、MCU 上の適切なピンを 見つけてオンにできること、一定時間の遅延を入れられること。ここまで制御できれば、ほかのタスクはずっと 取り組みやすくなります。

前の章では、プログラムを MB2 にロードする方法をいくつか見つけました。あとは、どのピンをオン/オフするか、 そしてそれらの操作の間にどう遅延を入れるかという問題です。

まずは、必要なピンの扱い方を調べるところから始めましょう。電子回路の「schematic」図の読み方がわかるなら、 このためにたどれる道筋があります。MB2 schematic を見つけ、その回路図上でオン/オフしたい LED を見つけ、 その LED に接続されている nRF52833 上の GPIO ピンがどれかを調べられます。(この点で MB2 は少し特殊です。 通常、LED はオン/オフを切り替える 1 本のピンにだけ接続されています。MB2 の LED「ディスプレイ」は、 LED の組み合わせを一度にオン/オフできるよう、より複雑な方法で接続されています。これは、このあとすぐに 使う機能です。)

MB2 ディスプレイの左上隅にある LED を扱います。この LED が接続されている ROW1COL1 の配線をたどると、それらが nRF52833 上の AC17/P0.21 および B11/AIN4/P0.28 とラベル付けされた ピンにつながっていることがわかります。さらにドキュメントを調べると、AC17B11 はチップの 底面にある物理ピン(実際にははんだボールです)の行と列のインデックスだとわかります — これは私たちには 役に立ちません。AIN4 は、このピンが「アナログ入力」として動作できることを意味するだけで、これも今の ところ私たちには役に立ちません。(これはあとで関係してきます。)

残るのは P0.21P0.28 です。これらのラベルは、LED を点灯させるためにオン/オフできる nRF52833 の メモリ内のビットに対応しています。電気的な理由により、ピン P0.21 をオンにして(つまり 3.3V を出力し)、 ピン P0.28 をオフにして(つまり電圧を受ける状態にすると)、LED が点灯します。

では、これを起こすにはソフトウェアで何をすればよいのでしょうか? ここでは nrf52833-hal crate のレベルで 作業します。Hardware Abstraction Layer(HAL)は、特定のマイクロコントローラーを扱いやすくするために 設計されたソフトウェアのまとまりです。名前からわかるとおり、MB2 上のマイクロコントローラー用のものが あります。そして都合のよいことに、目的の LED を点灯させるのに必要なものがすべて含まれています。

この章のディレクトリにある examples/light-up.rs を見てから、実際に実行してみてください。 前と同じように凝った方法を使ってもよいですが、次のようにして実行できるよう設定してあります。

cargo run --example light-up

とすると、プログラムがロードされて実行されます。その 1 つの LED が明るく点灯しているはずです!

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use nrf52833_hal::{gpio, pac};
use panic_halt as _;

#[entry]
fn main() -> ! {
    let peripherals = pac::Peripherals::take().unwrap();
    let p0 = gpio::p0::Parts::new(peripherals.P0);
    let _row1 = p0.p0_21.into_push_pull_output(gpio::Level::High);
    let _col1 = p0.p0_28.into_push_pull_output(gpio::Level::Low);

    #[allow(clippy::empty_loop)]
    loop {}
}

このチップ用の Peripheral Access Crate(PAC)には、HAL crate を通してアクセスしていることに注意してください。ピンにアクセスするには、少し複雑な手順が必要です。最後に、ピンは正しいレベルで初期化するだけでよいので、あらためて設定する必要はありません。ピンを切り替えて動かす話は、次のセクションのテーマです。