ラズパイ日記..32日目...esp-idf環境でBME280を読む

esp32のC/C++環境構築継続中です。

倒立ロボットの制御プログラムをmicropythonを作成したものの、動作の遅さで制御しきれませんでした。やはりC/C++環境をと思い立って始めて見たものの、なかなか進みません。

今回は、

ちょっと時間はかかりましたが、今風の開発環境(Visual Studio code,
正確には高機能エディターらしいですが)を使うとだいぶ進展しました。C/C++で書いたプログラムを動かしてBME280センサーから値を取り出します。

esp32のC/C++開発はいろいろと嵌(はま)る

進まないポイントは、以下のような感じです。
  • esspressif社からもサンプル等は提供されているものの、そのままmakeしても途中で止まる
  • 開発環境のesp-idfとgccベースのクロスコンパイラー、使用するライブラリーのバージョンの組み合わせで結構はまる
  • C言語なのでドライバーの書きっぷりがそれぞれでmake時に止まる。原因を探るとif,elseで{}が合致していない等初歩的な事も多い
といった感じです。動いてる環境でpkgされたものがあればいいのですが、先人は少ない感じです。

まずはI2Cで温度湿度センサーを読んでみようと2日ほど費やして、やっとのことでバイナリーを作成。esp32へ書き込みまでOKでようやく動くかなと思ったら。

こんな感じです。「error code:22」って何? 
micropythonならちまちまprint文入れて調べるの簡単なのですが、C/C++環境だと簡単にはいきません。

Win10+debian(WSL版)にて開発環境、USB-serialにてesp32と接続可と環境はできたのですが、中身が進ません。

温度湿度センサーBME280を読み込む

micropythonで書くとちゃちゃっとできたのですが、C/C++だとそうはいきませんでした。いろいろと格闘した結果、C/C++環境でもセンサー値読めるようになりました。
原因は、I2C接続のPin番号の設定、I2Cアドレスの設定が違ってました。

ソースコードの行数をmicropythonと比較すると、以下のとおり20倍の差があります。関数やヘッダーファイルもっとダイエット可能ですが10倍ほどの差があると思われます。
結果出力は同じです。手間は、環境作ったり何度もコンパイルしたりとソースコードの行数差以上にC/C++は手間がかかります。
★micropython
bme280.py
206行
★C/C++
main.c+bme280.c+bme280h
188 + 2,231 + 1,714 =  4,133行

夏休み中は、debian上のemacsでソースコードと格闘してましたが、この定数は何とか結構大変でした。流行りのwin10+VScode(Visual Studio code + PlatformIO)環境に移行すると、関数や予約語のカラー表示、定数定義にマウスポインター持っていくと今入ってる定数値が表示される等すこぶるコードの読みっぷりが改善しました。
ビルド→書き込み→シリアルモニターがそれぞれワンクリックでできるのもいい感じです。
makeして
flashして
flashして書き込み終わると同時にプログラムが動き出します。やっとセンサー値読めました。温度、湿度、気圧それぞれ問題なくそれなりの値で出力されてます。
夏休みで終わらず、時間かかりましたが少し進んだ感じです。

今日のまとめ

やっとのことで、esp32をesp-idf開発環境にてI2C接続された温度湿度センサーの値を読み出すことができました。

0 件のコメント:

コメントを投稿

ラズパイ日記...esp32(arduino)+mpu6050

# esp32で6軸センサー読み出し esp32で6軸センサーを読み出し、値をグラフ表示して動作を確認します。 ## 準備 ハード的な接続は、センサーが3.3V駆動できるので、3.3VとGNDの2線で電源供給します。I2C用にSDAとSCLのデータ線が必要ですが、esp...