前阵时间玩了一下威龙舵机控制器,这款控制器非常适合用来控制多足机器人、机械手等,搭配专用的上位机软件,可以快速、直观搭建出一套复杂运动的机器人。控制器控制模式有单舵机控制和群舵机控制,在群控制中,被编入同一群的舵机可以在旋转角度大小不同的时候能做到自动协调速度,同启同止,此功能在设计多自由度仿生机器人时非常实用,可使动作非常平滑、流畅。本项目将做一个实用的用法分享,最终将控制一个机械臂来抓取物料。
注:在没有认真阅读本说明之前,请勿给模块加电!错误接线将导致模块永久性损坏或烧毁微控制器;
请认真查看引脚功能说明,正确接线!请勿将电源反接,否则将导致模块永久性损坏;
请勿使用超出额定电压的电源!保证电源的稳定,如果出现高压脉冲,可能会导致微控制器永久性损坏;
本产品无防水防潮功能,请在干燥环境下保存或使用!不可将重物堆积在上面;
请勿给Maple RET6芯片烧写任何程序,否则预装的程序将会丢失,无法读取任何指令。
一、准备材料
威龙24路舵机控制器 * 1
Arduino UNO x 1
Microusb数据线 x 1
模拟角度传感器 x 1
机械臂 x 1
9V逻辑供电电源 x 1
5V舵机供电电源 x 1
下载好驱动和上位机软件:链接
二、驱动安装
控制器在初次使用时需要安装两个驱动:
1.在windows环境下安装驱动
1) 将Veyron Servo Driver 24-Channel连接到计算机的USB接口。
2) 按下左下角的复位键(印有“RET”的按键),这时蓝色指示灯会快速闪烁6次,然后慢闪烁几次。
3) 再次按下复位键,这次在蓝色指示灯快速闪烁6次期间按下另一个键(右上角,印有“BOOT0”)并保持不放,直到指示灯开始慢闪烁时放开。蓝色指示灯会一直闪烁,使你有机会安装DFU驱动程序。
4) Windows会提示你需要驱动程序,人工指定驱动程序所在目录位置,选择DFservo文件夹中的mapleDrv\dfu。在安装mapleDrv\dfu驱动时如果提示“第三方 INF不包含数字签名信息”,可百度一下:解决安装驱动时INF不包含数字签名信息。
5) 安装虚拟串口驱动程序:复位Veyron Servo Driver 24-Channel的RET按键,等待蓝色指示灯停止闪烁。此时Windows会提示安装驱动程序,同样,人工指定驱动程序所在目录为DFservo文件夹中的mapleDrv\serial。
2.在Linux环境下安装驱动
1)首先确认是否已经安装了JRE,如果没有,可以通过如下命令安装: sudo aptitude install openjdk-6-jre
2)解压压缩文件到合适的位置(例如桌面)。
3)打开解压压缩文件得到的文件夹,运行其中的install-udev-rules.sh,出现要求输入用于获得管理员权限的密码的提示。
4)用“sudo restart udev”命令重启udev即可。
3.在Mac环境下安装驱动
双击你所下载的DMG文件使该镜像被加载即可。
三、硬件介绍
这里来介绍一下控制器的主要硬件资源
1.舵机供电输入端:输入4.8V~6V直流电,这个接口必须供电否则舵机无法工作。
2.逻辑电源输入端:输入6V~12V直流电,调试时逻辑电源接口与USB接口二选一,只接一个即可。
3.USB接口:具有逻辑电源输入功能和串口调试功能,用于初次使用时安装驱动和后面的调试。
4.3.3V和5V输出:具有3.3V和5V电压输出功能。
5.拨码开关:用于设置工作模式和调节波特率,当A、B都拨到1(ON)时波特率为115200,本此是通过115200进行通信的。工作模式的拨码开关,使用了SERIAL模式,通过串口接收指令。
6.RESET按键和BOOT0按键:用于初次使用时安装驱动。
7.23路舵机通道:3PIN接口,按照舵机线序可以直接连接。
8.无线模块接口和串口接口:多种接收指令的方式,可以通过无线串口模块来接收指令,或者通过串口接口来接收指令。
四、上位机调试模式
1.角度记录
在接到威龙控制器上之前最好先用UNO配合角度传感器调节一下各个关节的位置,记录一下各个关节在不产生机械碰撞的情况下所能动作的角度范围,在下面的调试中要注意不能查过这个范围,否则会导致舵机堵转烧坏舵机。角度传感器接A0,六个舵机分别接D11引脚进行调节记录。
#include <Servo.h>
Servo myservo;
volatile float variable;
void setup() {
myservo.attach(11);
Serial.begin(9600);
}
void loop() {
variable = (map(analogRead(A0), 0, 1023, 0, 180));
Serial.println(variable );
myservo.write(abs(variable));
}
2.硬件接线
记录好数据后将6个舵机与威龙控制器连接,机械臂底盘舵机对应接到1号引脚,往上依次对应,接上舵机供电电源并通过microusb接口连接电脑。
3.安装上位机并打开
打开上位机软件visual_servo_controller.exe(如果打不开可以尝试打开visual_servo_controller.bat),软件界面如图。
4.添加舵机控制指令
通过拖动"Drga to Add "按钮增加新的舵机;鼠标分别指向舵机的左右两边和中间部分按下并拖动,可以分别改变舵机的起始时间和结束时间;鼠标分别指向舵机的中间部分按下并拖动,可以改变舵机的位置;鼠标分别指向舵机的左右两边并右击,可以精确输入舵机的起始时间和结束时间;鼠标分别指向舵机的左右两边并双击,可以分别输入舵机的起始角度和结束角度;鼠标指向舵机中间部分右击或双击,可以改变舵机号;鼠标在时间轴空白处点击并左右拖动,可以改变时间轴当前视图位置。文字解释比较抽象,大家可以操作一下很容易就能明白,通过拖拽,最后完成下图中的设计。选好com口和波特率后就可以点击连接运行观察现象了。(图中已经连接,点击Disconnect将断开连接)
5.运行效果
上图实现的效果是:开始时1-6号舵机处在45°、120°、120°、60°、90°、170°的初始位置,一秒时间内1-6号舵机将以不同的速度从初始位置同时运动到45°、90°、90°、60°、90°、110°的位置,在这一秒的时间中,1-6号舵机就是被编到了同一个舵机群中,完成了一个动作;下一个动作只有舵机1在一秒的时间内从上一个位置运动到了90°的位置,以此类推。点击左下角的运行按钮,将观察到现象:
五、编程控制
1.硬件连线
这里有一个奇怪的问题要注意一下:供电顺序最好按照舵机供电-逻辑供电-Arduino供电,不然经常会出现无法通讯的问题。
2.舵机控制命令集
# P S ... # P S T <回车>
#:舵机通道号,0 – 23。
P:脉冲宽度,单位微秒(us),500 – 2500。
S:单通道的运动速度,单位us/秒。(可选)
T:所有通道的速度,单位毫秒(ms),最大65535。(可选)
<回车>:结束回车符,ASCII码中的13。(必选)
例如:
#5 P1600 T1000
通道5将在1秒内从任何位置移动到1600us位置。
#5 P600 #10 P750 T2500
通道5移动到1600us位置,通道10移动到750us的位置,2个都同时在2500ms内完成,这个命令能协调多个舵机的速度,即使2个舵机的初始位置相差很远,都可以使他们同时开始转动并同时停止到指定位置上。
3.测试指令
将程序烧录到UNO中,UNO通过串口向威龙控制器发送指令,#1表示的是通道一,P750表示舵机运动到脉冲宽度750us(接近-90°)的位置,T1000表示将在1S时移动到指定位置;等待5S后舵机在1S内移动到2200us(接近+90°)的位置。
void setup() {
Serial.begin(115200);//Set the baudrate to 115200 A:1 B:1
delay(100);//wait for baudrate setting finished}void loop() {
Serial.print("#1 P750 T1000");// Channel 5 will move to 750us within 500ms
delay(5); //wait for first comand transmission done, if you send
// a long command, you'd better extend it
Serial.print("\r"); // send Carriage Return <CR>
delay(1000); //wait for servo go to the set position
Serial.print("#1 P2200 T1000");// Channel 5 will move to 2200us within 500ms
delay(5);
Serial.print("\r");
delay(1000);}
4.舵机控制原理
根据脉冲宽度与舵机角度的关系我们可以知道500us时是-90°,相当于脉冲宽度每增加11.1us角度就会增加1°,因为威龙控制器的指令是通过脉冲宽度来控制舵机角度的,所以我们可以写一个函数来计算角度和脉冲的关系。
int set_angle(int in_angle){
return 500+(in_angle*11.1);
}
5.编写程序
通过参考上位机中已经设置好的角度,直接通过代码来实现:
int set_angle(int in_angle){
return 500+(in_angle*11.1);
}
void move(){
//init
Serial.print(String("#1 P") + set_angle(45) + String(" #2 P") + set_angle(120) + String(" #3 P") + set_angle(120) + String(" #4 P") + set_angle(60) + String(" #5 P") + set_angle(90) + String(" #6 P") + set_angle(170) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(3000);
//step1
Serial.print(String("#2 P") + set_angle(90) + String(" #3 P") + set_angle(90) + String(" #6 P") + set_angle(110) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step2
Serial.print(String("#1 P") + set_angle(90) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step3
Serial.print(String("#2 P") + set_angle(110) + String(" #3 P") + set_angle(130) + String(" #4 P") + set_angle(15) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step4
Serial.print(String("#6 P") + set_angle(170) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step5
Serial.print(String("#2 P") + set_angle(130) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step6
Serial.print(String("#1 P") + set_angle(10) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step7
Serial.print(String("#2 P") + set_angle(110) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step8
Serial.print(String("#6 P") + set_angle(110) + String(" T1000"));//
delay(5);
Serial.print("\r");
delay(1000);
//step9
Serial.print(String("#3 P") + set_angle(120) + String(" #4 P") + set_angle(60) + String(" #5 P") + set_angle(90) + String(" T1000"));
delay(5);
Serial.print("\r");
delay(1000);
}
void setup() {
Serial.begin(115200);//Set the baudrate to 115200 A:1 B:1
delay(100);//wait for baudrate setting finished
move();
}
void loop() {
//
}
一些其他指令可以查看官方文档:https://wiki.dfrobot.com.cn/_SKU_DRI0029_Veyron_Servo_Driver_24-Channel
|