2018年12月1日土曜日

ESP-IDFでESP32を開発するときにハマったこといろいろ

2021-01-04追記: 古い記事です。ESP-IDF v4系はだいぶ変わっています。

さて、エスプリのESP32がM5Stackの登場もありMaker界隈で大人気ですね
メーカーが作っているというArduino Coreもあり、お手軽に始めることはできるのですが、Arduino Coreを使うとメモリが足りなくなったり、細かいことをいじろうとすると
IDFの関数を直叩きしたりするので、じゃあ最初からIDFで作ろうよということで、
基本のSDKとして配布されている、ESP-IDFをぼちぼち使っていくことにしました。

正直まだ全然よくわかっていないのですが、とりあえず導入から。
自分が使っているマシンが基本Windows 10なので、Windowsに直に導入してもいいのですが、Windows Subsystem for LinuxにUbuntuがいるので、そこから使おうということで、
WSLから、↑のUbuntuの手順で導入しました。

導入したらとりあえずビルド。
サンプルを読んでもどこで何をしてるかさっぱりだったので一行ずつコメントつけたLチカのデモをgithubにおいておきました。

git clone して、プロジェクトルートでmake menuconfigコマンドを入れると、コンパイルの設定や、コード内で#define CONFIG_VALUE とかやってる設定を簡単に変えられるやーつが出ます。


書き込み設定は、Serial flasher Configで変更できます。
WSLでWindowsのCOMポートを使いたいときは、例えばWindowsでCOM5として認識してる場合は、"/dev/ttyS5"とかやるとそのまま使えます。
Flash sizeは使ってるモジュールに合わせて変更します。
あとおすすめは、Default baud rateを921600くらいに上げたほうがいいと思います。
どうでもいいことしかやってなくても結構ファームのサイズが大きくアップロードに時間がかかりますが、ここで書き込みスピードを上げるとArduino UNOなんかを使うときと遜色ないくらいの速さにできます。

設定が終わったらSave→Exitで終了。ここで作ったコンフィグはプロジェクトルートのsdkconfigに書かれています。


ビルドはmake allでできます。

そしてとりあえず書き込みしたいということで、
make flashすると書き込めます。esptool.pyを呼んで作ったビルドしたファイルを書き込んでくれるのですね。
書き込み時、RSTとIO0を、シリアルポートのRTS/CTSピンで自動的に切り替えて書き込みモードにしてくれてます。当然ESP32、USB-UARTが乗ってるボードにその仕組みがないとできません。うまく書き込まれないときはIO0をLOWにし続けながら、一旦リセットを掛けると手動で同じ状態にできます。

いろいろ作っていくと、Arduinoみたいにライブラリをもらってきて入れて使いたいですね。
そんなときは、プロジェクトルートに”components”ディレクトリを作ってそこへ入れるもののようです。
というわけで、
mkdir components
cd components
で、そこに入れたいコンポーネントをクローンしたりする。
仮にtestcmpntとかいう名前だとしますが
とりあえずその中身を見るとだいたいこんな感じだと思います
$ ls testcmpnt/
component.mk  include  testcmpnt.c  

この中身のcomponent.mkを見ると、こんな感じになっていると思います。
COMPONENT_ADD_INCLUDEDIRS = /include/.
COMPONENT_SRCDIRS := .

これが、SRCDIRSがtestcmpntのルート、INCLUDEDIRSが/include
も見てねって指示のようです。
これがちゃんと書いてあるとmake allしたときに一緒にコンパイルしてくれます
たまにcomponentを借りて持ってくるとこの中身が空だったりして、メインファイルでインクルードしたヘッダーファイルが見つからないよとエラーになったりします。
ここでプチハマりしました。ここに何も書いてなければ知らんがなってことなのですね
プロジェクトルート/mainに全部入れるといろいろ入れたときにゴチャゴチャしてしまいますし、わかってしまえば便利ですね。

とりあえずまだまだ使いこなしてないので一旦ここまでです。
なにか間違えてたら教えてください。

ほかにもぼちぼちわかったことやハマったことがあったら追記していきたいと思います