🐙

M5StickC Plusからmicro-ROSとArduino Libraryを利用する

2021/09/16に公開

はじめに

本記事では、M5StickC-Plus から micro-ROSM5StickC-Plus Arduino Library を同時に利用する方法を解説します。
(未検証ですが同様の手法で M5Stack Arduino Library の環境構築も可能ではないかと思います。)

ESP32 向けの micro-ROS 開発環境のはセットアップ済みとし、int32_publisher をビルドできる状態になっているとします。セットアップ方法については 前回投稿 を参照してください。

ちなみに、ROS2 と Arduino を橋渡しするライブラリとして ros2arduinomicro_ros_arduino がありますが、前者は Foxy 未対応、後者は ESP32 未対応 のためここでは使用しないものとします。

arduino-esp32 のインストール

micro_ros_setup は ESP32 をターゲットとする場合、内部で ESP-IDF を使用します。ESP-IDF で M5StickC-Plus Arduino Library を利用するにあたって、arduino-esp32 のインストールが必要です。

arduino-esp32 のバージョン周りは注意が必要です。本記事執筆時点で micro_ros_setup の foxy ブランチは ESP-IDF v4.1 を使用しますが、arduino-esp32 は ESP-IDF v3.3 と v4.4 しかサポートしていません。最も近いバージョンとしては、過去に ESP-IDF v4.0 向けのブランチがあったようですが現在は公式のリポジトリからは削除されています。ですが幸運なことに削除される以前のリポジトリをフォークされた方がいらっしゃいますので、そちらを使わせていただきます。(参考 Missing branch #idf-release/v4.0 #4998

Arduino as a ESP-IDF component を参考に arduino-esp32 をインストールします。

$ cd ~/microros_ws/firmware/toolchain/esp-idf/components
$ git clone https://github.com/marcovannoord/arduino-esp32.git arduino
$ cd arduino
$ git checkout idf-release/v4.0
$ git submodule update --init --recursive
$ cd ~/microros_ws
$ ros2 run micro_ros_setup build_firmware.sh menuconfig
$ ros2 run micro_ros_setup build_firmware.sh
  • /home/ubuntu/microros_ws/firmware/toolchain/esp-idf/components/arduino/cores/esp32/esp32-hal-gpio.c:102:24: error: 'rtc_gpio_desc' undeclared (first use in this function); did you mean 'rtc_io_desc'? というエラーが出た場合は、menuconfig の Component Config -> Driver configurations -> RTCIO configuration から RTCIO を有効にする必要があります。(参考 blink example compile error: 'rtc_gpio_desc' undeclared (first use in this function); did you mean 'rtc_io_desc'? (IDFGH-2697) #4768
  • /home/ubuntu/microros_ws/firmware/toolchain/esp-idf/components/arduino/libraries/ESPmDNS/src/ESPmDNS.cpp:177:50: error: cannot convert 'ip4_addr*' to 'esp_ip4_addr_t*' {aka 'esp_ip4_addr*'} というエラーが出た場合は、ESPmDNS.cpp&addr(esp_ip4_addr_t*) &addr に書き換えると通るようになります。(参考 Casting one C structure into another
  • /home/ubuntu/microros_ws/firmware/toolchain/esp-idf/components/arduino/libraries/WiFiClientSecure/src/ssl_client.cpp:151:15: error: 'mbedtls_ssl_conf_psk' was not declared in this scope というエラーが出た場合は、menuconfig の Component config -> mbedTLS -> TLS Key Exchange Methods から Enable pre-shared-key ciphersuites を有効にする必要があります。(参考 Using arduino-esp32 as a component fails on ESP-IDF v4.1 #3457
  • /home/ubuntu/microros_ws/firmware/toolchain/esp-idf/components/arduino/libraries/WiFi/src/WiFiAP.cpp:170:14: error: 'tcpip_adapter_option_id_t' was not declared in this scope というエラーが出た場合、WiFiAP.cpptcpip_adapter_option_id_ttcpip_adapter_dhcp_option_id_t に変更し、tcpip_adapter_option_mode_ttcpip_adapter_dhcp_option_mode_t に変更すると通るようになります。

[100%] Built target app と表示されたらOKです。

M5StickC-Plus Arduino Library のインストール

バージョン周りは特に問題ないようなので、M5StickC-Plus Arduino Library の master ブランチの最新コミット(7828e44)を使用します。

$ cd ~/microros_ws/firmware/toolchain/esp-idf/components
$ git clone https://github.com/m5stack/M5StickC-Plus.git
$ cd ~/microros_ws
$ ros2 run micro_ros_setup build_firmware.sh menuconfig
$ ros2 run micro_ros_setup build_firmware.sh
  • /home/ubuntu/microros_ws/firmware/toolchain/esp-idf/components/M5StickC/src/M5StickC. h:126:2: error: #error “This library only supports boards with ESP32 processor.” というエラーが出た場合、M5StickC-Plus/CMakeLists.txtset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DESP32") を追加します。
  • /home/ubuntu/microros_ws/firmware/toolchain/esp-idf/components/M5StickC-Plus/src/Fonts/glcdfont.c:10:28: error: 'font' defined but not used [-Werror=unused-const-variable=] というエラーが出た場合、M5StickC-Plus/CMakeLists.txtset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-const-variable") を追加します。

[100%] Built target app と表示されたらOKです。

M5 クラスの利用

サンプルアプリの int32_publisher で M5 クラスを利用してみます。

  1. クラスを利用するため micro-ROS アプリのソースを C++ に変更します。
    ~/microros_ws/firmware/freertos_apps/apps/int32_publisher/app.c の拡張子を cpp に変更します。
    加えて、app.cppvoid appMain(void * arg)extern "C" void appMain(void * arg) に変更します。なぜこれが必要かというと、本来であれば appMain() 関数が ~/microros_ws/firmware/freertos_apps/microros_esp32_extensions/main/main.cxTaskCreate() に渡されて micro-ROS タスクが作成されるようになっているためです。xTaskCreate() には C の関数しか指定することができません。このような場合、C++ の関数に extern "C" をつけることで C から呼び出すことができるようになります。(参考 extern“C” 関数へのポインタ

  2. アプリ M5 クラスを追加します。
    app.cpp を開いて、#include "freertos/task.h" の下に #include <M5StickCPlus.h> を追加し、appMain() 関数の中に M5.begin(); を追加します。

  3. ビルドを開始します。

    $ cd ~/microros_ws
    $ ros2 run micro_ros_setup build_firmware.sh menuconfig
    $ ros2 run micro_ros_setup build_firmware.sh
    
    • ここで再び This library only supports boards with ESP32 processor のエラーが出た場合は、~/microros_ws/firmware/freertos_apps//microros_esp32_extensions/CMakeLists.txtset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DESP32") を追加します。
  4. [100%] Built target app が表示されたらOKです。

動作確認

ビルドしたファームウェアを M5StickC Plus に書き込んで動作を確認します。

$ ros2 run micro_ros_setup flash_firmware.sh

書き込んだ後、LCD のバックライトが点灯すれば成功です。

Discussion