ESP32でRust組み込み開発入門メモ
はじめに
このメモでは,以下の文献を参考に,ESP32でRustの組み込み開発にチャレンジしています.
- 文献(1)
- 文献(2)
その2以降のリンク
- 文献(3)
各文献を以下のように参照しながら,このメモでは進めています.
- Rustの公式チュートリアル
- 文献(1)のRust入門,Wio Terminal を例にした解説をパラ読み
- 文献(2)を途中まで進める
- 触りたい機能を調べながら進める
続くメモでは,主に2~3あたりから進めた記録を残しています.
Rustの基本事項
Rustに慣れていない場合,公式チュートリアルがわかりやすいです.
文献(1)でも軽く入門の節が用意されていますが,触っておくとより理解しやすいと思います.
私は以前公式チュートリアルを読んだ関係で,今回は参照していません.
環境構築
Cargoなどのインストールは,文献(1)か,公式チュートリアルを参照して進めます.
環境構築の際,cargo add のタイミングでエラーを吐きました.
Rustcのバージョンがどうやら古かったようです.以下を参考にアップデートしました.
espupのインストール
Rustでは,CUIベースのEspupを用いて,マイコンへの書き込みなどが可能です.
インストールは搭載チップによって手順が異なります.手元の「ESP32-WROOM-32」では,Xtensaアーキテクチャを用いているようなので,その手順に沿ってインストールします.
GithubのReadmeに,チップ別インストール手順が詳細にかかれています.
ここで,文献(3)だと,IDFのバージョン指定が必要と書いてあります.
だけど,Githubのespupの説明に戻ると書いてありません.
helpコマンドを叩いてみると,そもそもバージョン指定のOptionが無いようです.
どうやらリファクタリングされ,オプションなどが変わったようです(以下参照できるかも).
ひとまず,オプションを指定せず,進めることにします.
プロジェクト作成時には,チップの指定が必要です.今回はHiLetGoのESP32を使ったので,プロジェクト作成時には,esp32を選択しました.
なおこの後,サンプルプロジェクトのBuild(Hello world)をする際につまり,Cargo install ldploxy をやらないとサンプルがビルドできませんでした.たぶん実行漏れか,文献のどっかで抜けてるのかな.
ファームウェアのアップデート
公式ガイドにターミナルで叩ける(esptool.py)経由のアプデ方法が記載されています.こちらを参照に更新してください.
M1: Espflashのインストール注意
M1 Mac の場合,メインブランチのものではうまく動かないことが報告されています.こちらのissuesを参照してください.
Lチカ
その2の文献を参照しながらLチカを試してみます.
ビルド,転送コマンドは以下リンクも参照してください.
まずデバイス接続の確認についてです.転送経路について,デバイス一覧は以下で表示可能.
espflash monitor-board
ここでデバイスが出てこない場合,ケーブルの問題(充電専用?容量不足?など)などが考えられます.適宜トラシューしてください.
デバイスが表示されたら,それを選択してコンパイル,プログラム書き込みを行ってください.
手順は文献(2)を参照してください.
ファイルの入出力
ESP32では,いくつか領域上にファイルなどを保存する方法があります.今回はSPIFFS(領域内にメモリを確保する方法)を使いますが,SDカードについてもサンプルコードを示しておきます.
SDカードについて
以下のサンプルコードが参考になります.適宜参照ください.
SPIFFSについて
SPIFFSのサンプルプログラムは,以下を参照ください.
どのような処理をしているのかについては,Qiitaの(Arduino IDEなどで実装している)解説記事なども参照するとわかりやすいです.
参考1:
参考2(このコードではSPIFFS以外も触っています):
なお,SPIFFSの使用にあたっては,パーティションの指定が必要です.
以下を参照してパーティションのCSVファイルを作ってください.
実行時コマンドでpartition.csvのパスを指定する文献が多いのですが,0.2.x系での仕様のようで,1.x系ではcargoのconfigで指定する形に変わったようです.
csvの読み取り権限がうまく行っていなかったりすると,エラーになります.
必要に応じてトラシューしてください.
BLE
BLEの基本仕様を理解できる良い感じの文献がありました.
実装は,消費電力の少ない実装として,Nimbleを使います.
Rustラッパーはこちら.
実装方法,見当がつかず苦労していたのですが,こちらにサンプルがありました.
スキャン時に設定する事項はここなどを参考ください.
wifi
以下のコードを参考.
が,自環境では動かない...
wifi.scan()ではエラーになる.トラシュー中.
wifi_init()などを実行してからやろうとしてみる.するとログが変わる.
unregister Rx callbacks などにエラーが変わる.そういえばpartition.csvをいじっていたけど,関係あるかな?
partition.csvをいじる方向に.
その前に,一度bleとファイル書き込みを無効化して書き込むか.
関係なさそう.
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