入力とポーリング
これまでの章では、GPIO ピンを主に出力として扱い、LED を点灯・消灯してきました。しかし、GPIO ピンは入力として設定することもでき、ボタンの押下やスイッチの切り替えのような物理世界からの信号をプログラムで読み取れます。この章では、これらの入力信号を読み取り、それを使って何か役に立つことを行う方法を学びます。
ボタン状態の読み取り
micro:bit v2 には、入力として設定された GPIO ピンに接続された 2 つの物理ボタン、Button A と Button B があります。具体的には、Button A はピン P0.14 に、Button B はピン P0.23 に接続されています。(これは公式の pinmap table で確認できます。)
GPIO 入力の状態を読み取るには、そのピンの電圧レベルがハイ(3.3V、論理レベル 1)かロー(0V、論理レベル 0)かを確認します。micro:bit の各ボタンは 1 本のピンに接続されています。ボタンが 押されていない とき、そのピンはハイに保たれます。ボタンが押されると、そのピンはローに保たれます。
では、この知識を使って、ボタンが「ロー」(押下状態)かどうかを確認しながら Button A の状態を読み取ってみましょう。
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use embedded_hal::digital::InputPin;
use microbit::Board;
use panic_rtt_target as _;
use rtt_target::{rprintln, rtt_init_print};
#[entry]
fn main() -> ! {
rtt_init_print!();
let board = Board::take().unwrap();
let mut button_a = board.buttons.button_a;
let mut button_state = false;
loop {
if button_a.is_low().unwrap() {
if !button_state {
button_state = true;
rprintln!("Button A pressed");
}
} else if button_state {
button_state = false;
rprintln!("Button A not pressed");
}
}
}
ボタンの状態を監視し続け、その状態が変化するたびに報告します。