WASP株式会社

おごちゃんです。

最近いろんなことがあって、Raspberry Piを本格的に作業環境として使ってみようと思っています。Raspberry Piも4くらいになると、普段のLinux環境としては十分な感じになって来ましたからね。かつてのように「Node.jsをコンパイルするのに1日以上かかる」なんてこともありませんし(ZeroでNode.jsをコンパイルするとそうなります)。

「いろんなこと」ややっていることの詳細はまたいずれ書くとして、今日はその一環でESP32の開発環境であるESP-IDFをRaspberry Piの上で使う方法について書きます。

64bit Raspberry PiとESP-IDFとの相性の悪さ

ESP-IDFはWIndows上やIA上のLinuxであれば、特に難しいことはなく、インストール手順に従えば使えるようになります。ところが、最近のRaspberry Piは64bit化されているため、うまくtoolchainのインストールが出来ません。それは、Espressif公式のtoolchainバイナリの中に「Linux arm64」のサポートが欠落しているためです。

また、以前のESP-IDF(Ver 3以前?)では、結構人手を介する部分があったため、こういったことは部分的に手作業を入れてやれば何とかなっていたのですが、最近はかなり自動化されてしまって、何か小細工をしようと思うと、スクリプトのかなり深いところまで読むハメになります。そういったわけで、ちょっといじって何とかするにはハードルが高くなってしまいました。

そこであれこれいじった結果、これで決定版かなという感じの手順が構築できたので、書いておきます。なお、以下の手順はUbuntuの上での話です。まぁ他のものでも大差はないと思いますが。

toolchainのインストール

ここで大事なポイントは、「Linux ARM32(armel)とLinux ARM64とバイナリ互換性がある」ということです。つまり、armelのtoolchainバイナリさえ手に入れて適当に配置すれば、toolchainの問題は解決するということです。

そこで、まずはarmelのtoolchainを手に入れます。

armelのtoolchainの場所は、Espressifの「ESP-IDF Programming Guide」の中の「Downloadable Tools」の場所にあります。

List of IDF Toolsにある「Linux-armel」にあるのがそれです。これをダウンロードして、適当なところに展開します。

$ cd ~/ESP32
$ wget https://github.com/espressif/crosstool-NG/releases/download/esp-2021r1/xtensa-esp32-elf-gcc8_4_0-esp-2021r1-linux-amd64.tar.gz
$ tar xf xtensa-esp32-elf-gcc8_4_0-esp-2021r1-linux-amd64.tar.gz

これで ~/ESP32  xtensa-esp32-elf にtoolchainが展開されます。実際にtoolchainがある場所は、 ~/ESP32/xtensa-esp32-elf/bin となります(後のPATHの設定に使います)。

ESP-IDFのインストール

次にESP-IDFをインストールしません。

「しません」と言っても全くないと何もできないわけで、まずはダウンロードします。ここでは、toolchainと同じようにダウンロードします。

$ cd ~/ESP32
$ git clone --recursive https://github.com/espressif/esp-idf.git

通常ですと、この後に $ cd esp-idf; ./install.sh としてインストールするわけですが、このインストールスクリプトの中でプラットフォームがチェックされ、その結果「linux-arm64のバイナリなんてないよ」と怒られて終わってしまいます。

とは言え、もう既に肝心のtoolchainはインストール済みですし、ESP-IDFは*.aや*.laを作って使うのではなくて、「ターゲットをbuildする時に.oを作る」という動きをするようになっているので、するべきことは終わっています。

では次に何をするかと言えば、何もありません。ただ、このままでは動くかどうかもよくわかりませんし、必要ないくつかの環境変数を一々手で設定することになって面倒臭いので、以下のことを行います。

  1.  Pythonの設定
  2. 各種環境変数を設定するスクリプトを作る
  3. Pythonのライブラリの設定と確認

Pythonの設定

まずPythonの設定ですが、ESP-IDFのツール郡が要求するPythonはVer 3系です。ところが、いまだに油断しているとVer 2系のPythonがデフォルトのpythonになってしまっているので、これを何とかします。これには、

$  sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1

のようにしてやります。これでpythonというコマンドを入れれば、Ver 3系のPythonが起動されるようになります。

環境変数を設定するスクリプトを作る

次に各種環境変数を設定するスクリプトを作ります。

ドキュメントやインストールスクリプトとか諸々見ていると、古いESP-IDFと比較して面倒臭い感じがするのですが、実のところ全く変わったところはありません。設定するべき環境変数は、「IDF_PATH」と「PATH」だけです。あと、Pythonの入れ方によっては、「PYTHONPATH」の設定が必要かも知れません(私は必要でした)。具体的には、

$ cat esp32
export PYTHONPATH=/usr/local/lib/python3.9/dist-packages
export IDF_PATH=~/ESP32/esp-idf
export PATH=~/ESP32/esp-idf/tools:~/ESP32/xtensa-esp32-elf/bin:$PATH

のような感じのものを作ります。ESP32の開発に入りたい時には、

$ . ./esp32 

のようにすれば環境変数が設定されます。

Pythonのライブラリの設定と確認

最後にライブラリの設定と動作確認を行います。

適当なESP32のプロジェクトの下で、

$ idf.py build

のようにして idf.py を起動してみて下さい。なければ、ESP-IDFの中にあるサンプルででもやってみると良いでしょう。

ここで必要なライブラリがないようだとエラーで怒られますから、エラーがなくなるまでpipでコツコツ入れてやります。問題がなくなれば、buildが通るようになると思います。

以上のようにすれば、おそらく最小限の手間で64bit版Rapberry Pi上でのESP-IDFの環境が構築できると思います。