📝

ESP32でRust組み込み開発入門メモ

2023/09/08に公開

はじめに

このメモでは,以下の文献を参考に,ESP32でRustの組み込み開発にチャレンジしています.

  • 文献(1)

https://www.amazon.co.jp/dp/4863543379

  • 文献(2)

https://lang-ship.com/blog/work/esp32-std-rust-1/

その2以降のリンク
  • 文献(3)

https://qiita.com/DaiGuard/items/c4e58f2270c8cbda7460

各文献を以下のように参照しながら,このメモでは進めています.

  1. Rustの公式チュートリアル
  2. 文献(1)のRust入門,Wio Terminal を例にした解説をパラ読み
  3. 文献(2)を途中まで進める
  4. 触りたい機能を調べながら進める

続くメモでは,主に2~3あたりから進めた記録を残しています.

Rustの基本事項

Rustに慣れていない場合,公式チュートリアルがわかりやすいです.
https://doc.rust-jp.rs//

文献(1)でも軽く入門の節が用意されていますが,触っておくとより理解しやすいと思います.
私は以前公式チュートリアルを読んだ関係で,今回は参照していません.

環境構築

Cargoなどのインストールは,文献(1)か,公式チュートリアルを参照して進めます.

環境構築の際,cargo add のタイミングでエラーを吐きました.
Rustcのバージョンがどうやら古かったようです.以下を参考にアップデートしました.
https://qiita.com/DanYuya/items/1b3a9fbd9cef7047b3ca

espupのインストール

Rustでは,CUIベースのEspupを用いて,マイコンへの書き込みなどが可能です.
インストールは搭載チップによって手順が異なります.手元の「ESP32-WROOM-32」では,Xtensaアーキテクチャを用いているようなので,その手順に沿ってインストールします.

GithubのReadmeに,チップ別インストール手順が詳細にかかれています.
https://github.com/esp-rs/rust-build

ここで,文献(3)だと,IDFのバージョン指定が必要と書いてあります.
だけど,Githubのespupの説明に戻ると書いてありません.

helpコマンドを叩いてみると,そもそもバージョン指定のOptionが無いようです.
どうやらリファクタリングされ,オプションなどが変わったようです(以下参照できるかも).
https://github.com/esp-rs/espup/discussions/154

ひとまず,オプションを指定せず,進めることにします.

プロジェクト作成時には,チップの指定が必要です.今回はHiLetGoのESP32を使ったので,プロジェクト作成時には,esp32を選択しました.
http://www.hiletgo.com/ProductDetail/1906566.html
https://www.ekit-tech.com/?p=3939

なおこの後,サンプルプロジェクトのBuild(Hello world)をする際につまり,Cargo install ldploxy をやらないとサンプルがビルドできませんでした.たぶん実行漏れか,文献のどっかで抜けてるのかな.

ファームウェアのアップデート

公式ガイドにターミナルで叩ける(esptool.py)経由のアプデ方法が記載されています.こちらを参照に更新してください.
https://docs.espressif.com/projects/esp-at/en/latest/esp32/Get_Started/Downloading_guide.html

M1: Espflashのインストール注意

M1 Mac の場合,メインブランチのものではうまく動かないことが報告されています.こちらのissuesを参照してください.
https://github.com/esp-rs/espflash/pull/387

Lチカ

その2の文献を参照しながらLチカを試してみます.
ビルド,転送コマンドは以下リンクも参照してください.
https://github.com/esp-rs/esp-idf-template#flash

まずデバイス接続の確認についてです.転送経路について,デバイス一覧は以下で表示可能.
espflash monitor-board

ここでデバイスが出てこない場合,ケーブルの問題(充電専用?容量不足?など)などが考えられます.適宜トラシューしてください.

デバイスが表示されたら,それを選択してコンパイル,プログラム書き込みを行ってください.
手順は文献(2)を参照してください.

ファイルの入出力

ESP32では,いくつか領域上にファイルなどを保存する方法があります.今回はSPIFFS(領域内にメモリを確保する方法)を使いますが,SDカードについてもサンプルコードを示しておきます.

SDカードについて

以下のサンプルコードが参考になります.適宜参照ください.
https://github.com/taunusflieger/esp-sdmmc-experiment/tree/master

SPIFFSについて

SPIFFSのサンプルプログラムは,以下を参照ください.
どのような処理をしているのかについては,Qiitaの(Arduino IDEなどで実装している)解説記事なども参照するとわかりやすいです.

参考1:
https://github.com/anichno/esp32-spiffs-example/tree/main

参考2(このコードではSPIFFS以外も触っています):
https://github.com/bytebeamio/bytebeam-esp-rs-sdk/blob/6cb3d933bc8b379deeba68b968e6d18a14c78644/tools/provision/src/main.rs

なお,SPIFFSの使用にあたっては,パーティションの指定が必要です.
以下を参照してパーティションのCSVファイルを作ってください.
https://qiita.com/yomori/items/743bc84c961bb921d8cb

実行時コマンドでpartition.csvのパスを指定する文献が多いのですが,0.2.x系での仕様のようで,1.x系ではcargoのconfigで指定する形に変わったようです.

csvの読み取り権限がうまく行っていなかったりすると,エラーになります.
必要に応じてトラシューしてください.

BLE

BLEの基本仕様を理解できる良い感じの文献がありました.
http://marchan.e5.valueserver.jp/cabin/comp/jbox/arc212/doc21201.html

実装は,消費電力の少ない実装として,Nimbleを使います.
Rustラッパーはこちら.
https://lib.rs/crates/esp32-nimble

実装方法,見当がつかず苦労していたのですが,こちらにサンプルがありました.
https://github.com/ActuallyHappening/SmilePal-ESP32-BLE-rs/tree/develop

スキャン時に設定する事項はここなどを参考ください.
https://development.libelium.com/ble-networking-guide/scanning-ble-devices

wifi

以下のコードを参考.
https://medium.com/@rajeshpachaikani/connect-esp32-to-wifi-with-rust-7d12532f539b
https://github.com/hnz1102/temp-logger/blob/main/src/temp-logger/src/wifi.rs
https://chakoku.hatenablog.com/entry/2023/04/22/174527

が,自環境では動かない...
wifi.scan()ではエラーになる.トラシュー中.

https://programresource.net/2020/02/25/2987.html
https://qiita.com/Kosuke_Matsui/items/cbb39fd9cd5a120e15fe
https://stackoverflow.com/questions/67084998/esp32-cant-connect-to-iphone-personal-hotspot

wifi_init()などを実行してからやろうとしてみる.するとログが変わる.
unregister Rx callbacks などにエラーが変わる.そういえばpartition.csvをいじっていたけど,関係あるかな?

https://www.esp32.com/viewtopic.php?t=6020
https://www.esp32.com/viewtopic.php?f=13&t=15978

partition.csvをいじる方向に.
その前に,一度bleとファイル書き込みを無効化して書き込むか.

関係なさそう.

https://github.com/esphome/issues/issues/3029#issuecomment-1033952579

I was looking for other MCUs as an alternatives, and found that for some other MCUs there is feedback that there is an issue with schematic, such that Wi-Fi activation creates a power surge that somehow crashes the ESP. And apparently people fix it by soldering some extra capacitor. Do you think something similar might be happening here? I wonder if I'm just unlucky and both of the units are from the same batch and have an issue (the other 4 of these units I bought a year ago so maybe something changed in the way they do them).

Oops...

Discussion