えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

STM32F7Discovery上でmicroros-arduinoを動かす

STM32F7Discovery上でmicro-ros-arduinoを動作させてみました。


STM32 + ROS2

STM32マイコンはArm®Cortex®‑Mをベースとしたマイコンシリーズで、高性能・安価・低消費電力なMCUとして教育用途から産業用途まで広く用いられています。

STMマイコンはチップ単体だけでなく、Arduinoシールドを用いてボードの拡張が可能な「Nucleo」や高性能なSTM32の機能を手軽に体験できるDiscoveryシリーズなどもあり、マイコンを手軽に扱えるラインナップも魅力的です。


一方で、(Arduinoシールドが多く用意されているのにもかかわらず)STM32マイコンといえばSTM32CubeIDEかMbedで開発されることがほとんどで、開発ではあまりArduinoを使用することは無いような気がします。

ROS2 + MCU のライブラリであるmicro-ROSでもSTM32CubeMX仕様のライブラリが用意されています。

github.com


Arduinoの方ではmicro-ROSのリファレンスボードであるSTM32-E407で動作することを確認されているそうです。(しかもEthernet!)

github.com

ライブラリにおいて「手軽に扱える」ことはとても大切なことなので、ダメ元でビルドしてみることにしました。


STM32F7Discovery

手元に積んでいたSTM32F7Discoveryがあったので、これを使用します。

os.mbed.com

このボードは5年くらい前に買ってから、少しは触ったもののあまり活用できず積んでいたものです…5年の歳月を経てようやく活躍の時が来たようです。

STM32F7Discoveryは、タッチパネルやカメラコネクタ、オーディオ端子などが揃っており、ボード単体でモバイル機器を作成できるくらいの高スペックなマイコン開発用ボードとなっています。

値段は8000円程度です。


各種ファイルの調整

以下の環境を使用してmicro-ros-arduinoを構成しています。


platformio.ini

ポイントになるのは、-L ./.pio/libdeps/disco_f746ng/micro_ros_arduino/src/cortex-m4/です。micro-ros-arduinoでは、コンパイル済みのライブラリをリポジトリ内に入れてそこからリンクさせています。

え?STM32F7Discoveryに載っているMCUってCortex®-M7なのでは…

(なぜか互換性があり、そのまま動いてしまいました)

[env:disco_f746ng]
platform = ststm32
board = disco_f746ng
framework = arduino

monitor_speed = 115200
upload_speed = 115200

lib_deps =
;; microros ---------------------------------------------------------------
    https://github.com/micro-ROS/micro_ros_arduino.git
    stm32duino/STM32Ethernet@^1.3.0
    stm32duino/STM32duino LwIP@^2.1.2

build_flags =
    -L ./.pio/libdeps/disco_f746ng/micro_ros_arduino/src/cortex-m4/
    -l microros

ターゲットの流用

micro_ros_arduinoライブラリ内のmicro_ros_arduino.hnative_ethernet_transport.cppの1行目に#define TARGET_STM32F4申し訳なく思いながら追記します。

現在のライブラリではサポートされていない体になっているので仕方ありません。


micro-ros_publisher_ethernet.inoをmain.cppにコピー

#include <Arduino.h>を忘れずに!

timer_callbackはありますが、どう見てもloopからしかpublishされておらず、timerが動いていません。

SubscriberとTimerについては、分かり次第ここに追記していこうと思います。

追記(07/12):Timer・Subscriberどちらも正しく動作しました。(同時実行も可能でした)


接続

Agent起動のオプションはESP32を無線でmicro-rosに接続するのと何ら変わりませんでした。

ここまでで STM32F7Discovery + micro-ros の説明は以上です。

いろいろ設定してビルドしないと動かないと思いきやほとんど設定を変えずにビルドできてしまったので驚きです。


mROSもSTM32F7Discoveryをサポートしているそうで…

STM32 + ROS2といえば高瀬先生の「mROS2」も忘れてはいけませんね…!

STM32F7Discoveryでも動作確認ができているらしく、Agent不要なシステムを組みたいのであればそちらを使用してみてもいいかもしれません。

github.com

mROS 2|デザイン/サポート|STM32, STM8ファミリはSTの32bit/8bit汎用マイクロコントローラ製品