// ----------------------------------------------------------------------------- // Copyright (c) 2024 Mu Shibo // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // ----------------------------------------------------------------------------- //飞特STS3032舵机同步控制指令 #include "Servo_STS3032.h" #include //飞特串行舵机通信层协议程序 SCS::SCS() { Level = 1;//除广播指令所有指令返回应答 Error = 0; } SCS::SCS(u8 End) { Level = 1; this->End = End; Error = 0; } SCS::SCS(u8 End, u8 Level) { this->Level = Level; this->End = End; Error = 0; } //1个16位数拆分为2个8位数 //DataL为低位,DataH为高位 void SCS::Host2SCS(u8 *DataL, u8* DataH, u16 Data) { if(End){ *DataL = (Data>>8); *DataH = (Data&0xff); }else{ *DataH = (Data>>8); *DataL = (Data&0xff); } } //同步写指令 //舵机ID[]数组,IDN数组长度,MemAddr内存表地址,写入数据,写入长度 void SCS::syncWrite(u8 ID[], u8 IDN, u8 MemAddr, u8 *nDat, u8 nLen) { rFlushSCS(); u8 mesLen = ((nLen+1)*IDN+4); u8 Sum = 0; u8 bBuf[7]; bBuf[0] = 0xff; bBuf[1] = 0xff; bBuf[2] = 0xfe; bBuf[3] = mesLen; bBuf[4] = INST_SYNC_WRITE; bBuf[5] = MemAddr; bBuf[6] = nLen; writeSCS(bBuf, 7); Sum = 0xfe + mesLen + INST_SYNC_WRITE + MemAddr + nLen; u8 i, j; for(i=0; iwrite(nDat, nLen); } int SCSerial::writeSCS(unsigned char bDat) { return pSerial->write(&bDat, 1); } void SCSerial::rFlushSCS() { while(pSerial->read()!=-1); } void SCSerial::wFlushSCS() { } //飞特SMS_STS系列串行舵机应用层程序 void SMS_STS::SyncWritePosEx(u8 ID[], u8 IDN, s16 Position[], u16 Speed[], u8 ACC[]) { u8 offbuf[7*IDN]; for(u8 i = 0; i