舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。系统的控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为2.0ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。从而实现对舵机的位置(角度)控制。由于这些特性,舵机在机器人和航模的制作当中获得了非常广泛的应用,市场上有各种不同型号的产品来供用户选择。下面选择市场上比较常见的几款舵机进行一些简单的评测。
性能参数: 表格给出了这几款舵机的型号和基本参数 :
博创的CDS55xx系列舵机的参数:
应用范围: 其中Hitec出品的HS422是目前Hitec用量最大的标准舵机。它重新定义了一个舵机的质量标准。从重量,转矩以及噪音来看,都是目前市场上最具性价比的舵机。对于机器人用途,HS422适用于云台,机械手末端用电机。 DF15MG微伺服舵机是DFRobot专为多自由度机械臂开发的一款金属齿大扭矩双轴承舵机。其15公斤的大扭矩略显暴力,完全能胜任小型机械臂的各个关节扭力的需要,并具有控制精度高、响应速度快等优点,除了适合用于机械臂,还能用于监控云台、双足机器人、多足机器人等场合。而DF05BB虽然较DF15MG的扭矩小了一点,但是依然能够胜任云台、机械臂、双足机器人等应用方面的工作。 MG90由于扭矩比较小,质量低,主要用于450级别的电动直升机, 3D飞行,小型固定翼飞机,微型机器人等方面。 CDS55xx系列舵机控制精度可到达0.35°,响应时间很快,只有2ms。在舵机比较多的情况下,只要通过串行控制总线就可以把他们很方便的连接在一起,而传统的舵机每个单元就需要在控制板上面有一个接口,这方面CDS55xx系列舵机体现出很大的优越性。一般在机械臂或者轮式机器人的动力驱动方面应用较多。 实际测试: 由于博创的CDS55xx系列使用的不是RS-485通信协议,所以分两批进行测试。 下面给出的是通过Arduino控制板来控制除CDS5500和5516外的四路舵机,使其在各自定义的角度内摆动一个周期。
Arduino控制四路舵机 源代码如下:
- <font color="rgb(85, 85, 85)">#include <Servo.h>
- Servo DF15MG;
- Servo DF05BB;
- Servo HS422;
- Servo MG90;
- void ready() //初始化舵机到10°的位置
- {
- DF15MG.write(10);
- DF05BB.write(10);
- HS422.write(10);
- MG90.write(10);
- }
- void setup()
- {
- DF15MG.attach(3);
- DF05BB.attach(5);
- HS422.attach(6);
- MG90.attach(9);
- Serial.begin(19200);
- ready(); //初始化
- Serial.println("Ready");
- void loop()
- {
- int i;
- int pos=0; //存储位置(角度)参数
- if (Serial.available()>0)
- {
- i=Serial.read(); //读取串口数据
- if( i=='1') //输入’1’,DF15MG在120°范围内摆动一个周期
- {
- for(pos=0;pos<120;pos+=1)
- { DF15MG.write(pos);
- delay(20);}
- for(pos=120;pos>=1;pos-=1)
- { DF15MG.write(pos);
- delay(20);}
- }
- if( i=='2') //输入’2’,DF05BB舵机在100°范围内摆动一个周期
- {
- for(pos=0;pos<100;pos+=1)
- { DF05BB.write(pos);
- delay(20);}
- for(pos=100;pos>=1;pos-=1)
- { DF05BB.write(pos);
- delay(20);}
- }
- if( i=='3') //输入’3’,HS422在150°范围内摆动一个周期
- {
- for(pos=0;pos<150;pos+=1)
- { HS422.write(pos);
- delay(20);}
- for(pos=150;pos>=1;pos-=1)
- { HS422.write(pos);
- delay(20);}
- }
- if( i=='4') //输入’4’,MG90在90°范围内摆动一个周期
- {
- for(pos=0;pos<90;pos+=1)
- { MG90.write(pos);
- delay(20);}
- for(pos=90;pos>=1;pos-=1)
- { MG90.write(pos);
- delay(20);}
- }
- }
- }</font>
复制代码
CDS5500和CDS5516测试: 由于博创的CDS55xx系列舵机使用了Dynamixel通信协议,而Arduino板子使用的是RS485通信协议,所以需要一个转接口来实现他们之间的信号的传输。 测试程序的作用是让两款舵机以一个随机的速度在随机的两个位置之间运动:
红色部分为Dynamixel和RS485通信协议之间的转接口
CDS5516不同加速度情况下的位置相应曲线(X轴=时间,Y轴=位置)
- #define startByte 0xFF
- #define ID 0xFE //广播对所有的舵机发送指令,测试的两个单元同时运动
- //内存控制表
- #define P_MODEL_NUMBER_L 0
- #define P_MODEL_NUMBER_H 1
- #define P_VERSION 2
- #define P_ID 3
- #define P_BAUD_RATE 4
- #define P_RETURN_DELAY_TIME 5
- #define P_CW_ANGLE_LIMIT_L 6
- #define P_CW_ANGLE_LIMIT_H 7
- #define P_CCW_ANGLE_LIMIT_L 8
- #define P_CCW_ANGLE_LIMIT_H 9
- #define P_SYSTEM_DATA2 10
- #define P_LIMIT_TEMPERATURE 11
- #define P_DOWN_LIMIT_VOLTAGE 12
- #define P_UP_LIMIT_VOLTAGE 13
- #define P_MAX_TORQUE_L 14
- #define P_MAX_TORQUE_H 15
- #define P_RETURN_LEVEL 16
- #define P_ALARM_LED 17
- #define P_ALARM_SHUTDOWN 18
- #define P_OPERATING_MODE 19
- #define P_DOWN_CALIBRATION_L 20
- #define P_DOWN_CALIBRATION_H 21
- #define P_UP_CALIBRATION_L 22
- #define P_UP_CALIBRATION_H 23
- #define P_TORQUE_ENABLE (24)
- #define P_LED (25)
- #define P_CW_COMPLIANCE_MARGIN (26)
- #define P_CCW_COMPLIANCE_MARGIN (27)
- #define P_CW_COMPLIANCE_SLOPE (28)
- #define P_CCW_COMPLIANCE_SLOPE (29)
- #define P_GOAL_POSITION_L (30)
- #define P_GOAL_POSITION_H (31)
- #define P_GOAL_SPEED_L (32)
- #define P_GOAL_SPEED_H (33)
- #define P_TORQUE_LIMIT_L (34)
- #define P_TORQUE_LIMIT_H (35)
- #define P_PRESENT_POSITION_L (36)
- #define P_PRESENT_POSITION_H (37)
- #define P_PRESENT_SPEED_L (38)
- #define P_PRESENT_SPEED_H (39)
- #define P_PRESENT_LOAD_L (40)
- #define P_PRESENT_LOAD_H (41)
- #define P_PRESENT_VOLTAGE (42)
- #define P_PRESENT_TEMPERATURE (43)
- #define P_REGISTERED_INSTRUCTION (44)
- #define P_PAUSE_TIME (45)
- #define P_MOVING (46)
- #define P_LOCK (47)
- #define P_PUNCH_L (48)
- #define P_PUNCH_H (49)
- //指令
- #define INST_PING 0x01
- #define INST_READ 0x02
- #define INST_WRITE 0x03
- #define INST_REG_WRITE 0x04
- #define INST_ACTION 0x05
- #define INST_RESET 0x06
- #define INST_DIGITAL_RESET 0x07
- #define INST_SYSTEM_READ 0x0C
- #define INST_SYSTEM_WRITE 0x0D
- #define INST_SYNC_WRITE 0x83
- #define INST_SYNC_REG_WRITE 0x84
- void setup()
- {
- Serial.begin(1000000); //设置串口波特率为1000000
- void loop()
- {
- //随机的位置和速度
- int pos = random(255);
- int pos2 = random(3);
- int vel = random(255);
- int vel2 = random(3);
- int messageLength = 5+2;
- Serial.print(startByte, BYTE); // send some data
- Serial.print(startByte, BYTE);
- Serial.print(ID, BYTE);
- Serial.print(messageLength, BYTE);
- Serial.print(INST_WRITE,BYTE);
- Serial.print(P_GOAL_POSITION_L, BYTE);
- Serial.print(pos, BYTE);
- Serial.print(pos2, BYTE);
- Serial.print(vel, BYTE);
- Serial.print(vel2, BYTE);
- Serial.print((~(ID + (messageLength) + INST_WRITE + P_GOAL_POSITION_L + pos + pos2 + vel + vel2))&0xFF, BYTE);
- delay(1500);
复制代码
转自:http://www.roboticfan.com/?p=215
|