ロボマスモーターは CAN 通信経由で制御できるモーターです。
電流値を指定することで動作し、またエンコーダーを搭載しているため、回転数や回転角を取得できます。
個別インクルード
概要
以下の表に示すように、使用するドライバによってクラスが異なります。また指定できる電流範囲も異なります。
使用される CAN ID は 0x200
, 0x1FF
, 0x200+モーターID
です。ドライバは 1ms 間隔で CAN フレームを送信するため、ドライバが接続されている CAN バスには、他の CAN デバイスを接続しないことをお勧めします。
電流値の指定
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:212
指定可能な電流の範囲は CurrentMin
CurrentMax
メンバ定数より取得できます。フィードバック制御の制御値を制限する場合などに有用です。
const int16_t currentMin = motor.CurrentMin;
const int16_t currentMax = motor.CurrentMax;
static constexpr int16_t CurrentMin
指定可能電流最小値
Definition RoboMasterMotor.hpp:221
static constexpr int16_t CurrentMax
指定可能電流最大値
Definition RoboMasterMotor.hpp:224
センサー値取得
回転角度、回転速度、トルク電流、モーター温度を取得可能です。位置制御や速度制御をする場合、フィードバック制御と組み合わせて使用してください。
ドライバは駆動電源で動作するため、駆動電源が切れるとドライバに保存されているエンコーダー角が消去される点に注意してください。
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();
}
複数モーターの場合
モーター ID ごとにオブジェクトを生成することで、1 つの CAN バスに対して最大 8 つまでモーターを接続可能です。
モーター ID はドライバについている SET ボタンを押した後、加えて ID 番号回ボタンを押すことで設定できます。モーター ID は緑に点滅する LED の点滅回数で確認できます。
RoboMasterC610クラス
Definition RoboMasterMotor.hpp:185
複数 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 targetSpeed = 5000;
const double sendCurrent = pid(motor.getVelocity(), targetSpeed, motor.CurrentMin, motor.CurrentMax);
motor.setCurrent(sendCurrent);
loopCtrl.update();
}
PID制御器
Definition PidController.hpp:19
スケッチ例 (速度制御クラスの作成例)
実用的な例として、ロボマスモーターの速度をフィードバック制御するクラスを作成します。複数のモーターを制御する場合、クラスを作成することでコードの見通しを良くすることができます。
#pragma once
class MotorSpeedFeedback
{
public:
: motor{
std::move(motor) }
{
}
void move(const double rpm)
{
}
void stop()
{
}
};
int16_t getVelocity() const
モーターの速度を取得
Definition RoboMasterMotor.hpp:80
void clearPower() noexcept
操作量のクリア
Definition PidController.hpp:124
void setCurrent(int16_t current)
モーターの電流を設定
Definition RoboMasterMotor.hpp:228
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();
}