M5StickC Plusからmicro-ROSとArduino Libraryを利用する
はじめに
本記事では、M5StickC-Plus から micro-ROS と M5StickC-Plus Arduino Library を同時に利用する方法を解説します。
(未検証ですが同様の手法で M5Stack Arduino Library の環境構築も可能ではないかと思います。)
ESP32 向けの micro-ROS 開発環境のはセットアップ済みとし、int32_publisher
をビルドできる状態になっているとします。セットアップ方法については 前回投稿 を参照してください。
ちなみに、ROS2 と Arduino を橋渡しするライブラリとして ros2arduino と micro_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.cpp
のtcpip_adapter_option_id_t
をtcpip_adapter_dhcp_option_id_t
に変更し、tcpip_adapter_option_mode_t
をtcpip_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.txt
にset(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.txt
にset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-const-variable")
を追加します。
[100%] Built target app
と表示されたらOKです。
M5 クラスの利用
サンプルアプリの int32_publisher
で M5 クラスを利用してみます。
-
クラスを利用するため micro-ROS アプリのソースを C++ に変更します。
~/microros_ws/firmware/freertos_apps/apps/int32_publisher/app.c
の拡張子をcpp
に変更します。
加えて、app.cpp
のvoid appMain(void * arg)
をextern "C" void appMain(void * arg)
に変更します。なぜこれが必要かというと、本来であればappMain()
関数が~/microros_ws/firmware/freertos_apps/microros_esp32_extensions/main/main.c
のxTaskCreate()
に渡されて micro-ROS タスクが作成されるようになっているためです。xTaskCreate()
には C の関数しか指定することができません。このような場合、C++ の関数にextern "C"
をつけることで C から呼び出すことができるようになります。(参考 extern“C” 関数へのポインタ) -
アプリ M5 クラスを追加します。
app.cpp
を開いて、#include "freertos/task.h"
の下に#include <M5StickCPlus.h>
を追加し、appMain()
関数の中にM5.begin();
を追加します。 -
ビルドを開始します。
$ 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.txt
にset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DESP32")
を追加します。
- ここで再び
-
[100%] Built target app
が表示されたらOKです。
動作確認
ビルドしたファームウェアを M5StickC Plus に書き込んで動作を確認します。
$ ros2 run micro_ros_setup flash_firmware.sh
書き込んだ後、LCD のバックライトが点灯すれば成功です。
Discussion