以下内容不会涉及任何第三方程序,即都为MATLAB自带,本实验是在MATLAB2017a环境下完成,ardunio接口只需点这里下载找到对应的硬件安装即可。
一、实时图像
先上实时监控图,如下。
图1 实时在线获取舵机转动角度曲线
图2 实物连线图
二、代码
代码非常之简单,以下函数大部分要用到R2014b版本的新函数,如时间,绘图的。其中ytickformat函数是R2016b引进的,主要用于对y轴进行格式化标记,当然若你版本低于2016b的话,ytickformat函数就不用用了。
a = arduino('COM4','Mega2560','Libraries', 'Servo'); s1 = servo(a,'D3'); % 舵机1信号线接pin D3口,根据自己情况选择 s2=servo(a,'D8'); % 舵机2信号线接pin D8口,根据自己情况选择 writePosition(s1,0.2);% 初始化角度位置 writePosition(s2,0.8);% 初始化角度位置 %% 实时检测舵机角度并绘图 h1 = animatedline('MaximumNumPoints',180*4,... 'Color','r','LineWidth',1.5);% 大概4个周期,舵机转动范围为0-180度 h2 = animatedline('MaximumNumPoints',180*4,... 'Color','b','LineWidth',1.5);% 大概4个周期,舵机转动范围为0-180度 ax = gca; ax.YGrid = 'on'; ax.YLim = [0,180]; ytickformat('degrees'); xlabel('real time'); ylabel('servo angle') delta1 = 2/180; delta2 = 2/180; while isvalid(ax) % 获取舵机转动后的角度 [targetDu1,delta1] = getTarget(s1,delta1); [targetDu2,delta2] = getTarget(s2,delta2); % 执行舵机转动并且实时绘图 writePosition(s1,targetDu1); writePosition(s2,targetDu2); t = datetime('now','format','HH:mm:ss'); tnum = datenum(t); addpoints(h1,tnum,targetDu1*180); addpoints(h2,tnum,targetDu2*180); datetick('x','dd-mmm-yyyy HH:MM:SS','keeplimits') drawnow limitrate legend('舵机1','舵机2') end另外,上面需要调用的函数getTarget()如下:
function [targetDu,newDelta] = getTarget(s,delta) % 获取舵机s下一次的转动角度targetDu,输入delta为舵机s的角度增量 newDelta = delta; targetDu = readPosition(s); targetDu = targetDu+delta; if targetDu>1 targetDu = 1; newDelta = -delta; end if targetDu<0 targetDu = 0; newDelta = -delta; end注意事项:功率大的舵机需外接电源,我用的是MG996R数码舵机,一个舵机用的是4节1.5v AA碱性电池供电,还需要大电流,坑啊~~。若是MG90s微型舵机用ardunio供电即可。一般需要5v左右电压。