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 が接続されている ROW1 と COL1
の配線をたどると、それらが nRF52833 上の AC17/P0.21 および B11/AIN4/P0.28 とラベル付けされた
ピンにつながっていることがわかります。さらにドキュメントを調べると、AC17 と B11 はチップの
底面にある物理ピン(実際にははんだボールです)の行と列のインデックスだとわかります — これは私たちには
役に立ちません。AIN4 は、このピンが「アナログ入力」として動作できることを意味するだけで、これも今の
ところ私たちには役に立ちません。(これはあとで関係してきます。)
残るのは P0.21 と P0.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 を通してアクセスしていることに注意してください。ピンにアクセスするには、少し複雑な手順が必要です。最後に、ピンは正しいレベルで初期化するだけでよいので、あらためて設定する必要はありません。ピンを切り替えて動かす話は、次のセクションのテーマです。