带有Simulink和Arduino的金宝app伺服库

14次观​​点(最近30天)
斯特凡施瑞赫赫
斯特凡施瑞赫赫 2019年2月25日
大家好,
首先,我开始用Simulink编程Arduino Uno。金宝app一切都很完美。对于我们的DRS系统,我们希望使用Herkulex Drs 0201伺服电机。它将由RX TX信号控制而不是PWM。因此,有一个描述伺服处理的库。但图书馆用C代码编写。现在我想以某种方式在我的Simulink模型中获取此代码。金宝app你有什么想法如何?
这是图书馆:
IFNDEF. __HERKULEXSERVO_H__
定义 __HERKULEXSERVO_H__
包括 < arduino.h. >
包括 < CircularBuffer.h. >
定义 HERKULEX_BROADCAST_ID 以0 xfe
IFNDEF. HERKULEX_PACKET_RX_TIMEOUT
定义 HERKULEX_PACKET_RX_TIMEOUT One hundred. // 微秒
万一
IFNDEF. HERKULEX_PACKET_RETRIES
定义 HERKULEX_PACKET_RETRIES 6
万一
IFNDEF. HERKULEX_PACKET_RESEND_DELAY
定义 HERKULEX_PACKET_RESEND_DELAY 70 // 微秒
万一
IFNDEF. herkulex_packet_rx_max_data.
定义 herkulex_packet_rx_max_data. 10 // 字节
万一
IFNDEF. HERKULEX_SERIAL_RX_BUFFER
定义 HERKULEX_SERIAL_RX_BUFFER 30. // 字节
万一
IFNDEF. herkulex_max_scheduled_servos.
定义 herkulex_max_scheduled_servos. 10
万一
IFNDEF. herkulex_serial_tx_buffer.
定义 herkulex_serial_tx_buffer. 1 + HERKULEX_MAX_SCHEDULED_SERVOS * 5
万一
如果定义了 HERKULEX_DEBUG
定义 HERKULEX_DEBUG_RX_STATS
万一
枚举 Herkulexcommand.
Eepwrite =. 0x01
EepRead = 0x02
RamWrite = 0x03
RamRead = 0x04
IJog = 0x05
sjog = 0x06
统计= 0x07
回滚= 0x08
重启= 0x09.
};
枚举 Herkulexeepregister.
modelno1 = 0
modelno2 = 1
Version1 = 2
Version2 = 3.
baudrate = 4
id = 6
Ackpolicy = 7
AlarmLedPolicy = 8
torquopolicy = 9
MaxTemperature = 11
MinVoltage = 12
MaxVoltage = 13
AccelerationRatio = 14
maxaccelerationtime =. 15
Deadzone = 16
SaturatorOffset = 17
Sateratorslope = 18
PwmOffset = 20.
minpwm = 21
MaxPwm = 22
OverloadPwmThreshold = 24
minposition =. 26
maxPosition =. 28.
positionkp = 30.
positionkd = 32.
PositionKi = 34.
PositionFF1stGain = 36.
PositionFF2ndGain = 38.
LedBlinkPeriod = 44.
AdcFaultCheckPeriod = 45.
PacketGarbageCheckPeriod = 46.
stopdetectionPeriod = 47.
OverloadProtectionPeriod = 48.
StopThreshold = 49.
InpositionMargin = 50.
CalibrationDifference = 53.
};
枚举 HerkulExramregister.
id = 0
Ackpolicy = 1
AlarmLedPolicy = 2
torquopolicy = 3.
MaxTemperature = 5
MinVoltage = 6
MaxVoltage = 7
AccelerationRatio = 8
maxaccelerationtime =. 9
Deadzone = 10
SaturatorOffset = 11
Sateratorslope = 12
PwmOffset = 14
minpwm = 15
MaxPwm = 16
OverloadPwmThreshold = 18
minposition =. 20.
maxPosition =. 22
positionkp = 24
positionkd = 26
PositionKi = 28.
PositionFF1stGain = 30.
PositionFF2ndGain = 32.
LedBlinkPeriod = 38.
AdcFaultCheckPeriod = 39.
PacketGarbageCheckPeriod = 40
stopdetectionPeriod = 41.
OverloadProtectionPeriod = 42.
StopThreshold = 43.
InpositionMargin = 44.
CalibrationDifference = 47.
statusError =. 48.
StatusDetail = 49.
torquecontrol = 52.
LEDCONTROL = 53.
电压= 54.
温度= 55.
CurrentControlMode = 56.
勾选= 57.
CalibratedPosition = 58.
absoluteposition =. 60.
差异= 62.
Pwm = 64.
absolutegoalposition =. 68.
absolutedesiredtrajpos = 70
DesiredVelocity = 72.
};
枚举 HerkulexLed uint8_t
了= 0x00.
红色= 0x04
绿色= 0x01
蓝色= 0x02
黄色= 0x05
青色= 0x03
紫色的= 0x06
白色= 0x07
忽视= 0 xff
};
定义 enum_flag_operator. T X 排队 T 操作员 X (T lhs, T rhs) { 返回 (t)( static_cast. < uint8_t >(lhs)x static_cast. < uint8_t > (rhs));}
定义 ENUM_FLAG_ASSIGNMENT_OPERATOR T, X, Y 排队 T& 操作员 X (t lh, Const. T&RHS){ 返回 lhs = (lhs Y rhs);}
枚举 HerkulexPacketError uint8_t
没有一个= 0
超时= 0 b00000001
长度= 0 b00000010
命令= 0 b00000100
校验和= 0 b00001000
};
enum_flag_operator. (Herkulexpacketerror,|)
ENUM_FLAG_OPERATOR (HerkulexPacketError &)
ENUM_FLAG_ASSIGNMENT_OPERATOR (HerkulexPacketError | = |)
枚举类HerkulexStatusError: uint8_t {
没有一个= 0
InputVoltage = 0 b00000001
PotLimit = 0 b00000010
TemperatureLimit = 0 b00000100
InvalidPacket = 0 b00001000
超载= 0 b00010000
driverfault = 0B00100000
Eepdistorted = 0 b01000000
保留= 0 b10000000
};
enum_flag_operator. (HerkulexStatusError |)
ENUM_FLAG_OPERATOR (HerkulexStatusError &)
enum_flag_assignment_operator(herkulexstatusError,| =,|)
枚举类HerkulexStatusDetail: uint8_t {
没有一个= 0
移动= 0 b00000001
inposition =. 0 b00000010
ChecksumError = 0 b00000100
UnknownCommand = 0 b00001000
faveredregrange =. 0 b00010000
GarbageTetected =. 0B00100000
Motoron = 0 b01000000
保留= 0 b10000000
};
enum_flag_operator. (HerkulexStatusDetail,|)
enum_flag_operator(herkulexstatusdetail,&)
enum_flag_assignment_operator(herkulexstatusdetail,| =,|)
枚举类Herkulexchedulestate:UINT8_T {
没有一个= 0
个体,
SynchronizedMove
};
结构体 Herkulexpacket.
uint8_t 尺寸;
uint8_t ID;
HerkulexCommand CMD;
uint8_t checksum1;
uint8_t checksum2;
uint8_t 数据(HERKULEX_PACKET_RX_MAX_DATA);
uint8_t status_error;
uint8_t status_detail;
HerkulexPacketError错误;
};
HerkulexServo
HerkulexServobus.
民众:
HerkulexServobus. (流&serial_connection);
无效 sendPacket uint8_t id, HerkulexCommand cmd, Const. uint8_t *数据= nullptr uint8_t data_len = 0 );
赃物 sendPacketAndReadResponse (HerkulexPacket职责, uint8_t id, HerkulexCommand cmd, Const. uint8_t *数据= nullptr uint8_t data_len = 0 );
无效 更新 ();
赃物 getPacket. (HerkulexPacket包);
如果定义了 HERKULEX_DEBUG_RX_STATS
无效 resetRxStatistics ();
无效 printrxstatistics. (流和输出);
万一
无效 prepareIndividualMove ();
无效 准备同步帆 uint8_t 播放时间);
无效 executeMove ();
保护:
流* m_serial;
CircularBuffer < uint8_t ,herkulex_serial_rx_buffer> m_rx_buffer;
无符号 m_last_serial = 0
HerkulexPacket m_rx_packet = {};
赃物 m_rx_packet_ready =.
uint8_t m_tx_buffer [herkulex_serial_tx_buffer];
uint8_t m_move_tags =. 0
Herkulexschedulestates m_schedule_state = herkulexschedulestate :: none;
如果定义了 HERKULEX_DEBUG_RX_STATS
uint16_t m_stats_attempts [herkulex_packet_retries] = {};
uint16_t m_stats_fails =. 0
uint16_t m_stats_totals = 0
万一
无效 processpacket. 赃物 超时);
朋友 HerkulexServo
};
HerkulexServo
民众:
HerkulexServo (Herkulexservobus&Bus, uint8_t ID);
无效 重返者 (HerkulexRamRegister注册, uint8_t val);
无效 writeRam2 (HerkulexRamRegister注册, uint16_t val);
无效 Wreiteep. (Herkulexeepregister reg, uint8_t val);
无效 WRITEEEP2. (Herkulexeepregister reg, uint16_t val);
uint8_t Readram. (Herkulexramregister reg);
uint16_t ReadRam2. (Herkulexramregister reg);
uint8_t readEep (HerkulexEepRegister注册);
uint16_t readEep2 (HerkulexEepRegister注册);
无效 重启 ();
无效 rollbackToFactoryDefaults 赃物 跳过, 赃物 skipBaud);
uint8_t getid. ();
无效 的getStatus (HerkulexStatusError &status_error, HerkulexStatusDetail &status_detail);
uint16_t 格子 ();
uint16_t getrawposition. ();
无效 setLedColor (HerkulexLed颜色);
无效 setTorqueOn ();
无效 settorweyoff. ();
无效 setBrake ();
无效 enutionPositionControlMode. ();
无效 EnableSpeedControlMode. ();
无效 setPosition uint16_t pos机, uint8_t 游戏时间= 0 , HerkulexLed led = HerkulexLed::忽略);
无效 setspeed int16_t 速度, uint8_t 游戏时间= 0 , HerkulexLed led = HerkulexLed::忽略);
保护:
HerkulexServoBus * m_bus;
uint8_t m_id;
Herkulexled M_LED = Herkulexled :: Off;
赃物 m_position_control_mode = 真正的
静态 HerkulexPacket m_response;
静态 uint8_t m_tx_buffer [ 5 ];
无效 慢跑 uint8_t JOG_LSB, uint8_t JOG_MSB, uint8_t 集, uint8_t 播放时间);
};
万一
2的评论
斯特凡施瑞赫赫
斯特凡施瑞赫赫 2019年10月30日
你好,
对不起,没有我们使用Arduino代码。没有S金宝appimulink编程......

登录评论。

答案(2)

Madhu Govindarajan.
Madhu Govindarajan. 2019年2月25日
这个视频有一些相关的项目 https://www.youtube.com/watch?v=qoj8Pa2wi0A 但需要根据你的情况进行调整

Pradeep KS
Pradeep KS 2019年4月10日
按照此链接 //www.tatmou.com/help/金宝appsupportpkg/arduino/device-driver-blocks.html. 为Arduino支持包创建自定义Sim金宝appulink设备驱动程序块。金宝app

下载188bet金宝搏


释放

R2018a

社区宝藏狩猎

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!