前回の記事で、RustでESP32の開発環境を構築した。 今回はその環境を使って実際にLEDを点滅させるプログラムを作成する。
コード
Cargo.tomlに以下の依存パッケージを追加した。
[dependencies]
log = { version = "0.4", default-features = false }
esp-idf-svc = { version = "0.49", default-features = false }
esp-idf-hal = "0.44.0"
esp-idf-sys = "0.35.0"
anyhow = "1.0.86"
LEDを点滅させるためのRustコードは以下の通り。
use esp_idf_hal::gpio::PinDriver;
use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::peripherals::Peripherals;
fn main() -> anyhow::Result<()> {
esp_idf_svc::sys::link_patches();
esp_idf_svc::log::EspLogger::initialize_default();
let peripherals = Peripherals::take()?;
let mut led = PinDriver::output(peripherals.pins.gpio2)?;
loop {
led.set_high()?;
FreeRtos::delay_ms(1000);
led.set_low()?;
FreeRtos::delay_ms(1000);
}
}
コードの解説
- 必要なクレートをインポート:
use esp_idf_hal::gpio::PinDriver;
use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::peripherals::Peripherals;
- ESP-IDFのシステムの初期化とログ設定の初期化:
esp_idf_svc::sys::link_patches();
esp_idf_svc::log::EspLogger::initialize_default();
- ペリフェラルを取得し、GPIO2を出力モードに設定:
let peripherals = Peripherals::take()?;
let mut led = PinDriver::output(peripherals.pins.gpio2)?;
- 無限ループでLEDの点灯と消灯を繰り返す:
loop {
led.set_high()?;
FreeRtos::delay_ms(1000);
led.set_low()?;
FreeRtos::delay_ms(1000);
}
このコードで、GPIO2に接続されたLEDが1秒間隔で点滅する。
LEDをESP32に接続する際の回路構成
LEDは足が長い方がプラス側(アノード)なので、ESP32のGPIO2と接続する。反対側はGNDピンに接続する。
LEDに流れる電流を調整するため、手元にあった500Ωの抵抗を+側に置く。 ESP32のGPIOピンの電圧は3.3V、赤色LEDは1.8V程度の順方向電圧降下なので、 抵抗にかかる電圧は、3.3V - 1.8V = 1.5V となり、オームの法則 I = V/R より、1.5V/500Ω = 3mA が流れる電流となる。
動作確認
プログラムを実行すると、LEDが1秒間隔で点滅する。以下の動画で、実際の動作を確認できる。
次の記事はこちら。