シリアルサーボ、回転モードで使うのはけっこう簡単で
間欠回転運動も簡単にできることはできた。 けど、、、
ちょっと困った。
角度、絶対位置が読めない。。。
止まってる時は、
Position = st3032.ReadPos(1); で返ってくる値が常にゼロ... !?
試しに
脱力モードにして手で回してみてもPosition値が変わらない!
最初はなんかプログラム間違えたかな?と思って、
PC用のモニタソフトで動かしてみてもやっぱりそうだった・・・
モニタソフトでの確認
■標準のサーボモード・・・指令値で動く場合
スライダの指令値を動かすとGoal値が変化し、サーボが動き、
Positionが現在角を示していて追従していく感じ。
#STS3032 #シリアルサーボ 標準モードでは
— しん (@shinichi_nin) 2022年10月9日
もちろん、Positionは回転動作に応じて変化する...
指令値Goalに対してPositionが追従する感じ止まった時も当然その角度位置が示されてる。#FEETECH #FT_SCServoDebug pic.twitter.com/x740JUml4u
■標準のサーボモード・・・脱力して外部から動かされた場合
そんな時はPositionは現在値、Goal値も全く同じ値で遅れなし。
でもってReadPos( )関数でちゃんと現在位置は読める。
#STS3032 #シリアルサーボ 標準モードでの使い方なら脱力状態にして、外部から回されてもPositionは角度に応じて当たり前に変化する。
— しん (@shinichi_nin) 2022年10月9日
この時、指令値Goalの方も遅れることなくピッタリ同じ値になってる。
ここまでは何もおかしくなくていいんだけど・・・https://t.co/6PFhS8zaih pic.twitter.com/Quj4WiPBp3
■回転モードにして・・・ 制御で動かしてる場合は、、、
position値は現在角ではなくなってしまう。。。
Position値は指令回転角の残量角分のデータに変わる。
Goal値には現在角が表示されてる。。。けど、
ReadPos( )関数で読めるのはPosition値なので、初期位置を基準にしての、、、
自分で動かした分を演算で積算していって現在値を知ることはできる。
動画は約90度分(1000)の回転を繰り返してる。
Position値は動き出すたびに1000から減算されてる値。
止まるとほぼゼロ・・・
ReadPos( )関数でPosition値を読むと止まるとデータはいつもゼロ。。。
なもんで、演算で自分で動かした分を積算していけば、、、
この場合なら現在値は一応わかる。
#STS3032 #シリアルサーボ #回転モード で動かすとpositionの意味は変わっちゃって角度の値ではなくなってしまう。。。
— しん (@shinichi_nin) 2022年10月9日
指定した角度量に対しての残角度分が表示されるようになる。 Goal値の方は指令値じゃなくて絶対角が表示されるようになる。 でもGoal値はどう読む?https://t.co/6PFhS8i7gh pic.twitter.com/OEBKdzuy6B
■回転モードにして・・・ 外部から動かされちゃうと、、、
脱力してフリーにしたら軽く回るようになる。
ここで外部から回されちゃう場合がまずい。
Position値はゼロで変わらない。。。
当然演算でも角度を算出できないので、もう現在値はわからんくなる。
#STS3032 #シリアルサーボ #回転モード で困るのが回転角度が読めないこと。サーボ自身で動いてる時はは初期位置からの演算で現在位置がわかる。
— しん (@shinichi_nin) 2022年10月9日
脱力して外部から回されるとPositionは0のままなんで、もう角度はわからん。
Goal値に角度が出てるけどこれが読めない...https://t.co/6PFhS8i7gh pic.twitter.com/JSEqHcIEAp
これは困る。。。。
希望はGoal値の読み取り。 ここには絶対角度がいつも出てる。
でもどうやったら読めるのかがわからん。
マイコンでEEPROMの書き換えで標準モードに一旦戻して、、、
そしたらPosition値にはGoal値の現在角が入りそうなので
Position値読んで、 またすぐ 回転モードに戻せばできそうだけど
なぜかうまくいかない。。。。
EEPROMの書き換えだとRAM読みと違ってすぐじゃあかんかなと
思ったんで0.5秒くらい待って読むようにしてもダメだった。。。
どうしたもんか。。。これはいかん。
KRS3204ではそんなことはなかった。
精度がよくはないけどいつでも角度は読めた。
何もしない時は、力が必要ない時は脱力モードにしとかないと
止まってるとこで保持してるとそこそこ保持するブレーキ的な
動作してるので電流を流してる。。。でサーボが熱くなっていく・・・
バッテリー残量が減っていくしていく・・・
そう言えば、KRS3204ではそれが顕著だった。
動かさずに止めてて、脱力してなかったらいつの間にかサーボが
けっこう暖かくなってた。設定でそれなりに変えれるのかとは思うけど標準で。
でもって、しばらく放置でいざ動かそうとしたら動かない・・・
あれ?って調べたらバッテリーもいつの間にかなくなってた。
あーなんかスイッチングしてるよなって感じ。
その辺がSTS3032はよくできてるのか脱力しなくても温度はほとんど上がらない。
でもって音もしない。 当然、バッテリーも減ってかない。
保持してるんだよね・・・って手で回そうとしてみるとちゃんと動かない♪
素敵な制御。 もちろん手で回そうとし続けると踏ん張ってそこそこ電流
流すので熱くなっていくけど。
なのでSTS3032の場合は脱力しなくても力を加えなければサーボ熱くならないし
バッテリーも減らないので脱力しない使い方でいけるなら
回転させた量はわかってるので絶対位置も演算で
なんとかなりそうではあるけど...
Goal値、なんか読み取れる関数はないのかな。。。って探してるところ。
PCモニタソフトでは読めてるからどっかにありそうなもんだけど。。。
■関数定義
class SMS_STS : public SCSerial
{
public:
SMS_STS();
SMS_STS(u8 End);
SMS_STS(u8 End, u8 Level);
virtual int WritePosEx(u8 ID, s16 Position, u16 Speed, u8 ACC = 0);//普通写单个舵机位置指令
virtual int RegWritePosEx(u8 ID, s16 Position, u16 Speed, u8 ACC = 0);//异步写单个舵机位置指令(RegWriteAction生效)
virtual void SyncWritePosEx(u8 ID, u8 IDN, s16 Position, u16 Speed, u8 ACC);//同步写多个舵机位置指令
virtual int WheelMode(u8 ID);//恒速模式
virtual int WriteSpe(u8 ID, s16 Speed, u8 ACC = 0);//恒速模式控制指令
virtual int EnableTorque(u8 ID, u8 Enable);//扭力控制指令
virtual int unLockEprom(u8 ID);//eprom解锁
virtual int LockEprom(u8 ID);//eprom加锁
virtual int CalibrationOfs(u8 ID);//中位校准
virtual int FeedBack(int ID);//反馈舵机信息
virtual int ReadPos(int ID);//读位置
virtual int ReadSpeed(int ID);//读速度
virtual int ReadLoad(int ID);//读输出至电机的电压百分比(0~1000)
virtual int ReadVoltage(int ID);//读电压
virtual int ReadTemper(int ID);//读温度
virtual int ReadMove(int ID);//读移动状态
virtual int ReadCurrent(int ID);//读电流
private:
u8 Mem[SMS_STS_PRESENT_CURRENT_H-SMS_STS_PRESENT_POSITION_L+1];
};
■メモリのアドレス登録はヘッダーファイル見るとこんだけある。
//-------EPROM(只读)--------
#define SMS_STS_MODEL_L 3
#define SMS_STS_MODEL_H 4
//-------EPROM(读写)--------
#define SMS_STS_ID 5
#define SMS_STS_BAUD_RATE 6
#define SMS_STS_MIN_ANGLE_LIMIT_L 9
#define SMS_STS_MIN_ANGLE_LIMIT_H 10
#define SMS_STS_MAX_ANGLE_LIMIT_L 11
#define SMS_STS_MAX_ANGLE_LIMIT_H 12
#define SMS_STS_CW_DEAD 26
#define SMS_STS_CCW_DEAD 27
#define SMS_STS_OFS_L 31
#define SMS_STS_OFS_H 32
#define SMS_STS_MODE 33
//-------SRAM(读写)--------
#define SMS_STS_TORQUE_ENABLE 40
#define SMS_STS_ACC 41
#define SMS_STS_GOAL_POSITION_L 42
#define SMS_STS_GOAL_POSITION_H 43
#define SMS_STS_GOAL_TIME_L 44
#define SMS_STS_GOAL_TIME_H 45
#define SMS_STS_GOAL_SPEED_L 46
#define SMS_STS_GOAL_SPEED_H 47
#define SMS_STS_TORQUE_LIMIT_L 48
#define SMS_STS_TORQUE_LIMIT_H 49
#define SMS_STS_LOCK 55
//-------SRAM(只读)--------
#define SMS_STS_PRESENT_POSITION_L 56
#define SMS_STS_PRESENT_POSITION_H 57
#define SMS_STS_PRESENT_SPEED_L 58
#define SMS_STS_PRESENT_SPEED_H 59
#define SMS_STS_PRESENT_LOAD_L 60
#define SMS_STS_PRESENT_LOAD_H 61
#define SMS_STS_PRESENT_VOLTAGE 62
#define SMS_STS_PRESENT_TEMPERATURE 63
#define SMS_STS_MOVING 66
#define SMS_STS_PRESENT_CURRENT_L 69
#define SMS_STS_PRESENT_CURRENT_H 70