第二讲机器人的伺服电机_第1页
第二讲机器人的伺服电机_第2页
第二讲机器人的伺服电机_第3页
第二讲机器人的伺服电机_第4页
第二讲机器人的伺服电机_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、机器人的伺服电机 机器人的伺服电机是用来将机器人大脑发出的运动指令转换为运动动作的部件,相当于人的肌肉的作用。本讲教你如何连接、调整以及测试机器人伺服电机。为此,你需要理解和掌握控制伺服电机方向、速度和运行时间的相关PBASIC 指令及其编程技术。由于精确地控制伺服电机是决定机器人性能的关键,所以,在把伺服电机安装到机器人底盘之前先熟悉这些内容是非常重要而且必需的。连续旋转伺服电机简介机器人伺服电机有很多种,本讲要介绍的主要是能够使你的轮式机器人两个轮子不停旋转的连续旋转伺服电机,如图2-1所示。图中指出了该伺服电机的外部配件,这些配件将在本讲或后续章节中用到。任务1:将伺服电机连接到教学板在

2、本任务中首先将伺服电机连接到电源和BASIC Stamp模块的I/O口,然后搭建一个LED电路来监视BASIC Stamp模块发送到伺服电机的运动控制信号。连接伺服电机所需的零部件l 􀁺 帕拉斯公司生产的连续旋转伺服电机2个;l 􀁺 搭建LED电路所需的零配件(LED和470欧姆电阻)2套连接伺服电机到教学底板把三位开关拨至0位切断教学底板的电源(图22)。图2-3显示的是教学板上伺服电机接线端子。你可以用板上的跳线来选择伺服电机的供电电源是来自机器人套件中的电池盒Vin还是来自外接直流电源Vdd。要移动跳线帽,你必须向上把跳线帽从原来短接的2个脚上拔下来,

3、然后把跳线帽压进你想短接的2个脚上去。如果使用6V电池组,将两个伺服电机接线端子之间的跳线帽接Vin,参照图2-3(左图)所示。如果使用7.5 V、1000 mA的直流电源,将跳线帽接Vdd,参照图2-3(右图)所示。本书中所有的示例和说明都是用电池组供电。图2-4是你将要搭建的电路的示意图,跳线设定接Vin。注意:每个伺服电机的控制电缆有三根线,其中白色的线用来传送电机的控制信号,红色用来接到电源上,而黑色的则是地线。这些线的颜色的定义在伺服电机出厂时就已经定义好。以后你将会在工程上看到,许多电气元件都是通过线的颜色来标记电线所承担的功能。l 􀁺 连接伺服电机到教学底板,如

4、图2-4所示。l 􀁺 连接完成后,搭建好的系统如图25图所示(不含LED监视电路)。l 􀁺 LED监视电路如图2-6所示。左边是电气原如果使用的是套件中的电池组,选择Vin。如果使用的是AC-DC 直流电源,选择Vdd。理图,右边是在面包板上的接线图。该电路能够监视控制伺服电机的信号。为什么呢?从图2-4的伺服电机连线图可知,两个伺服电机的控制信号线(白色)分别接到了微控制器的P12和P13口,即由微控制器的P12和P13口输出的控制信号控制两个伺服电机的运动;图2-6所示的LED监控指示电路正好也是指示的P12和P13口的信号,所以图2-6的LED电路可以

5、监控伺服电机的控制信号。􀁺任务2:伺服电机调零所谓伺服电机调零是指,当发送一个特定的控制信号(零点标定信号)给伺服电机时,让电机保持静止的过程。由于伺服电机在工厂没有预先调整,它们在接收到该零点标定信号时可能会转动。因此你要用螺丝刀调节伺服电机模块内的调节电阻让伺服电机保持静止。这就是伺服电机调零过程。调整完成之后,你要测试伺服电机,验证其功能是否正常。测试程序将发送控制信号让伺服电机顺时针和逆时针以不同的速度旋转。调零工具机器人套件中提供的螺丝起子是唯一在本任务中需要的额外的工具。发送零点标定信号图2-7显示的信号是发送到与 P12连接的伺服电机的零点校准信号,称为零点标定

6、信号。即如果伺服电机零点已经调节好,发送这个信号给电机就可以让电机保持静止不动。这是一个脉冲时间间隔为20ms,脉冲宽度为1.5 ms的脉冲序列信号。要让机器人的大脑即BS2微控制器能够产生图2-7所示的零点标定信号,必须用到几个新的PABSIC指令:PULSOUT指令、PAUSE指令,和DOLOOP循环语句。PULSOUT指令用来让微控制器产生一个5V电平脉冲,其指令格式和指令参数如下:PULSOUT Pin, Duration指令参数Pin用来确定是给微控制器的哪个I/O脚输出脉冲,而Duration则是用来确定脉冲的宽度的时间单位数,其时间单位是2微秒。因此,要给P12引脚产生图2-7所

7、示的1.5ms的高电平脉冲信号,需要输入如下的指令行:PULSOUT 12, 750显然,如果知道脉冲要持续多长时间,你就可以方便地计算出PULSOUT指令的参数Duration的值:Duration变量=脉冲持续时间/2微秒。按照此公式,零点标定脉冲的宽度变量:Duration=0.0015s/0.000002s=750。PULSOUT指令只产生脉冲,要控制脉冲之间的间隔必须用到PBASIC语言的PAUSE指令。PAUSE指令的使用格式如下:PAUSE DurationDuration 是PAUSE指令的参数,它的值告诉BASIC Stamp微控制器在执行下一条指令之前要等待多久。Durat

8、ion的单位是千分之一秒,即毫秒。假如你想等待1秒,可以给Duration赋值为1000。指令表示如下:PAUSE 1000如果想要等待2秒,表示如下:PAUSE 2000因此,要实现图2-7所示的零点标定信号,必须在PULSOUT指令后添加如下语句:PAUSE 20要持续不断地产生图2-7所示的脉冲序列信号,还必须将PULSOUT语句和PASUSE语句放到DOLOOP循环中。对于计算机或者微控制器而言,它们作为机器人的大脑,与人类或者其它生物的大脑相比,具有一个最大的优势就是,它们可以毫不怨言地不断重复做同一件事情。如果你要你的微控制器不断重复同样的操作,只需将相关的指令放到指令关键词DO和

9、LOOP之间。因此,你要让微控制器不断产生零点标定信号,只需将PULSOUT语句和PAUSE语句放到DO和LOOP之间。最后能够产生图2-7零点标定信号的程序模块如下:例程: CenterServoP12.bs2' CenterServoP12.bs2' This program sends 1.5 ms pulses to the servo connected to' P12 for manual centering.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"DOPULSOU

10、T 12, 750PAUSE 20LOOP注意:以上程序一旦执行,将永远执行下去,直到你关断微控制器的电源为止,下一个任务将指导你如何控制重复执行的次数。最好每次只对一只电机做标定,因为这样的话,在你调节电机时你就可以听到(为何用听到,而不用看到?)什么时候电机停止。上面的程序只发送零点标定信号到P12,下面的步骤将指导你从如何调整电机,使其保持静止状态。在调节完连接到P12上的伺服电机后,用同样的方法调节连接到P13口的电机。l 􀁺 将教学底板三位开关拨到“2”,打开电源。l 􀁺 输入、保存并运行程序CenterServoP12.bs2。如果电机没有进行零

11、点标定,它的连接喉就会转动,而且你也能听到里面马达转动的响声。l 􀁺 如果电机还没有进行零点标定,按照图2-8所示的步骤,用螺丝刀轻轻调节伺服电机上的电位器,直到电机停止转动。(仔细倾听电机的声音,确信电机已经停止转动)l 􀁺 验证连接到 P12 的信号监视电路的LED 灯是否发光,如果发光,表明零点标定脉冲已经发送给连接到P12 口上的电机了。如果电机已经完成了零点调节,它不会转动。但是损坏了或有故障的电机有时也不转动。任务4将在电机安装到机器人底盘之前排除这种可能。l 􀁺 如果电机确实不再转动,下面你可以自己对连接到P13的伺服电机进行

12、测试并做零点标定。该你了􀀀􀀀对连接到P13的伺服电机做零点调整l 􀁺 利用下面程序对连接到P13的伺服电机重复上述过程:程序示例: CenterServoP13.bs2' CenterServoP13.bs2' This program sends 1.5 ms pulses to the servo connected to' P13 for manual centering.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"DOP

13、ULSOUT 13, 750PAUSE 20LOOP注意:如果上述任务完成后,不再进行后面的任务,一定要记得将教学板的电源断开。任务3:如何保存数值和计数在任务2中,你已经知道如何使用循环语句让微控制器不断产生零点标定信号。当然,你在编写某个程序时,肯定并不总是需要机器人永远执行同一个操作或者说任务,而只希望它执行一段指定的时间或者执行一些固定的次数。这时,你就要在PBASIC 程序中用于到变量。变量用来保存数值。后面的机器人程序很大程度上都要依赖使用变量。用变量保存数值的最主要的作用就是程序能用这些变量来计数。一旦你的程序能计数,你就能控制和跟踪事件发生的次数。用变量存储数值,数学运算和计数

14、变量可以用来储存数值。PBASIC语言在使用一个变量之前,要先给该变量起一个名字,并说明该变量的大小类型。这叫声明一个变量。声明一个变量的PBASIC语法如下:variableName VAR Size实际声明变量时,你用你自己起的名字代替variableName,Size用来说明变量的大小类型,PBASIC程序中可以声明的变量类型如下:Bit 存储0或者1;Bib 用来存储0到15之间的任意数值;Byte 用来存储0到255之间的任意数值;Word 用来存储0到65535之间的任意数值,或者-32768到32767之间的任意数值。注意:为何有上述特定的变量类型大小呢?请参考二进制的说明。下面

15、的例程包含两个“word”大小的变量:value VAR WordanotherValue VAR Word在声明变量之后,你也可以对它初始化,即给它一个初始值。value = 500anotherValue = 2000在“value = 500”中,符号“=”是个运算符。你可以利用其它一些运算符和变量进行数学运算。在这里有两个乘法运算的例子:value = 10 * valueanotherValue = 2 * value程序示例: VariablesAndSimpleMath.bs2这个例程演示了如何对变量进行声明、初始化和运算。l 􀁺 在运行程序之前,对DEBUG指

16、令要显示的内容进行预测。l 􀁺 输入、保存并运行程序VariablesAndSimpleMath.bs2。l 􀁺 和你的预测进行对比,解释所有的不相同的原因。' VariablesAndSimpleMath.bs2' Declare variables and use them to solve a few arithmetic problems.' $STAMP BS2' $PBASIC 2.5value VAR Word ' Declare variablesanotherValue VAR Wordvalue =

17、 500 ' Initialize variablesanotherValue = 2000DEBUG ? value ' Display valuesDEBUG ? anotherValuevalue = 10 * anotherValue ' Perform operationsDEBUG ? value ' Display values againDEBUG ? anotherValueEND程序VariablesAndSimpleMath.bs2是如何工作的下面的代码定义了两个字变量:value 和 anotherValue。value VAR Word

18、 ' Declare variablesanotherValue VAR Word然后,初始化变量,即给刚刚声明的变量赋上你决定的初始值。这两条指令执行后,value的值是500,anotherValue的值是2000。value = 500 ' Initialize variablesanotherValue = 2000随后的DEBUG指令帮助你了解初始化变量后每个变量存储的数值,因为给value赋值是500,anotherValue赋值2000,因此DEBUG指令向调试终端发送信息:“value = 500” 和 “anotherValue= 2000”并显示。DEBUG

19、 ? value ' Display valuesDEBUG ? anotherValue这里又新引入了一个DEBUG指令的格式说明字符“?”,该格式说明字符用在一个变量名之前,使DEBUG终端显示其名称,以及存储在该变量中的数值,然后回车。这样对于查询一个变量的内容非常方便。下面三行的疑问是:调试终端将显示什么?答案是value的值是anotherValue的10倍,因为anotherValue的值是2000,那么value就是20000,而变量anotherValue不变。.value = 10 * anotherValue ' Perform operationsDEBU

20、G ? value ' Display values againDEBUG ? anotherValue该你了用负数计算如果你想做一些包含负数的计算,你可以使用DEBUG指令的SDEC格式说明来显示。下面的例子能通过修改程序VariablesAndSimpleMath.bs2得到。l 􀁺 删除程序VariablesAndSimpleMath.bs2的下面部分:value = 10 * anotherValue ' Perform operationsDEBUG ? value ' Display values againl 􀁺 改成如

21、下代码:value = value - anotherValue ' Answer = -1500DEBUG "value = ", SDEC value, CR ' Display values againl 􀁺 运行更改后的程序并验证value的值是否由500变为-1500。计数并控制循环次数最方便的控制一段代码执行次数的方法是利用FORNEXT循环,语法如下:FOR Counter = StartValue TO EndValue STEP StepValue NEXT省略号“”表示你可以在FOR 和NEXT之间放一条或多条的程序指令

22、。使用前面的循环前要确保先声明一个变量替代参数Counter。参数StartValue 和EndValue可以是数值也可以是变量。语法描述中位于大括号 之间的东西,表示是可选参数。换句话说,没有它FORNEXT仍将工作,但是你可以将之用于一些特殊目的。你没有必要一定要将变量命名为“counter”,例如,你可以用“myCounter”myCounter VAR Word下面是一个用myCounter来计数的FORNEXT循环例程。每执行一次循环,它会显示myCounter的值。例程: CountToTen.bs2l 􀁺 输入、保存并运行程序CountToTen.bs2。

23、9; CountToTen.bs2' Use a variable in a FOR.NEXT loop.' $STAMP BS2' $PBASIC 2.5myCounter VAR WordFOR myCounter = 1 TO 10DEBUG ? myCounterPAUSE 500NEXTDEBUG CR, "All done!"END该你了不同的初始值和终值以及计数步长你可以给变量StartValue 和EndValue 赋不同的值l 􀁺 修改FORNEXT循环如下:FOR myCounter = 21 TO 9DEBUG

24、 ? myCounterPAUSE 500NEXTl 􀁺 运行修改后的程序。BASIC Stamp往下计数代替了往上计数,你注意到了吗?只要StartValue的值大于EndValue,程序就会这样运行。还记得可选参数STEP StepValue吗? 你可以用它来使myCounter以不同步长计数,而不是按9, 10, 11这样每次增1来计数。例如,你可以让它每次增加2(9, 11,13)或增加5 (10, 15, 20)或任何你给出的StepValue,递增或递减都可以。下面的例子是以3为步长向下计数。l 􀁺 增加STEP 3到FORNEXT循环,如下所示

25、:FOR myCounter = 21 TO 9 STEP 3DEBUG ? myCounterPAUSE 500NEXTl 􀁺 运行更改后的程序,验证是否以3为步长递减。任务4:测试伺服电机在装配机器人之前还有最后一件事要做,那就是测试伺服电机。在本任务中,你将运行程序,使电机以不同速度和方向旋转。通过测试,可以确保在装配之前电机工作是正常的。这是一个子系统测试的例子。对子系统进行测试是开发过程的好习惯,它不仅仅是让你拆开机器人,而是在组装之前尽可能修补可能出现的一些问题。所谓子系统测试是在将一些分立的部件组装成一个更大的设备之前先对各分立的部件进行测试的过程。在进行机器人

26、竞赛时,这对于你赢得比赛很有帮助。对于工程师而言,无论是开发玩具、汽车和视频游戏,还是开发航天飞机和火星机器人,这都是一个最为基本的技能。特别是在非常复杂的设备中,如果没有事先对子系统进行测试,要找出存在的问题几乎不可能。例如,在太空项目中,如果要拆开一个原形设备以进行维修,将耗费数百万美元。因此,在这样的项目中,必须对所有子系统进行彻底而严格的测试。脉宽控制电机的速度和方向回忆前面的电机零点标定,脉宽为1.5 ms的控制信号使电机保持不动,这是通过给PULSOUT指令参数Duration 赋值为750来实现的。那么如果控制信号的脉冲宽度(简称脉宽)不是1.5 ms,结果会是怎样呢?现在编程发

27、送了一系列1.3 ms的脉冲给伺服电机,你仔细研究一下这一系列脉冲,看它怎样控制电机。图2-9所示是连续旋转电机将以全速顺时针旋转,全速的范围大约是每分钟50 到 60 转(RPM),即约每秒种转一圈。你可以用下面的程序ServoP13Clockwise.bs2将这些脉冲序列发送给端口P13。例程: ServoP13Clockwise.bs2l 􀁺 输入、保存并运行程序 ServoP13Clockwise.bs2。l 􀁺 验证电机的输出轴是否顺时针旋转,并且速度在50 到 60 RPM之间。' ServoP13Clockwise.bs2' R

28、un the servo connected to P13 at full speed clockwise.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"DOPULSOUT 13, 650PAUSE 20LOOP注意:1.3 ms的脉冲需要PULSOUT指令的参数Duration的值为650,是一个小于750的数。所有的脉宽都小于1.5 ms,即PULSOUT 指令的Duration参数要小于750,才能使电机顺时针旋转。当然,在进行上述验证时,一定要将伺服电机连接到控制端口上,并接上电源。例程: Serv

29、oP12Clockwise.bs2将PULSOUT 指令的参数PIN的值由13改为12,就可以使连接到P12的电机以全速顺时针旋转。l 􀁺 把程序ServoP13Clockwise.bs2 另存为ServoP12Clockwise.bs2.l 􀁺 把PULSOUT 指令的参数PIN的值由13改为12,更新注释。l 􀁺 运行程序验证连接 P12 的电机是否顺时针旋转,并且速度在50 到 60 RPM 之间。' ServoP12Clockwise.bs2' Run the servo connected to P12 at fu

30、ll speed clockwise.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"DOPULSOUT 12, 650PAUSE 20LOOP例程:ServoP12Counterclockwise.bs2你可能已经猜到将PULSOUT 指令的参数Duration设置为大于750的数会使伺服电机逆时针旋转。Duration的值为850可以发出1.7 ms宽度的脉冲,如图2-10所示,这将使伺服电机全速逆时针旋转。l 􀁺 将 程 序ServoP12Clockwise.bs2 另存为ServoP

31、12Counterclockwise.bs2l 􀁺 把 PULSOUT 指令的参数Duration 改为850。l 􀁺 运行程序,验证连接 P12 的电机是否逆时针旋转,并且速度在50 到 60 RPM 之间。' ServoP12Counterclockwise.bs2' Run the servo connected to P12 at full speed counterclockwise.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"DOPULSOU

32、T 12, 850PAUSE 20LOOP该你了l 􀁺 修改上述例程中PULSOUT指令的参数PIN,使连接P13的电机逆时针转动例程: ServosP13CcwP12Cw.bs2你可以使用两个PULSOUT指令使两个伺服电机同时旋转,你也可以使它们向相互相反的方向旋转。l 􀁺 输入、保存并运行程序下面的程序ServosP13CcwP12Cw.bs2。l 􀁺 运行程序,验证连接到P13的电机是否全速逆时针旋转,而连接到P12的电机全速顺时针旋转。' ServosP13CcwP12Cw.bs2' Run the servo c

33、onnected to P13 at full speed counterclockwise' and the servo connected to P12 at full speed clockwise.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"DOPULSOUT 13, 850PULSOUT 12, 650PAUSE 20LOOP下面的理解非常重要。想一想:当电机安装在机器人底盘的两侧,一个顺时针旋转而另一个逆时针旋转,将使机器人沿直线运动。听起来是否有些古怪?如果你无法理解,试试这样:l

34、􀁺 把两个电机背靠背放在一起重新运行程序。该你了调整速度和方向两个电机全速转动时,两个PULSOUT指令的参数 Duration有四种不同的组合,在后面的章节中编写机器人运动的程序时,这些组合经常会被用到。程序ServosP13CcwP12Cw.bs2发送了这些组合中的一种,850给P13 ,650 给P12。通过测试不同的运动组合,并填写表2-1的运动描述栏,你将慢慢熟悉这些组合并为你自己建立一个参考。当机器人安装完成后,尝试一下这些运动组合,填写下表的运动行为栏,你就会看到每种数据组合使它怎样运动。l 􀁺 试试下面的PULSOUT Duration组合,

35、将结果填写到描述列。FORNEXT循环控制电机的运行时间到目前为止,你已经完全理解了脉冲宽度控制连续旋转电机速度和方向的原理。控制电机速度和方向的方法是非常简单的,当然也有一个简单的方法来控制电机运行的时间,那就是用FORNEXT循环。下面是FORNEXT循环的例子,它会使电机运行几秒钟。FOR COUNTER = 1 TO 100PULSOUT 13, 850PAUSE 20NEXT你计算一下这段代码能使电机转动的确切时间。每执行循环一次,PULSOUT指令将持续1.7ms,PAUSE指令持续20ms,执行一次循环大概额外需要1.3 ms,那么FORNEXT循环整体执行一次的时间是:1.7

36、ms + 20 ms + 1.3 ms = 23.0 ms,本循环执行100次,即就是23.0 ms乘以100,时间=100*23.0毫秒=100*0.023秒=2.3秒。假如你要让电机运行4.6秒,FORNEXT循环必须执行上面两倍的次数。FOR counter = 1 TO 200PULSOUT 13, 850PAUSE 20NEXT例程: ControlServoRunTimes.bs2l 􀁺 输入、保存并运行程序ControlServoRunTimes.bs2.l 􀁺 验证是否与P13 连接的电机首先逆时针旋转2.3秒,然后与P12 连接的电机旋转4

37、.6秒。' ControlServoRunTimes.bs2' Run the P13 servo at full speed counterclockwise for 2.3 s, then' run the P12 servo for twice as long.' $STAMP BS2' $PBASIC 2.5DEBUG "Program Running!"counter VAR ByteFOR counter = 1 TO 100PULSOUT 13, 850PAUSE 20NEXTFOR counter = 1 TO 200PULSOUT 12, 850PAUSE 20NEXTEND假如你想让两个电机同时都运行,给与P13连接的电机发出850的脉宽,给与P12连接的电机发出650的脉宽,现在执行一次循环要用的时间是:1.7ms 与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论