教科書ではこの次はHTTP接続に行くのだが、いきなりHTTPは敷居が高いので、地道にLチカをやってみたい。Lチカはむしろ、no_stdが似つかわしいサンプルなのだが、no_stdだとHTTP/MQTT等はできない(?)と思われ、stdでのLチカを試作してみる。
Rustで0からLチカ書くなんてできないので、さっさとサンプルを見る。
esp-idf-hal/blinky.rs at master · esp-rs/esp-idf-hal · GitHub
使うライブラリは、esp-idf-halのようだった。 halはHardware Abstraction Layer(ハード抽象化)
ソースは以下(少し編集した。 flushが働かず、シリアルからの入力なし)
use esp_idf_hal::delay::FreeRtos; use esp_idf_hal::gpio::PinDriver; use esp_idf_hal::peripherals::Peripherals; use std::io::{self, Write}; use log::*; fn main()-> anyhow::Result<()> { esp_idf_sys::link_patches(); esp_idf_svc::log::EspLogger::initialize_default(); info!("Hello, world!"); println!("##### Hello, world! #####"); let peripherals = Peripherals::take().unwrap(); let mut led = PinDriver::output(peripherals.pins.gpio7)?; loop{ led.set_high()?; print!("1"); FreeRtos::delay_ms(1000); led.set_low()?; print!("0"); FreeRtos::delay_ms(1000); io::stdout().flush().unwrap(); } }
Cargo.tomlの内容は以下。エラーにならない範囲で不要と思われるモジュールを削減
[package] name = "blink-from-cg" version = "0.1.0" authors = ["sumi"] edition = "2021" resolver = "2" rust-version = "1.66" [profile.release] opt-level = "s" [profile.dev] debug = true # Symbols are nice and they don't increase the size on Flash opt-level = "z" [features] default = ["std", "hal", "esp-idf-sys/native"] pio = ["esp-idf-sys/pio"] hal = ["esp-idf-hal", "embedded-svc", "esp-idf-svc"] std = ["alloc", "esp-idf-sys/std", "esp-idf-sys/binstart", "embedded-svc?/std", "esp-idf-hal?/std", "esp-idf-svc?/std"] alloc = ["embedded-svc?/alloc", "esp-idf-hal?/alloc", "esp-idf-svc?/alloc"] #all = ["std", "nightly", "experimental", "embassy"] #nightly = ["embedded-svc?/nightly", "esp-idf-svc?/nightly"] # Future: "esp-idf-hal?/nightly" #experimental = ["embedded-svc?/experimental", "esp-idf-svc?/experimental"] #embassy = ["esp-idf-hal?/embassy-sync", "esp-idf-hal?/critical-section", "esp-idf-hal?/edge-executor", "esp-idf-svc?/embassy-time-driver", "esp-idf-svc?/embassy-time-isr-queue"] [dependencies] esp-idf-sys = { version = "0.32.1", default-features = false } esp-idf-svc = { version = "0.45.0", optional = true, default-features = false } log = { version = "0.4.17", default-features = false } esp-idf-hal = { version = "0.40.1", optional = true, default-features = false } embedded-svc = { version = "0.24", optional = true, default-features = false } anyhow = {version = "1", features = ["backtrace"]} [build-dependencies] embuild = "0.31.2" anyhow = "1"
esp_idf_halのgpio配下のPinDriveを使って、Pinオブジェクト?を作っている(のか?)
PinDriverの仕様書は以下
PinDriver in esp_idf_hal::gpio - Rust
ここで、疑問が、、 embedded-halを使わず、esp-idf-halを使うのはなぜか。 embedded-halは抽象化しすぎて使えない?