ロボマスモーターは CAN 通信経由で制御できるモーターです。
電流値を指定することで動作し、エンコーダーを搭載しているため回転数や回転角を取得できます。
個別インクルード
概要
以下の表に示すように、使用するドライバによってクラスが異なります。また指定できる電流範囲も異なります。
使用される CAN ID は 0x200
, 0x1FF
, 0x200+モーターID
です。ドライバは 1ms 間隔で CAN フレームを送信するため、ドライバが接続されている CAN バスには、他の CAN デバイスを接続しないことをお勧めします。
電流値の指定
モーター1つに対して1つの Udon::RoboMasterCxxx
インスタンスを作成し、setCurrent
で電流値を指定することで動作します。電流範囲は先ほどの表のとおりです。範囲外の値を指定した場合、範囲内の値にクリッピングされます。
void setup()
{
}
void loop()
{
motor.setCurrent(5000);
}
Teensy用 CANバスクラス
Definition CanBusTeensy.hpp:31
void update()
バス更新
Definition CanBusTeensy.hpp:89
void begin()
通信開始
Definition CanBusTeensy.hpp:37
RoboMasterC620クラス
Definition RoboMasterMotor.hpp:210
指定可能な電流の範囲は getCurrentRange
メンバ関数より取得できます。フィードバック制御の制御値を制限する場合などに有用です。
int16_t min = currentRange.
min;
int16_t max = currentRange.
max;
範囲を表す型
Definition Range.hpp:8
MinT min
最小値
Definition Range.hpp:9
MaxT max
最大値
Definition Range.hpp:10
センサー値取得
回転角度、回転速度、トルク電流、モーター温度を取得可能です。位置制御や速度制御をする場合、フィードバック制御と組み合わせて使用してください。
- 覚え書き
ドライバは駆動電源で動作するため、駆動電源が切れるとドライバに保存されているエンコーダー角が消去される点に注意してください。
void loop()
{
const double angle = motor.getAngle();
const double rawAngle = motor.getRawAngle();
const int16_t rpm = motor.getVelocity();
const int16_t torqueCurrent = motor.getTorqueCurrent();
const uint8_t temp = motor.getTemperature();
}
ロボマスモーターから直接得られる回転角度は一周ごとに 0 になります。そこで getAngle
関数は過去の回転角を累積し、現在の角度を求めます。そのため駆動電源が切れた場合、この関数が返す回転角は無効な値となります(累積値が消去されないため)。
getRawAngle
関数は、ロボマスモーターから直接得た回転角度を取得する関数です。一周ごとに 0 に戻ります。
複数のモーターを制御
1 つの CAN バスに対して最大 8 つまでモーターを接続可能です。
モーター ID はドライバについている SET ボタンを押した後、ID 番号回ボタンを押すことで設定できます。モーター ID は緑に点滅する LED の点滅回数で確認できます。
RoboMasterC610クラス
Definition RoboMasterMotor.hpp:183
複数 CAN バスの場合
複数の CAN バスを使用する場合、CAN バスクラスのオブジェクトを複数作成し、それぞれのモーターに対して対応する CAN バスを指定してください。
例えば Teensy の場合次のようになります。詳細
Raspberry Pi Pico での使用例
CAN バスクラスに Udon::CanBusSpi
を使用してください。詳細
Raspberry Pi Pico用バスクラス
Definition CanBusSpiPico.hpp:24
スケッチ例 (電流制御)
void setup()
{
}
void loop()
{
motor.setCurrent(10000);
}
スケッチ例 (速度フィードバック制御)
static Udon::LoopCycleController loopCtrl{ 1000 };
void setup()
{
}
void loop()
{
const double targetVelocity = 5000;
const double current = pid(motor.getVelocity(), targetVelocity);
motor.setCurrent(current);
loopCtrl.update();
}
PID制御器
Definition PidController.hpp:20
スケッチ例 (速度制御クラスの作成例)
実用的な例として、ロボマスモーターの速度をフィードバック制御するクラスを作成します。複数のモーターを制御する場合、クラスを作成することでコードの見通しを良くすることができます。
#pragma once
class MotorSpeedFeedback
{
public:
: motor{
std::move(motor) }
{
}
void move(const double targetVelocity)
{
const auto current = pid(motor.
getVelocity(), targetVelocity);
}
void stop()
{
}
};
void clearPower() noexcept
操作量のクリア
Definition PidController.hpp:143
int16_t getVelocity() const
モーターの速度を取得
Definition RoboMasterMotor.hpp:82
void setCurrent(int16_t current) override
モーターの電流を設定
Definition RoboMasterMotor.hpp:226
Definition Typedef.hpp:94
#include "MotorSpeedFeedback.hpp"
static Udon::LoopCycleController loopCtrl{ 1000 };
static MotorSpeedFeedback motor1 {
};
static MotorSpeedFeedback motor2 {
};
static MotorSpeedFeedback motor3 {
};
void setup()
{
}
void loop()
{
motor1.move(5000);
motor2.move(5000);
motor3.move(5000);
loopCtrl.update();
}