机器人编程之机器人的伺服电机Word文件下载.docx
《机器人编程之机器人的伺服电机Word文件下载.docx》由会员分享,可在线阅读,更多相关《机器人编程之机器人的伺服电机Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
连接完成后,搭建好的系统如图2−5图所示(不含LED监视电路)。
LED监视电路如图2-6所示。
左边是电气原如果使用的是套件中的电池组,选择Vin。
如果使用的是AC-DC直流电源,选择Vdd。
理图,右边是在面包板上的接线图。
该电路能够监视控制伺服电机的信号。
为什么呢?
从图2-4的伺服电机连线图可知,两个伺服电机的控制信号线(白色)分别接到了微控制器的P12和P13口,即由微控制器的P12和P13口输出的控制信号控制两个伺服电机的运动;
图2-6所示的LED监控指示电路正好也是指示的P12和P13口的信号,所以图2-6的LED电路可以监控伺服电机的控制信号。
任务2:
伺服电机调零
所谓伺服电机调零是指,当发送一个特定的控制信号(零点标定信号)给伺服电机时,让电机保持静止的过程。
由于伺服电机在工厂没有预先调整,它们在接收到该零点标定信号时可能会转动。
因此你要用螺丝刀调节伺服电机模块内的调节电阻让伺服电机保持静止。
这就是伺服电机调零过程。
调整完成之后,你要测试伺服电机,验证其功能是否正常。
测试程序将发送控制信号让伺服电机顺时针和逆时针以不同的速度旋转。
调零工具
机器人套件中提供的螺丝起子是唯一在本任务中需要的额外的工具。
发送零点标定信号
图2-7显示的信号是发送到与P12连接的伺服电机的零点校准信号,称为零点标定信号。
即如果伺服电机零点已经调节好,发送这个信号给电机就可以让电机保持静止不动。
这是一个脉冲时间间隔为20ms,脉冲宽度为1.5ms的脉冲序列信号。
要让机器人的大脑即BS2微控制器能够产生图2-7所示的零点标定信号,必须用到几个新的PABSIC指令:
PULSOUT指令、PAUSE指令,和DO…LOOP循环语句。
PULSOUT指令用来让微控制器产生一个5V电平脉冲,其指令格式和指令参数如下:
PULSOUTPin,Duration指令参数Pin用来确定是给微控制器的哪个I/O脚输出脉冲,而Duration则是用来确定脉冲的宽度的时间单位数,其时间单位是2微秒。
因此,要给P12引脚产生图2-7所示的1.5ms的高电平脉冲信号,需要输入如下的指令行:
PULSOUT12,750
显然,如果知道脉冲要持续多长时间,你就可以方便地计算出PULSOUT指令的参数Duration的值:
Duration变量=脉冲持续时间/2微秒。
按照此公式,零点标定脉冲的宽度变量:
Duration=0.0015s/0.000002s=750。
PULSOUT指令只产生脉冲,要控制脉冲之间的间隔必须用到PBASIC语言的PAUSE指令。
PAUSE指令的使用格式如下:
PAUSEDurationDuration是PAUSE指令的参数,它的值告诉BASICStamp微控制器在执行下一条指令之前要等待多久。
Duration的单位是千分之一秒,即毫秒。
假如你想等待1秒,可以给Duration赋值为1000。
指令表示如下:
PAUSE1000
如果想要等待2秒,表示如下:
PAUSE2000因此,要实现图2-7所示的零点标定信号,必须在PULSOUT指令后添加如下语句:
PAUSE20
要持续不断地产生图2-7所示的脉冲序列信号,还必须将PULSOUT语句和PASUSE语句放到DO…LOOP循环中。
对于计算机或者微控制器而言,它们作为机器人的大脑,与人类或者其它生物的大脑相比,具有一个最大的优势就是,它们可以毫不怨言地不断重复做同一件事情。
如果你要你的微控制器不断重复同样的操作,只需将相关的指令放到指令关键词DO和LOOP之间。
因此,你要让微控制器不断产生零点标定信号,只需将PULSOUT语句和PAUSE语句放到DO和LOOP之间。
最后能够产生图2-7零点标定信号的程序模块如下:
例程:
CenterServoP12.bs2
'
Thisprogramsends1.5mspulsestotheservoconnectedto
P12formanualcentering.
{$STAMPBS2}
{$PBASIC2.5}
DEBUG"
ProgramRunning!
"
DO
LOOP
以上程序一旦执行,将永远执行下去,直到你关断微控制器的电源为止,下一个任务将指导你如何控制重复执行的次数。
最好每次只对一只电机做标定,因为这样的话,在你调节电机时你就可以听到(为何用听到,而不用看到?
)什么时候电机停止。
上面的程序只发送零点标定信号到P12,下面的步骤将指导你从如何调整电机,使其保持静止状态。
在调节完连接到P12上的伺服电机后,用同样的方法调节连接到P13口的电机。
将教学底板三位开关拨到“2”,打开电源。
输入、保存并运行程序CenterServoP12.bs2。
如果电机没有进行零点标定,它的连接喉就会转动,而且你也能听到里面马达转动的响声。
如果电机还没有进行零点标定,按照图2-8所示的步骤,用螺丝刀轻轻调节伺服电机上的电位器,直到电机停止转动。
(仔细倾听电机的声音,确信电机已经停止转动)
验证连接到P12的信号监视电路的LED灯是否发光,如果发光,表明零点标定脉冲已经发送给连接到P12口上的电机了。
如果电机已经完成了零点调节,它不会转动。
但是损坏了或有故障的电机有时也不转动。
任务4将在电机安装到机器人底盘之前排除这种可能。
如果电机确实不再转动,下面你可以自己对连接到P13的伺服电机进行测试并做零点标定。
该你了对连接到P13的伺服电机做零点调整
利用下面程序对连接到P13的伺服电机重复上述过程:
程序示例:
CenterServoP13.bs2
P13formanualcentering.
PULSOUT13,750
如果上述任务完成后,不再进行后面的任务,一定要记得将教学板的电源断开。
任务3:
如何保存数值和计数
在任务2中,你已经知道如何使用循环语句让微控制器不断产生零点标定信号。
当然,你在编写某个程序时,肯定并不总是需要机器人永远执行同一个操作或者说任务,而只希望它执行一段指定的时间或者执行一些固定的次数。
这时,你就要在PBASIC程序中用于到变量。
变量用来保存数值。
后面的机器人程序很大程度上都要依赖使用变量。
用变量保存数值的最主要的作用就是程序能用这些变量来计数。
一旦你的程序能计数,你就能控制和跟踪事件发生的次数。
用变量存储数值,数学运算和计数变量可以用来储存数值。
PBASIC语言在使用一个变量之前,要先给该变量起一个名字,并说明该变量的大小类型。
这叫声明一个变量。
声明一个变量的PBASIC语法如下:
variableNameVARSize
实际声明变量时,你用你自己起的名字代替variableName,Size用来说明变量的大小类型,PBASIC程序中可以声明的变量类型如下:
Bit—存储0或者1;
Bib—用来存储0到15之间的任意数值;
Byte—用来存储0到255之间的任意数值;
Word—用来存储0到65535之间的任意数值,或者-32768到32767之间的任意数值。
为何有上述特定的变量类型大小呢?
请参考二进制的说明。
下面的例程包含两个“word”大小的变量:
valueVARWord
anotherValueVARWord
在声明变量之后,你也可以对它初始化,即给它一个初始值。
value=500
anotherValue=2000
在“value=500”中,符号“=”是个运算符。
你可以利用其它一些运算符和变量进行数学运算。
在这里有两个乘法运算的例子:
value=10*value
anotherValue=2*value
VariablesAndSimpleMath.bs2
这个例程演示了如何对变量进行声明、初始化和运算。
在运行程序之前,对DEBUG指令要显示的内容进行预测。
输入、保存并运行程序VariablesAndSimpleMath.bs2。
和你的预测进行对比,解释所有的不相同的原因。
Declarevariablesandusethemtosolveafewarithmeticproblems.
valueVARWord'
Declarevariables
value=500'
Initializevariables
DEBUG?
value'
Displayvalues
anotherValue
value=10*anotherValue'
Performoperations
Displayvaluesagain
END
程序VariablesAndSimpleMath.bs2是如何工作的
下面的代码定义了两个字变量:
value和anotherValue。
然后,初始化变量,即给刚刚声明的变量赋上你决定的初始值。
这两条指令执行后,value的值是500,anotherValue的值是2000。
随后的DEBUG指令帮助你了解初始化变量后每个变量存储的数值,因为给value赋值是500,
anotherValue赋值2000,因此DEBUG指令向调试终端发送信息:
“value=500”和“anotherValue
=2000”并显示。
这里又新引入了一个DEBUG指令的格式说明字符“?
”,该格式说明字符用在一个变量名之前,使DEBUG终端显示其名称,以及存储在该变量中的数值,然后回车。
这样对于查询一个变量的内容非常方便。
下面三行的疑问是:
调试终端将显示什么?
答案是value的值是anotherValue的10倍,因为anotherValue的值是2000,那么value就是20000,而变量anotherValue不变。
.
该你了――用负数计算
如果你想做一些包含负数的计算,你可以使用DEBUG指令的SDEC格式说明来显示。
下面的例子能通过修改程序VariablesAndSimpleMath.bs2得到。
删除程序VariablesAndSimpleMath.bs2的下面部分:
改成如下代码:
value=value-anotherValue'
Answer=-1500
value="
SDECvalue,CR'
运行更改后的程序并验证value的值是否由500变为-1500。
计数并控制循环次数最方便的控制一段代码执行次数的方法是利用FOR…NEXT循环,语法如下:
FORCounter=StartValueTOEndValue{STEPStepValue}…NEXT省略号“…”表示你可以在FOR和NEXT之间放一条或多条的程序指令。
使用前面的循环前要确保先声明一个变量替代参数Counter。
参数StartValue和EndValue可以是数值也可以是变量。
语法描述中位于大括号{}之间的东西,表示是可选参数。
换句话说,没有它FOR…NEXT仍将工作,但是你可以将之用于一些特殊目的。
你没有必要一定要将变量命名为“counter”,例如,你可以用“myCounter”
myCounterVARWord
下面是一个用myCounter来计数的FOR…NEXT循环例程。
每执行一次循环,它会显示
myCounter的值。
CountToTen.bs2
输入、保存并运行程序CountToTen.bs2。
UseavariableinaFOR...NEXTloop.
FORmyCounter=1TO10
myCounter
PAUSE500
NEXT
DEBUGCR,"
Alldone!
该你了――不同的初始值和终值以及计数步长
你可以给变量StartValue和EndValue赋不同的值
修改FOR…NEXT循环如下:
FORmyCounter=21TO9
运行修改后的程序。
BASICStamp往下计数代替了往上计数,你注意到了吗?
只要StartValue的值大于EndValue,程序就会这样运行。
还记得可选参数{STEPStepValue}吗?
你可以用它来使myCounter以不同步长计数,而不是按9,10,11…这样每次增1来计数。
例如,你可以让它每次增加2(9,11,13…)或增加5(10,15,20…)或任何你给出的StepValue,递增或递减都可以。
下面的例子是以3为步长向下计数。
增加STEP3到FOR…NEXT循环,如下所示:
FORmyCounter=21TO9STEP3
运行更改后的程序,验证是否以3为步长递减。
任务4:
测试伺服电机
在装配机器人之前还有最后一件事要做,那就是测试伺服电机。
在本任务中,你将运行程序,使电机以不同速度和方向旋转。
通过测试,可以确保在装配之前电机工作是正常的。
这是一个子系统测试的例子。
对子系统进行测试是开发过程的好习惯,它不仅仅是让你拆开机器人,而是在组装之前尽可能修补可能出现的一些问题。
所谓子系统测试是在将一些分立的部件组装成一个更大的设备之前先对各分立的部件进行测试的过程。
在进行机器人竞赛时,这对于你赢得比赛很有帮助。
对于工程师而言,无论是开发玩具、汽车和视频游戏,还是开发航天飞机和火星机器人,这都是一个最为基本的技能。
特别是在非常复杂的设备中,如果没有事先对子系统进行测试,要找出存在的问题几乎不可能。
例如,在太空项目中,如果要拆开一个原形设备以进行维修,将耗费数百万美元。
因此,在这样的项目中,必须对所有子系统进行彻底而严格的测试。
脉宽控制电机的速度和方向
回忆前面的电机零点标定,脉宽为1.5ms的控制信号使电机保持不动,这是通过给PULSOUT指令参数Duration赋值为750来实现的。
那么如果控制信号的脉冲宽度(简称脉宽)不是1.5ms,结果会是怎样呢?
现在编程发送了一系列1.3ms的脉冲给伺服电机,你仔细研究一下这一系列脉冲,看它怎样控制电机。
图2-9所示是连续旋转电机将以全速顺时针旋转,全速的范围大约是每分钟50到60转(RPM),即约每秒种转一圈。
你可以用下面的程序
ServoP13Clockwise.bs2将这些脉冲
序列发送给端口P13。
ServoP13Clockwise.bs2
输入、保存并运行程序ServoP13Clockwise.bs2。
验证电机的输出轴是否顺时针旋转,并且速度在50到60RPM之间。
RuntheservoconnectedtoP13atfullspeedclockwise.
PULSOUT13,650
1.3ms的脉冲需要PULSOUT指令的参数Duration的值为650,是一个小于750的数。
所有的脉宽都小于1.5ms,即PULSOUT指令的Duration参数要小于750,才能使电机顺时针旋转。
当然,在进行上述验证时,一定要将伺服电机连接到控制端口上,并接上电源。
ServoP12Clockwise.bs2将PULSOUT指令的参数PIN的值由13改为12,就可以使连接到P12的电机以全速顺时针旋转。
把程序ServoP13Clockwise.bs2另存为ServoP12Clockwise.bs2.
把PULSOUT指令的参数PIN的值由13改为12,更新注释。
运行程序验证连接P12的电机是否顺时针旋转,并且速度在50到60RPM之间。
ServoP12Clockwise.bs2
RuntheservoconnectedtoP12atfullspeedclockwise.
PULSOUT12,650
例程:
ServoP12Counterclockwise.bs2
你可能已经猜到将PULSOUT指令的参数Duration设置为大于750的数
会使伺服电机逆时针旋转。
Duration的值为850可以发出1.7ms宽度的脉冲,如图2-10所示,这将使伺服电机全速逆时针旋转。
将程序ServoP12Clockwise.bs2另存为ServoP12Counterclockwise.bs2把PULSOUT指令的参数Duration改为850。
运行程序,验证连接P12的电机是否逆时针旋转,并且速度在50到60RPM之间。
RuntheservoconnectedtoP12atfullspeedcounterclockwise.
PULSOUT12,850
该你了
修改上述例程中PULSOUT指令的参数PIN,使连接P13的电机逆时针转动
ServosP13CcwP12Cw.bs2
你可以使用两个PULSOUT指令使两个伺服电机同时旋转,你也可以使它们向相互相反的方向旋转。
输入、保存并运行程序下面的程序ServosP13CcwP12Cw.bs2。
运行程序,验证连接到P13的电机是否全速逆时针旋转,而连接到P12的电机全速顺时针旋转。
RuntheservoconnectedtoP13atfullspeedcounterclockwise
andtheservoconnectedtoP12atfullspeedclockwise.
PULSOUT13,850
下面的理解非常重要。
想一想:
当电机安装在机器人底盘的两侧,一个顺时针旋转而另一个逆时针旋转,将使机器人沿直线运动。
听起来是否有些古怪?
如果你无法理解,试试这样:
l�把两个电机背靠背放在一起重新运行程序。
该你了――调整速度和方向
两个电机全速转动时,两个PULSOUT指令的参数Duration有四种不同的组合,在后面的章节中编写机器人运动的程序时,这些组合经常会被用到。
程序ServosP13CcwP12Cw.bs2发送了这些组合中的一种,850给P13,650给P12。
通过测试不同的运动组合,并填写表2-1的运动描述栏,你将慢慢熟悉这些组合并为你自己建立一个参考。
当机器人安装完成后,尝试一下这些运动组合,填写下表的运动行为栏,你就会看到每种数据组合使它怎样运动。
l�试试下面的PULSOUTDuration组合,将结果填写到描述列。
FOR…NEXT循环控制电机的运行时间
到目前为止,你已经完全理解了脉冲宽度控制连续旋转电机速度和方向的原理。
控制电机速度和方向的方法是非常简单的,当然