Skip to content

Altair_module_system

使い方

https://github.com/Altairu/Altair_module_system 上記URLより構築済みモジュールコードをダウンロードします.

alt text

alt text

ダウンロードが完了すると中身が以下画像のようなフォルダー構造になります.(2026/4/16現在)

alt text

回路に書き込む際は各フォルダー(MDDやServo)単体でVScodeで開くほうがビルド設定などが楽です.簡単なため初心者にはお勧めです.

MDD

回路名: Altair_MDD_V3

モータドライバードライバモジュール。CAN1でROS2からパラメータ/目標値を受信し、STM32F446でエンコーダフィードバック付きPID制御を実行します。

概要

項目 内容
MCUプロジェクト MDD
対象MCU STM32F446
モータ出力数 4ch
制御モード パラメータ設定モード / 制御実行モード
使用CAN CAN1のみ
状態LED PA5

ピン割り当て

区分 信号 ピン / タイマ
LED STATUS LED PA5
Encoder Encoder1 PA0 / PA1 (TIM5)
Encoder Encoder2 PB6 / PB7 (TIM4)
Encoder Encoder3 PC6 / PC7 (TIM3)
Encoder Encoder4 PB3 / PA15 (TIM2)
Motor Motor1 PB14 (TIM12 CH1), PB15 (TIM12 CH2)
Motor Motor2 PA8 (TIM1 CH1), PA9 (TIM1 CH2)
Motor Motor3 PA6 (TIM13 CH1), PA7 (TIM14 CH1)
Motor Motor4 PB8 (TIM10 CH1), PB9 (TIM11 CH1)
Limit SW SW1 PC0
Limit SW SW2 PC1
Limit SW SW3 PC2
Limit SW SW4 PC3
Serial USART2 TX=PA2, RX=PA3
Serial USART3 TX=PB10, RX=PC5
CAN CAN1 TX=PA12, RX=PA11
CAN CAN2 TX=PB13, RX=PB12 (本仕様では未使用)

メインループ処理フロー

  1. 初期化 HAL/CubeMX初期化後、Altair_library_for_CubeIDEを用いてMotorDriver/Encoder/CAN1を初期化し、パラメータ設定モードで起動します。
  2. パラメータ設定モード CAN ID 0x200, 0x201, 0x202, 0x203 の各パラメータと CAN ID 0x210 のモード設定を受信します。4モータ分のパラメータ設定が完了するまで、制御用目標値は受信しません。
  3. 制御実行モードへの遷移 4モータ分パラメータ設定完了で APP_MODE_CONTROL へ移行します。移行後はパラメータ設定を受信しません。変更する場合はマイコンの再起動が必要です。
  4. 制御実行モード 1ms周期でエンコーダ差分から速度/角度を更新し、モード(速度/角度)に応じてPID演算してPWMへ反映します。目標値は CAN ID 0x220 (8B) で受信します。
  5. ステータス返信 10ms周期で、パラメータ設定/制御実行の状態に関わらず常に CAN ID 0x230 を送信します。
  6. LED制御 パラメータ設定完了後(制御実行モード)にONします。

CAN通信仕様 (すべて CAN1, 1Mbps)

A. パラメータ設定 (ROS2 -> MDD)

CAN ID:

  • Motor1: 0x200
  • Motor2: 0x201
  • Motor3: 0x202
  • Motor4: 0x203

Payload: 8B (little-endian int16)

  • Byte0-1: Pゲイン x100
  • Byte2-3: Iゲイン x100
  • Byte4-5: Dゲイン x100
  • Byte6-7: 車輪径/出力方向

Byte6-7の解釈:

  • 絶対値: 車輪径[mm]
  • 符号: PID出力方向 (正=通常, 負=反転)

例:

  • 0x0064 (100) -> 車輪径 100mm, 通常方向
  • 0xFF9C (-100) -> 車輪径 100mm, 反転方向

CAN ID: 0x210 (モード設定)

Payload: 4B

  • Byte0: M1モード
  • Byte1: M2モード
  • Byte2: M3モード
  • Byte3: M4モード

モード値:

  • 0: 速度制御
  • 1: 角度制御

動作:

  • パラメータ設定完了まで、制御用の目標値は受信しません。
  • パラメータ設定が完了すると LED が点灯し、APP_MODE_CONTROL (1) に移行します。
  • 制御実行モード移行後はパラメータ設定を受信しません。変更する場合はマイコン再起動が必要です。

B. 目標値・モード指令 (ROS2 -> MDD)

制御実行モードでのみ有効です。

CAN ID: 0x220 (目標値)

Payload: 8B (little-endian int16)

  • Byte0-1: M1目標 x10
  • Byte2-3: M2目標 x10
  • Byte4-5: M3目標 x10
  • Byte6-7: M4目標 x10

スケール:

  • 速度モード時: 目標速度[rps] x10
  • 角度モード時: 目標角度[deg] x10

C. ステータス返信 (MDD -> ROS2)

パラメータ設定/制御実行の状態に限らず、常に送信します。

CAN ID: 0x230 (リミットスイッチ + 状態)

Payload: 6B

  • Byte0: Limit SW1
  • Byte1: Limit SW2
  • Byte2: Limit SW3
  • Byte3: Limit SW4
  • Byte4: エラーコード
  • Byte5: システム状態 (0=パラメータ設定, 1=制御実行)

エラーコード

名称 内容
0x00 NORMAL 正常
0x01 INIT_TIMEOUT 初期化タイムアウト (パラメータ受信待ち等)
0x02 CAN_RX_TIMEOUT 一定時間CAN受信なし
0x04 CAN_TX_FAIL フィードバック送信失敗

注記:

  • エラーコードはビットフラグで、同時に複数立つ場合があります。

GUIツール (mdd_gui_ubuntu.py)

Ubuntu等の環境で動作する、CAN通信テスト・制御用のGUIツールです。モータのパラメータ設定、制御コマンドの送信、MDDからのステータス受信が行えます。(socketcan対応)

【依存環境の準備】

# tkinterのインストール (Ubuntuの場合)
sudo apt install python3-tk

# python-canのインストール
pip install python-can

【使い方】

  1. スクリプトを実行します。
cd MDD
python3 mdd_gui_ubuntu.py
  1. 接続: CANのインターフェース(例:can0)やビットレート(例:1000000)を指定して「接続」します。
  2. パラメータ設定: 各モータのPIDゲイン、車輪径、回転方向を設定して送信し、「制御実行モード」へ移行します。
  3. 目標値送信: スライダーや数値入力で目標値(速度/角度)を指定し、定期送信をオンにすることで対象のモータを制御できます。

Servo

回路名: ALTAIR_SERVO_MODULE_V6

サーボモーター用モジュール。ROS2 PC から USB to CAN を介して目標角度を送信し、STM32 が 6ch のサーボ PWM を生成する。

概要

項目 内容
MCUプロジェクト Servo
対象MCU STM32F446
サーボ出力数 6ch
使用CAN CAN1 (受信)
搭載CANポート 2系統
状態LED PA5

サーボ出力ピン

PIN設定 alt text

サーボ ピン タイマ
Servo1 PA6 TIM3 CH1
Servo2 PA7 TIM3 CH2
Servo3 PA8 TIM1 CH1
Servo4 PA9 TIM1 CH2
Servo5 PB8 TIM2 CH1
Servo6 PB9 TIM2 CH2

PWM制御仕様

項目
制御周期 20ms (50Hz)
パルス幅範囲 0.5ms から 2.5ms
目標角度 0 から 180 [deg]
角度-パルス幅変換 pulse_us = 500 + (2000 * angle_deg / 180)

CAN受信仕様 (ROS2 -> MCU)

項目
使用CAN CAN1
CAN ID 100 (標準ID, dec) または 0x100 (hex)
DLC 6

Payload (6B)

  • Byte0: Servo1角度 [0..180]
  • Byte1: Servo2角度 [0..180]
  • Byte2: Servo3角度 [0..180]
  • Byte3: Servo4角度 [0..180]
  • Byte4: Servo5角度 [0..180]
  • Byte5: Servo6角度 [0..180]

注記:

  • Byte値が180を超える場合はMCU側で180にクリップします。
  • 受信ノイズ対策として、各軸にデッドバンド2degを適用します。
  • 同一候補値が3回連続したときのみ目標値へ反映します。

通信時の動作

  • 任意CANフレーム受信時: LED(PA5) をON
  • 200ms 以上CAN無受信時: LED(PA5) をOFF
  • 通信が途切れた場合: 最後に反映済みの目標角度を保持して出力を継続
  • 起動直後: 初期角度(全軸90deg)でPWMを開始

実装メモ (Servo/Core/Src/main.c)

  • Altairライブラリ(can_lib.c)でCAN FIFO0受信割り込みを処理し、安全に取り出し
  • 受信IDが 100(dec) または 0x100(hex)、かつ DLC>=6 のときに角度データとして処理
  • デッドバンド/安定化条件を満たした場合のみ6系統PWM比較値を更新
  • TIM1/TIM2/TIM3を1MHzカウンタ化 (Prescaler=83)、Period=19999で50Hz PWMを生成

GUIツール (servo_gui_ubuntu.py)

Ubuntu等の環境からUSB-to-CANデバイスを経由して、サーボの各軸(1〜6)目標角度(0〜180度)を送信するためのテスト用GUIツールです。

【依存環境の準備】

# tkinterのインストール (Ubuntuの場合)
sudo apt install python3-tk

# python-canのインストール
pip install python-can

【使い方】

  1. スクリプトを実行します。
cd Servo
python3 servo_gui_ubuntu.py
  1. 接続: 使用するインターフェース(例:can0)、ビットレート(例:1000000)を指定し、CAN通信の接続を行います。
  2. 操作: GUI上のスライダーまたはエントリーでサーボ目標角度(0〜180度)を設定します。「定期送信」をオンにすると内部で 10ms 周期で自動的に CAN ID: 0x100 または設定した標準IDとして送信されます。
Note

著者:Shion Noguchi