
RustとESP32でLチカを試す
前回の記事で、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);
}
}
コードの解説
1) 必要なクレートをインポート
use esp_idf_hal::gpio::PinDriver;
use esp_idf_hal::delay::FreeRtos;
use esp_idf_hal::peripherals::Peripherals;
2) ESP-IDFのシステムの初期化とログ設定の初期化
esp_idf_svc::sys::link_patches();
esp_idf_svc::log::EspLogger::initialize_default();
3) ペリフェラルを取得し、GPIO2を出力モードに設定
let peripherals = Peripherals::take()?;
let mut led = PinDriver::output(peripherals.pins.gpio2)?;
4) 無限ループで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秒間隔で点滅することが確認できました。