NUCLEO-F302R8 wifi ESP32 開発環境
NUCLEO-F302R8でwifi通信することが目標です。
NUCLEO-F302R8にwifiの機能はありません。ESP32-WROOM-32-DevKitCをUARTで繋ぎ、wifi機能を使用して通信をします。
前回、ESP32にUARTでATコマンドを送信できるところまで確認しました。
続いてWIFIの通信を試してみたのですが、やりたいことができなかったです。
■やりたかったこと
WIFIのパケットだけ送信したい。TCP/IPのパケットはFreeRTOSのTCPモジュールで作る。
ATコマンドのリファレンスを見ていると、WIFIパススルーモードがあった。これで行けそう。
■試した結果
パススルーモードに遷移するコマンドを送信するとエラーになった。リファレンスをよく見るとTCP/UDPのコネクションが必要だった。
TCP/IPのパケットはFreeRTOSのTCPモジュールで作るので、ESP32で作ってほしくない。
■解決方法
ESP32で自作のUART-WIFIのプログラムを作成します。
調査してみるとプログラムが作れそうな感じでした。
- ATコマンドのファームウェアは非公開。ATコマンドのファームウェアでは実現できない。
- ESP32-IDF(SDKみたいなもの)のサンプルコードにWIFIのステーションモードがありました。これを改造して作れそうでした。
https://github.com/espressif/esp-idf/tree/v5.1.2/examples/wifi/getting_started/station - サンプルコードもFreeRTOSを使っていたので、馴染みやすそう。
STMは中断でESP32のプログラミングを行っていきます。今回はESP32の開発環境について説明します。
リファレンス
STM32
- マイコンのRM(リファレンスマニュアル)
- マイコンのDS(データシート)
- DS: https://www.st.com/resource/en/datasheet/stm32f302r6.pdf
- マイコンのPin配置やポートの機能一覧、HW特性
- マイコンのPM(プログラミングマニュアル)
ESP32
- ESP32-IDF プログラミングガイド
- ESP32-DevKitC-32E データシート
ESP32-IDFのセットアップ
以下の記事を見てください。
私がインストールしたIDFのバージョン: esp-idf-v5.1.2
WIFIサンプルコード
IDFのサンプルコードにWIFIステーションモードがあります。
\examples\wifi\getting_started\station
このコードをベースにします。これでWIFIパケットの送信ができて、あとはUARTでSTMと通信するコードを実装するだけでよいかと期待していました。しかし、以下のような課題がありました。
- stationモードでアクセスポイントに接続するまでのコードになっています。データの送受信は実装されていません。
- データの送受信はESP-NETIFというコンポーネントで抽象化されます。IDFには以下の2つのESP-NETIFが用意されています。
今回使用するWIFIステーションモードのサンプルはESP-NETIFにlwipを使用します。私のやりたいことではTCP/IPプロトコルスタックは不要となります。
- lwip: 軽量なTCP/IPプロトコルスタック
- loopback: 名前の通り。
以上より、自作のESP-NETIFコンポーネントを作成します。
自作のESP-NETIFコンポーネントの作成
公式に以下のような自作コンポーネント作成に関する記載があります。
この手順に沿ってesp_netif_passthroughという自作ESP-NETIFを作成します。
コンポーネントのオーバーライド
IDFではESP-NETIFのような機能のまとまりをコンポーネントと言います。前述したlwip、loopbackもESP-NETIFというコンポーネントに含まれます。
コンポーネントはオーバーライドすることができます。IDFにあるコンポーネントをプロジェクトフォルダにコピーして変更すると、プロジェクトにあるコンポーネントがビルドされます。
IDFのESP-NETIF(\esp-idf-v5.1.2\components\esp_netif)をプロジェクトフォルダにコピーしてesp_netif_passthroughの追加をします。
変更のコミットログです。
https://github.com/ohmusso/wifi_netif/commit/8fb5355a352e1f12ce39b5c9976f5ef323c9023c
Kconfigの修正
コンポーネントにはKconfigというファイルがあります。これは idf.py menuconfig を実行したときに立ち上がるメニューから設定できる項目を記述したファイルです。
ESP-NETIFのKconfigにはTCP/IP Stack Libraryを選択する項目があります。lwip、loopbackを選択できるようになっていますので、ここにpassthroughを追加します。
定義したconfigはCONFIG_XXXとしてcmakeで参照できます。menuconfigから有効にすると、CONFIG_XXXがTRUEになります。
CMakeLists.txtの修正
ビルドするファイルを記述しています。passthroughのCONFIG_XXXが有効の場合にesp_netif_passthrough.cがビルド対象となるように修正します。
esp_netif_passthrough.cの中身は空です。
KconfigとCMakeListsを変更したコミットログです。
https://github.com/ohmusso/wifi_netif/commit/c1eda44f0efc2bff969873252ffdc1f9a84ddca0
次回
今回はここまでです。この状態でビルドするとpassthroughを実装していないのでリンクエラーになります。
次はpassthroughを実装していきます。