えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

RPi-Pico+PIOで<Wi-Fi.h>が混入するだけでエラーになる(理不尽な)現象

RaspberryPi Picoというボード、皆さんは使っていますか?

RaspberryPi PicoはRaspberryPi財団が独自に開発したマイコンチップおよびマイコンボードです。

デュアルコアのARM Cortex M0+がベースになっており、他の32bitマイコンと比べてとても低価格なのが魅力です。Linuxはインストールできず、C/C++SDKを叩くかMicroPythonを使用して開発を行うことが多いです。

私は、PlatfomIO(PIO)+Arduinoで使用することが多いです。

pico向けのHAT部品も多く発売されており、コミュニティも活発なようです。


移植中に…

最近、IoT関連のプロジェクトに首を突っ込んでいまして、元々ESP32で動いていたものをRaspberryPi Picoに移植しようとしています。

当然ながらESP32とRaspberryPi-Picoはコアが違うものなのでESP32の部分はif definedなどでコンパイル対象から除外してターゲットを切り替える必要があるのですが、そこで1時間程度詰まってしまったのです。

どうやらframework-arduino-mbed関連の部分で詰まっているようで、そのエラーログを見ながら検索したりしていたのですが、どうもうまく解決できませんでした。

キャッシュを削除してもこの問題は再現してしまい、かなりお手上げ状態でした…


一方で、他のボードが関係しないプロジェクトでプログラムをコンパイルしたところ、エラーが起こらず、正常に動くようになりました。

もう一度エラーログを見たところ、なぜかWiFiパッケージがdependencyに含まれていました。おそらくここらへんで詰まっているのでしょう。

現在使用しているのはEthernet付き・Wi-FiなしのRaspberryPi-Picoだったので、明らかにおかしな依存関係です。

W5100S-EVB-Picowww.switch-science.com

なお、この時点では <WiFi.h> をインクルードする記述はコメントアウトせずに #if definedコンパイル対象から除外するようにしていました。


PIOの仕様?

この <WiFi.h>コメントアウトしたところ、すんなりと通るようになりました。

なんと、コンパイル対象から除外していたとしてもPlatfomIO側?がWiFi.hを読んで依存関係を解決しようとするらしいです。

ちなみに、WiFi.h以外のESP32特有のライブラリはコメントアウトしなくても(lib_depsに含めなければ)依存関係に含まれません。

WiFiの問題はArduinoに標準で入っているからこそ起こっているのでしょう。

これはかなり困りますね…


解決法

platfomio.inilib_ignore = WiFi を追加してWiFiブラックリストに入れるだけで解決します。

# 追記例
lib_ignore =
    WiFi


RaspberryPi Picoへの移植時に元のパッケージに<WiFi.h>が含まれていたら要注意です!