RustとESP32でLチカを実装する

2024年7月5日
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;
  1. ESP-IDFのシステムの初期化とログ設定の初期化:
esp_idf_svc::sys::link_patches();
esp_idf_svc::log::EspLogger::initialize_default();
  1. ペリフェラルを取得し、GPIO2を出力モードに設定:
let peripherals = Peripherals::take()?;
let mut led = PinDriver::output(peripherals.pins.gpio2)?;
  1. 無限ループで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秒間隔で点滅する。以下の動画で、実際の動作を確認できる。

次の記事はこちら。