見出し画像

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秒間隔で点滅することが確認できました。

次の記事

いいなと思ったら応援しよう!