Arduino IDE ESP32ボードのバージョンアップに伴うTimerCameraライブラリの変更内容

スポンサーリンク
M5Cameraの使い方

Arduino IDEの環境を再確認していたところ、ESP32用の「ボードマネージャURL」が変更されていることに気付きました。
以前のURLは「https://dl.espressif.com/dl/package_esp32_index.json」でしたが、これが「https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json」に変更されていました。

上記のとおりURLを変更したところ、ESP32用ボードが「1.0.6」から「2.0.1」にアップデートされました。

また、ESP32用ボードのバージョン毎のリリース日を確認したところ、以下のとおりでした。

バージョンリリース日
2.0.109 Nov 2021
2.0.031 Aug 2021
1.0.626 Mar 2021

数ヶ月間にわたり、最新ではないバージョンを使っていたことになります。

さて、ESP32用ボードを「1.0.6」から「2.0.1」にアップデートしたところ、「1.0.6」では問題なく動いていたTimerCamera用スケッチにて、コンパイルエラーが発生するようになってしまいました。
TimerCamera用のライブラリが、最新版のESP32用ボードに対応できていないようです。

とりあえず、色々と調べてコンパイルエラーを回避しましたので、その内容をまとめておきます。


ESP32用ボードのバージョンを「2.0.1」にアップデートした手順は、以下のとおりです。

  • 「Arduino」>「Preferences…」の「追加のボードマネージャのURL:」で、ESP32用ボードのURLを「https://dl.espressif.com/dl/package_esp32_index.json」から「https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json」に変更。
  • 「ツール」>「ボード:」>「ボードマネージャ…」で「esp32 by Espressif Systems」を「2.0.1」にアップデート。
  • 「ツール」>「ライブラリを管理…」で「Timer-CAM by Eeebin バージョン0.0.2」をインストール。
  • 「ツール」>「ボード:」で「ESP32 Arduino」>『M5Stack-Timer-CAM」を選択。

この状態で、ESP32用ボードが「1.0.6」の時には問題なく動いていたスケッチをコンパイルすると、以下のエラーが発生しました。

/Users/family/Documents/Arduino/libraries/Timer-CAM/src/app_httpd.cpp:22:10: fatal error: fd_forward.h: No such file or directory
 #include "fd_forward.h"
          ^~~~~~~~~~~~~~
compilation terminated.

ESP32用ボードから「fd_forward.h」「fr_forward.h」が削除されたため、エラーが発生するようになったようです(参考記事は こちら)。
「src/app_httpd.cpp」は、TimerCameraをWebサーバにするときに使うライブラリですが、今回のスケッチには不要なのでファイルそのものを削除しました。

上記を対処した後、再度スケッチをコンパイルすると、今度は以下のエラーが発生しました。

/Users/family/Documents/Arduino/libraries/Timer-CAM/src/battery.c: In function 'bat_init':
/Users/family/Documents/Arduino/libraries/Timer-CAM/src/battery.c:10:25: error: 'ADC1_GPIO38_CHANNEL' undeclared (first use in this function); did you mean 'ADC1_CHANNEL_7'?
 #define BAT_ADC_CHANNEL ADC1_GPIO38_CHANNEL
                         ^~~~~~~~~~~~~~~~~~~

ESP32ボード内の「driver/adc.h」から「#include “soc/adc_channel.h”」という記述がなくなったのが原因のようです(参考記事は こちら)。
「src/battery.c」内の「#define BAT_ADC_CHANNEL ADC1_GPIO38_CHANNEL」という記述を「#define BAT_ADC_CHANNEL ADC1_CHANNEL_2」に変更しました。

上記を対処したところ、エラーは発生せずコンパイルできるようになりました。
ところが、コンパイルはできたものの、デバイス起動時に、シリアルモニタに以下のようなエラーが表示されるようになりました。

E (1277) i2c: i2c_param_config(662): i2c clock choice is invalid, please check flag and frequency
E (1278) err: esp_err_t = 258, line = 18
E (2279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (2279) err: esp_err_t = 263, line = 30
E (3279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (3279) err: esp_err_t = 263, line = 30
E (4279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (4279) err: esp_err_t = 263, line = 30
E (5279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (5279) err: esp_err_t = 263, line = 53
E (6279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (6279) err: esp_err_t = 263, line = 30
E (7279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (7279) err: esp_err_t = 263, line = 30
E (8279) i2c: i2c_set_pin(860): scl and sda gpio numbers are the same
E (8279) err: esp_err_t = 263, line = 30

ESP32ボード内の「driver/i2c.h」にて、「i2c_config_t」に「clk_flags」が追加されたのが原因のようです(参考記事は こちら)。
「src/bmm8563.c」内の「i2c_init()」に「conf.clk_flags = 0;」という記述を追加しました。

void i2c_init() {
    i2c_config_t conf;
    conf.mode = I2C_MODE_MASTER;
    conf.sda_io_num = (gpio_num_t)12;
    conf.scl_io_num = (gpio_num_t)14;
    conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
    conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
    conf.master.clk_speed = 100000;
    conf.clk_flags = 0;
    ESP_ERROR_CHECK(i2c_param_config(I2C_NUM, &conf));
    ESP_ERROR_CHECK(i2c_driver_install(I2C_NUM, I2C_MODE_MASTER, 0, 0, 0));
}

これでようやく、TimerCameraが問題なく動くようになりました。

ESP32用ボードを「1.0.6」から「2.0.1」にアップデートしたことに伴い、「Timer-CAM」ライブラリのうち、「src/app_httpd.cpp」「src/battery.c」「src/bmm8563.c」の3ファイルを編集しなければなりませんでした。
将来的にはライブラリが更新されることとは思いますが、結構煩雑な作業でした。
今回は「Timer-CAM」ライブラリについて対処しましたが、他のライブラリについても同様な作業が発生する可能性もあります。

もしかしたら、開発環境を常に最新化するよりも、使い慣れた古いバージョンを使い続ける方がいいのかもしれません。

 

なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。