NUCLEO-F302R8 wifi ESP32 開発環境

NUCLEO-F302R8でwifi通信することが目標です。

NUCLEO-F302R8にwifiの機能はありません。ESP32-WROOM-32-DevKitCをUARTで繋ぎ、wifi機能を使用して通信をします。

前回、ESP32にUARTでATコマンドを送信できるところまで確認しました。

前回: ATコマンド

続いてWIFIの通信を試してみたのですが、やりたいことができなかったです。

■やりたかったこと

WIFIのパケットだけ送信したい。TCP/IPのパケットはFreeRTOSのTCPモジュールで作る。

ATコマンドのリファレンスを見ていると、WIFIパススルーモードがあった。これで行けそう。

https://docs.espressif.com/projects/esp-at/en/latest/esp32/index_of_abbreviations.html#term-Passthrough-Mode

■試した結果

パススルーモードに遷移するコマンドを送信するとエラーになった。リファレンスをよく見ると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

ESP32

ESP32-IDFのセットアップ

以下の記事を見てください。

https://dev.classmethod.jp/articles/a-little-careful-explanation-of-installing-the-esp32-development-environment-esp-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コンポーネントの作成

公式に以下のような自作コンポーネント作成に関する記載があります。

https://github.com/espressif/esp-idf/tree/master/components/esp_netif_stack#configure-esp-netif-for-building-without-lwip

この手順に沿ってesp_netif_passthroughという自作ESP-NETIFを作成します。

コンポーネントのオーバーライド

IDFではESP-NETIFのような機能のまとまりをコンポーネントと言います。前述したlwip、loopbackもESP-NETIFというコンポーネントに含まれます。

コンポーネントはオーバーライドすることができます。IDFにあるコンポーネントをプロジェクトフォルダにコピーして変更すると、プロジェクトにあるコンポーネントがビルドされます。

https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/build-system.html#multiple-components-with-the-same-name

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になります。

menuconfig

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を実装していきます。

以上