1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RMD-X8をM5 Stackで動かす(4)

Posted at

前回までで,基本的な使い方は全て確認しました.
今回は,クラスを使ってRMD-X8を簡単に制御する方法を確認しましょう.

RMD-X8_M5クラス

https://github.com/bump5236/RMDx8Arduino
をもとに,M5 Stack用に改良したクラスがRMD-X8_M5クラスです.
RMD-X8を制御するために必要なメンバ変数と,メソッドが便利な形で用意されています.

メンバ

名前 説明
posKp uint8_t 位置制御のPゲイン
posKi uint8_t 位置制御のIゲイン
velKp uint8_t 速度制御のPゲイン
velKi uint8_t 速度制御のIゲイン
curKp uint8_t 電流制御のPゲイン
curKi uint8_t 電流制御のIゲイン
MOTOR_ADDRESS uint16_t モーターのアドレス
tempreture int8_t 読み取ったモーターの温度を保持しておく
present_current int16_t 読み取った現在の電流値を保持しておく
present_velocity int16_t 読み取った現在の速度を保持しておく
present_pos int64_t 読み取った現在の位置を保持しておく
present_angle int32_t 読み取った現在の角度を保持しておく

メソッド

名前
canSetup CANの接続を確立する.Setup()内で使用
readPosition() 現在の位置を取得
writeCurrent(int16_t current) 電流値を指定し,電流制御
writePosition(int32_t position) 位置を指定し,位置制御
stop() モーターのトルクをOFFにする

他にも使用頻度の低いものが用意されています.必要に応じてRMDX8_M5.hRMDX8_M5.cppを読んでみましょう.

RMD-X8クラスを使用する準備

https://github.com/t-kamimura/RMDx8_m5stackRMD-X8_M5フォルダがあります.これをdocuments/Arduino/Librariesフォルダにコピーしましょう.

RMD-X8クラスを用いたプログラム

サンプルプログラムはRMD_torsionSpringTestです.モーターの電流制御によって,回転バネのように振る舞わせるプログラムです.
詳細を見ていきましょう.

# include <RMDX8_M5.h>

RMDX8_M5クラスをインクルードして使えるようにします.

RMDX8_M5 myMotor(CAN0, MOTOR_ADDRESS);

CANとモーターのアドレスを指定し,RMD-X8_M5クラスからmyMotorインスタンスを生成します.
クラスインスタンスの関係については,「MATLAB講習 オブジェクト指向のみ」のビデオ https://youtu.be/G4RlJvAidy8 を参照してください.

myMotor.readPosition();
initial_pos = myMotor.present_angle;

Setup()内では,readPositionメソッドを利用してモーターが動き始める前の位置を取得しています.これは開始位置をバネの釣り合い位置とするために行います.
開始位置を目標位置とすることで,プログラムの開始時に大きなトルクが加えられることなく,安全に実験を行うことができます.

// read multi turn angle
previous_pos = myMotor.present_angle;
myMotor.readPosition();
delay(1);

present_vel = (myMotor.present_angle - previous_pos)*1000/LOOPTIME;
int32_t target_cur = - KP*(myMotor.present_angle - initial_pos) - KD * present_vel;

myMotor.writeCurrent(target_cur);
delay(1);

loop()内では,現在の位置と速度を計算し,そこからPD制御によって電流の指令値target_curを決定しています.これは前回と同じです.
電流の指令値が決定したら,writeCurrentメソッドで電流指令を行います.

// finishing
myMotor.writePosition(0);
delay(2000);
// stop command
myMotor.stop();
delay(500);
SERIAL.println("Program finish!");

終了処理として,モーター位置をゼロに戻し,stopメソッドを使用してモーターのトルクを切ります.

まとめ

以上で,RMD-X8をM5 Stackで使用するためのチュートリアルは終了です.
クラスを使いこなせば様々なプログラムが簡単に作れますので,いろいろ試してみましょう.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?