コアロジックの実装
ここまでは新規プロジェクトから始め、前の数章では主に理論に焦点を当ててきました。少し退屈に感じたかもしれません(あるいは、見方によっては面白かったかもしれません)。このセクションでは方針を切り替え、実際にコードを書くことに集中して、より実践的で取り組みやすい内容にしていきます。
注意してください。まだマイクロコントローラー固有のいくつかの設定を行う必要があるため、このコードはまだコンパイルも実行もできません。ですが心配はいりません。順を追って進めていきます。今は、コアロジックを構築することに集中しましょう。
インポート
まずは必要なインポートから始めましょう。embedded HAL が提供する DelayNs トレイトと OutputPin トレイトを使用します。DelayNs トレイトを使うと、LED をオン/オフする間に遅延を入れられ、目で確認できる点滅効果を作れます。これがないと、LED は速すぎて見えないほどの速度で切り替わってしまいます。
前述のとおり、OutputPin トレイトは、マイクロコントローラーの出力ピンの状態を変更するためのメソッド(set_low, set_high)を提供します。これを使って、対象の LED に接続された出力ピンを LOW 状態と HIGH 状態の間で切り替えます。
#![allow(unused)] fn main() { use embedded_hal::{delay::DelayNs, digital::OutputPin}; use microbit::{board::Board, hal::timer::Timer}; }
さらに、microbit crate から必要な struct もインポートします。
メイン関数
それでは、main 関数を更新しましょう。
まず、次を呼び出して micro:bit ボードのペリフェラルへのアクセスを取得します。
#![allow(unused)] fn main() { let mut board = Board::take().unwrap(); }
この行により、ボードのシングルトンインスタンスが取得されます。これには、ピン、タイマーなど、マイクロコントローラーのすべてのハードウェアペリフェラルへのハンドルが含まれています。take() メソッドが Option を返すのは、競合やデータ競合を引き起こしかねない複数の可変アクセスを防ぐために、プログラムの存続期間中にペリフェラルを取得できるのは一度だけだからです。ここで unwrap() を呼び出すのは安全です。私たちのプログラムでは take() を一度しか呼び出さない想定だからです。
ボードのペリフェラルを取得したら、次のステップはタイマーインスタンスを作成することです。
#![allow(unused)] fn main() { let mut timer = Timer::new(board.TIMER0); }
ディスプレイマトリクス
LED Matrix セクションで学んだように、1 行目 1 列目の LED を点灯させるには、列 1 を LOW に設定します(つまり GND に接続します)。その後、ループの中で、行 1 を HIGH(つまり電源に接続)と LOW の間で切り替え続け、その間に 500 ms の遅延を入れて点滅効果を作ります。
#![allow(unused)] fn main() { let _ = board.display_pins.col1.set_low(); let mut row1 = board.display_pins.row1; loop { let _ = row1.set_low(); timer.delay_ms(500); let _ = row1.set_high(); timer.delay_ms(500); } }