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


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

回路に書き込む際は各フォルダー(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 (本仕様では未使用) |
メインループ処理フロー
- 初期化 HAL/CubeMX初期化後、Altair_library_for_CubeIDEを用いてMotorDriver/Encoder/CAN1を初期化し、パラメータ設定モードで起動します。
- パラメータ設定モード CAN ID 0x200, 0x201, 0x202, 0x203 の各パラメータと CAN ID 0x210 のモード設定を受信します。4モータ分のパラメータ設定が完了するまで、制御用目標値は受信しません。
- 制御実行モードへの遷移 4モータ分パラメータ設定完了で APP_MODE_CONTROL へ移行します。移行後はパラメータ設定を受信しません。変更する場合はマイコンの再起動が必要です。
- 制御実行モード 1ms周期でエンコーダ差分から速度/角度を更新し、モード(速度/角度)に応じてPID演算してPWMへ反映します。目標値は CAN ID 0x220 (8B) で受信します。
- ステータス返信 10ms周期で、パラメータ設定/制御実行の状態に関わらず常に CAN ID 0x230 を送信します。
- 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
【使い方】
- スクリプトを実行します。
cd MDD
python3 mdd_gui_ubuntu.py
- 接続: CANのインターフェース(例:
can0)やビットレート(例:1000000)を指定して「接続」します。 - パラメータ設定: 各モータのPIDゲイン、車輪径、回転方向を設定して送信し、「制御実行モード」へ移行します。
- 目標値送信: スライダーや数値入力で目標値(速度/角度)を指定し、定期送信をオンにすることで対象のモータを制御できます。
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設定

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