STM32F4へmicro-ROSを実装してみる

micro-ROS

micro-ROS puts ROS 2 onto Micro-controllers = マイコン版のROS2と言って良い。これまで高性能SOCボードやPCをターゲットにするしかなかったROSは、一気に組み込みシステムまで広がりそうになる。stm32cubemx_utilsはSTM32CubeMX/IDEプロジェクトにとってmicro-ROSを容易に実装することを目的とするROSパッケージとなる。それでは、STM32CubeIDEプロジェクトでstm32cubemx_utilsを使ってmicro-ROSを、STM32ファミリーのミドル級マイコンSTM32F4に組み込む手順を確かめてみよう。

確認環境

・micro-ROS側 NUCLEO-F446RE(MB1136)、本文のターゲットボードとなる
・ROS2側 ROS2(humble) & STM32CubeIDE 1.12.0インストール済み@UBUNTU 22.04
・接続 micro-ROS側とROS2(humble)側と、通信用シリアルケーブル(UASRT TX/RX TTL-USBコンバータ付)で接続済み、別途NUCLEO-F446REへオンボードデバッガーよりUSB給電&プログラム書き込み

micro_ROS_stm32cubemx_utils_testset
micro_ROS_stm32cubemx_utils_testset

実装手順

以下Dockerインストール→プロジェクト作成→utils入手(humble)→ハードウェア設定→ソース手入れ→agent作成→接続確認の順で説明していく。

Dockerインストール

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce=5:24.0.1-1~ubuntu.22.04~jammy docker-ce-cli=5:24.0.1-1~ubuntu.22.04~jammy containerd.io docker-compose-plugin
sudo groupadd docker
sudo usermod -aG docker $USER
sudo chmod 666 /var/run/docker.sock

stm32プロジェクト作成

STM32CubeIDEでプロジェクトを作成しておく。

stm32cubemx_utilsクローン

上記プロジェクトフォルダの直下にmicro_ros_stm32cubemx_utilsを、Cloneしておく。

git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_stm32cubemx_utils

STM32CubeIDE設定

ピン、転送などハードウェアに関わる設定や、FreeRTOS、コンパイラ、リンカーに関わる設定については、参考資料2のいうとおりに設定しておく。コンパイルやリンクエラーの要因になる、とくに「絶対パス」の記述はミスないよう注意する。

コード生成&手入れ&ビルド&ラン

micro_ros_stm32cubemx_utils/sample_main.cと、main.cと比較して、その差分をmain.cに追加する。
ビルドの際にワーニングがいくつか出たが、前向きにOKにしておく。

micro_ros_setupビルド

source /opt/ros/$ROS_DISTRO/setup.bash
mkdir ~/uros_ws && cd uros_ws
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup
rosdep update && rosdep install --from-paths src --ignore-src -y
colcon build
source install/local_setup.bash

micro_ros_agentビルド

source ~/uros_ws/install/local_setup.sh
ros2 run micro_ros_setup create_agent_ws.sh
ros2 run micro_ros_setup build_agent.sh
source install/local_setup.sh

接続確認

source ~/uros_ws/install/local_setup.sh
ls -l /dev/ttyUSB*
sudo chmod 1666 /dev/ttyUSB0
ros2 run micro_ros_agent micro_ros_agent serial -b 115200 --dev /dev/ttyUSB0
ros2 topic list
ros2 echo /cubemx_publisher

蛇足:USBポートのデバイス名は、TTL-USBコンバータはFTDI/CP(Silicon Labs)/CH(Qinheng Microelectronics)製TTL-USB IC使用の場合、/dev/ttyUSB*となり、マイコン内蔵USBコントローラ使用、つまりCDC/HIDなどのバーチャルCOMポートの場合、/dev/ttyACM*となる。

以下のような結果が出てれば、micro-ROS@STM32F446REからのメッセージは届いたら確認完了とする。

micro_ROS_stm32_test_result
micro_ROS_stm32_test_result

プロジェクト

STM32プロジェクトはgithub.com/soarbear(ROBOSHO)に預かっておく。

参考資料

1・https://micro.ros.org
2・https://github.com/micro-ROS/micro_ros_setup
3・https://github.com/micro-ROS/micro_ros_stm32cubemx_utils

あとがき

micro-ROSは、設計要件次第、クロック周波数100〜200MHzのSTM32F4、STM32G4にも有用&可用であることが分かった。Docker、Micro XRCE-DDSは、ROS2とは少し違和感が感じさせられて、これからドンドン進化していくと思われる。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

SWO/SWV with STM32CubeIDE

はじめに

SWV/SWV(Serial Wire Output/Serial Wire Output Viewer)は、デバッグの際にSTM32CubeIDEのコンソールにデータを表示することでいざとプロセスやデータを確認したいときに大変便利なツールである。

確認環境

・NUCLEO-F446RE(MB1136)
・STM32CubeIDE 1.12.0 @UBUNTU 22.04

確認手順

1・NUCLEO-F446RE CN2などのジャンパー接続は、以下写真のとおりとなっている。

NUCLEO-F446RE-JUMPER
NUCLEO-F446RE-JUMPER

2・SYS/Mode/Debug/Trace Asynchronous SWにするとSWOピンが設定される。

stm32cubeide_ioc
stm32cubeide_ioc

3・Generate Codeして、main.cへコードを追加する。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

/* USER CODE BEGIN 0 */
int __io_putchar(uint8_t ch) {
	return ITM_SendChar(ch);
}
/* USER CODE END 0 */

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	printf("Hello, SWO/SWV\r\n");
	HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

4・Debug実行する。

stm32cubeide_start_debug
stm32cubeide_start_debug

5・Debugger ConfigurationにSWVをEnableにする。

stm32cubeide_debug_cofigutration
stm32cubeide_debug_cofigutration

6・SWV ITM Data Consoleを表示させる。

stm32cubeide_open_tm_data_console
stm32cubeide_open_tm_data_console

7・SWV設定を行う。

stm32cubeide_config_trace
stm32cubeide_config_trace

stm32cubeide_swv_setting
stm32cubeide_swv_setting

8・Start Traceをプッシュして、押し込んだ状態にする。

stm32cubeide_start_trace
stm32cubeide_start_trace

9・Debugを再開させる。

stm32cubeode_f8_resume
stm32cubeode_f8_resume

10・SWV ITM Data Consoleでprintfの内容を確認する。

stm32cubeide_data_view
stm32cubeide_data_view

プロジェクト

STM32CubeIDEプロジェクトは、github.com/soarbear(ROBOSHO)に預かっておく。

参考資料

・「UM2609 User manual STM32CubeIDE user guide」、STMicroelectronics

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

FPGAでUARTシリアル受信機

Under construction, coming soon…

概要

状態マシン

Verilogソースコード

FPGAボード&EDA

論理合成&端子割当&配置配線

プログラムダウンロード

結果確認

参考資料

あとがき

1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

STM32G4 FD-CAN in Normal Mode

はじめに

車載ネットワークの主流バスとしてCAN(Controller Area Network)とFD-CAN(FDCAN/CANFD/CAN-FD/CAN with Flexible Data rate)、IEEE11898で規格化されているCANの通信速度は最大で1Mbpsであり,同じくCAN FDでは最大5Mbps(ただし,IEEEの規格上では最大2Mbps)となっている。とはいえ、8MbpsはFD-CANの通信速度としても可能だという。今後CANはFD-CANに置き換えられると予想される。STM32ファミリーには、STM32G0、STM32G4、STM32H7、STM32L5、STM32MP1シリーズはFD-CANコントローラ内蔵で、別途FD-CANトランシーバだけを用意すると良い。今回はSTM32G474とMicrochip製FD-CANトランシーバのMCP2562FDを使ってFD-CANの送受信を確かめていこう。

テスト環境

・IDE環境 STM32CubeIDE 1.12.0 @UBUNTU 22.04(iMACの画面は大きく、スクリーンショットの字は小さく写るため予めご容赦ください)
・マイコン/評価ボード STM32G474(FD-CAN1&FD-CAN2) / NUCLEO-G474RE(MB1367C) x 1pcs
・FD-CANトランシーバ MCP2562FD x 2pcs
・差動線FD-CAN_H、FD-CAN_Lを跨ぐ抵抗器  120R x 2pcs
・デカップリング用コンデンサ  0.1uF x 4pcs
・差動波形観察 オシロスコープ

確認内容

・FD-CAN1、FD-CAN2と往復ピンポン送受信確立
・差動信号の波形、データスループット=2Mbps

配線関連

FD-CAN周辺の回路図は以下のとおり掲載しておく。

stm32g474-mcp2562fd-fdcan-schematic
stm32g474-mcp2562fd-fdcan-schematic

実の配線済みテストセットの写真を以下のとおり掲載しておく。

stm32g4-fdcan-test-connection
stm32g4-fdcan-test-connection

マイコン設定

STM32CubeIDEのioc/Pinout & Configuration/Sys Mode and Configuration、Pinout View、ioc/Clock Configrationを以下のとおり掲載しておく。

stm32g4-fdcan-ioc
stm32g4-fdcan-ioc

stm32g4-fdcan-clock
stm32g4-fdcan-clock

FD-CAN設定

FD-CAN関連パラメータの値は、唯一ではなくスループットとサンプリングポイントの兼ね合いを見ながら、STM32CubeIDEが受け入れるまで調整していく。実に使用したパラメータは、以下のとおり掲載しておく。パラメータの計算また調整は、KVASER(オンライン計算サイト)を利用すると便利になる。ただし、Frequency=FD-CANクロック周波数、上図から抽出して、Tolerance=FD-CANクロック周波数公差、本文ではHSIによる値でSTM32G474のデータシートから抽出して、Node Delay= FD-CANトランシーバ遅延(厳密ではない)、本文ではMCP2562FDのデータシートから予め抽出しておく。

stm32g474-fdcan-parameters
stm32g474-fdcan-parameters

決まったパラメータの値は、以下のとおり入力しておく。Nominal Field、Data Fieldに関わるパラメータは別々、FD-CAN2とFD-CAN1のパラメータは同じなので、コピペして良い。

stm32g4-fdcan-parameter
stm32g4-fdcan-parameter

stm32g4-fdcan-fdcan1-interrupt
stm32g4-fdcan-fdcan1-interrupt

リポジトリ

STM32プロジェクトはリポジトリとして、github.com/soarbear/stm32g4-fdcanに公開済み。

送受信データ

FD-CAN2においてFD-CAN1から送信した32バイトデータを受信して、それらのデータに1を足して、FD-CAN1に返す。FD-CAN1においてFD-CAN2から送信した32バイトデータを受信して、それらのデータに1を足して、FD-CAN1に返す。このようにやり取りを繰り返す。受信したデータは以下のとおり掲載しておく。NUCLEOにST-LINKデバッガはオンボードなので、別途ST-LINKデバッガ、シリアルケーブル使わなくても、SWV ITM ConsoleつまりSTM32CubeIDEコンソールにデータを表示させることにした。それに伴ってSWV/SWOの設定は必要になる。SWV/SWOの設定については、本サイトの関連記事「SWO/SWV with STM32CubeIDE」をご参考にしてください。

stm32g4-fdcan-normalMode-rxData
stm32g4-fdcan-normalMode-rxData

差動波形

FD-CAN_H、FD-CAN_Lの差動波形は以下のとおり掲載しておく。

stm32g474-fdcan-wave
stm32g474-fdcan-wave

データビットタイムは0.5usと確認できたので、データフィールドのスループットは2Mbpsと推定される。また、残件事項として他のパラメータAuto Retransmission、Transmit Pauseはとりあえず、Disableにしておいたので、他の機会で動作確認することにする。

参考資料

・「車載ネットワーク入門」、インターフェース2021年12月号
・「NUCLEO-G4 User Manual」、ST Electronics
・「MCP2561/2FD フレキシブル データレート対応高速 CAN トランシーバ」、MICROCHIP
・「Datasheet – STM32G474xB STM32G474xC STM32G474xE」、ST Electronics

あとがき

FD-CAN規格のパラメータは多く、開発に当たって決して短時間で決められるものではない、設計要件に合わせて実験を重ねて確認していく必要がある。

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

ROS2の自動cmakeツールament_cmake_auto

はじめに

ament_cmake_autoは、package.xmlに記載してあるパッケージを探してくれる自動cmakeツールなので、CmakeLists.txtはシンプルに書けるようになる。

find_package

ament_cmake_autoは必要なので、これのみをfind_packageしておく。

find_package(ament_cmake_auto REQUIRED)

依存を見つける=ament_auto_find_build_dependencies

package.xmlに記載してあるdependenciesを、すべてfind_packageしてくれる。

ament_auto_find_build_dependencies()

ライブラリの生成=ament_auto_add_library

add_library、target_include_directories、target_link_libraries、ament_target_dependenciesをまとめてくれる。
マルチライブラリーのの場合、ライブラリーずつリストするのみで済む。

ament_auto_add_library(lite_serial src/lite_serial.cpp include/lite_serial.hpp)

実行ファイルの生成=ament_auto_add_executable

add_executable、target_include_directories、target_link_libraries、ament_target_dependenciesをまとめてくれる。
マルチノードの場合、ノードずつリストするのみで済む。

ament_auto_add_executable(haya_imu_node src/haya_imu_node.cpp)
ament_auto_add_executable(haya_topic_echo src/haya_topic_echo.cpp)
ament_auto_add_executable(haya_topic_hz src/haya_topic_hz.cpp)

msg/srvの生成=ament_auto_generate_code

メッセージも、サービスも以下1行で済む。

ament_auto_generate_code()

ライブラリーのビルド=ament_auto_package

1行のみでexport、install関係をまとめて仕上げてくれる。

ament_auto_package()

構文のチェック=ament_lint_auto

BUILD_TESTINGデフォルト=ON、colon build – -BUILD_TESTING=OFFに指定可能。

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

テストを行う=ament_auto_add_gtest

冒頭の使用例にテストは入っていないが、ament_auto_add_gtestでテストできるようにしている。

ament_auto_find_test_dependencies()
ament_auto_add_gtest()

ament_cmake_autoの使用例

筆者はament_cmake_autoを自社開発したROS2パッケージhaya_imu_ros2に取り組んだので、CmakeLists.txtは以下のとおりとなる。

# CmakeLists.txt of haya_imu_ros2
cmake_minimum_required(VERSION 3.8)
project(haya_imu_ros2)
find_package(ament_cmake_auto REQUIRED)
ament_auto_find_build_dependencies()
ament_auto_add_library(lite_serial src/lite_serial.cpp include/lite_serial.hpp)
ament_auto_add_executable(haya_imu_node src/haya_imu_node.cpp)
ament_auto_add_executable(haya_topic_echo src/haya_topic_echo.cpp)
ament_auto_add_executable(haya_topic_hz src/haya_topic_hz.cpp)
if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()
install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME})
ament_auto_package()

リポジトリ

https://github.com/soarbear/haya_imu_ros2 に公開済み(BSD 3-Clause License)

参考資料

https://github.com/ament/ament_cmake
Ament-CMake-Documentation(humble)

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア