• 沒有找到結果。

任务4:测试伺服电机

在文檔中 基础机器人制作与编程 (頁 27-32)

在装配机器人之前还有最后一件事要做,那就是测试伺服电机。在本任务中,你将运行程序,

使电机以不同速度和方向旋转。通过测试,可以确保在装配之前电机工作是正常的。

这是一个子系统测试的例子。对子系统进行测试是开发过程的好习惯,它不仅仅是让你拆开机 器人,而是在组装之前尽可能修补可能出现的一些问题。

所谓子系统测试是在将一些分立的部件组装成一个更大的设备之前先对各分立的部件进行测 试的过程。在进行机器人竞赛时,这对于你赢得比赛很有帮助。对于工程师而言,无论是开发玩具、

汽车和视频游戏,还是开发航天飞机和火星机器人,这都是一个最为基本的技能。特别是在非常复 杂的设备中,如果没有事先对子系统进行测试,要找出存在的问题几乎不可能。例如,在太空项目 中,如果要拆开一个原形设备以进行维修,将耗费数百万美元。因此,在这样的项目中,必须对所 有子系统进行彻底而严格的测试。

脉宽控制电机的速度和方向

回忆前面的电机零点标定,脉宽为1.5 ms的控制信号使电机保持不动,这是通过给PULSOUT

令参数Duration 赋值为750来实现的。那么如果控制信号的脉冲宽度(简称脉宽)不是1.5 ms,结果

会是怎样呢?

现在编程发送了一系列1.3 ms的 脉冲给伺服电机,你仔细研究一下这 一系列脉冲,看它怎样控制电机。图 2-9所示是连续旋转电机将以全速顺

基础机器人制作与编程 时针旋转,全速的范围大约是每分钟50 到 60 转(RPM),即约每秒种转一圈。

你可以用下面的程序

ServoP13Clockwise.bs2将这些脉冲 序列发送给端口P13。

例程: ServoP13Clockwise.bs2

z 输入、保存并运行程序 ServoP13Clockwise.bs2。

z 验证电机的输出轴是否顺时针旋转,并且速度在50 到 60 RPM之间。

' ServoP13Clockwise.bs2

' Run the servo connected to P13 at full speed clockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 13, 650 PAUSE 20

LOOP

注意:1.3 ms的脉冲需要PULSOUT指令的参数Duration的值为650,是一个小于750的数。所 有的脉宽都小于1.5 ms,即PULSOUT 指令的Duration参数要小于750,才能使电机顺时针旋转。

当然,在进行上述验证时,一定要将伺服电机连接到控制端口上,并接上电源。

例程: ServoP12Clockwise.bs2

将PULSOUT 指令的参数PIN的值由13改为12,就可以使连接到P12的电机以全速顺时针旋转。

z 把程序ServoP13Clockwise.bs2 另存为ServoP12Clockwise.bs2.

z 把PULSOUT 指令的参数PIN的值由13改为12,更新注释。

z 运行程序验证连接 P12 的电机是否顺时针旋转,并且速度在 50 到 60 RPM 之间。

' ServoP12Clockwise.bs2

' Run the servo connected to P12 at full speed clockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 12, 650 PAUSE 20

ServoP12Clockwise.bs2 另 存 为

2-9 1.3 ms 的控制脉冲序列使电机顺时针全速旋转

2-10 1.7ms 的连续脉冲序列使电机逆时针全速旋转

基础机器人制作与编程 ServoP12Counterclockwise.bs2

z 把 PULSOUT 指令的参数 Duration 改为 850。

z 运行程序,验证连接 P12 的电机是否逆时针旋转,并且速度在 50 到 60 RPM 之间。

' ServoP12Counterclockwise.bs2

' Run the servo connected to P12 at full speed counterclockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 12, 850 PAUSE 20

LOOP 该你了

z 修改上述例程中PULSOUT指令的参数PIN,使连接P13的电机逆时针转动 例程: ServosP13CcwP12Cw.bs2

你可以使用两个PULSOUT指令使两个伺服电机同时旋转,你也可以使它们向相互相反的方向 旋转。

z 输入、保存并运行程序下面的程序ServosP13CcwP12Cw.bs2。

z 运行程序,验证连接到P13的电机是否全速逆时针旋转,而连接到P12的电机全速顺时针旋 转。

' ServosP13CcwP12Cw.bs2

' Run the servo connected to P13 at full speed counterclockwise ' and the servo connected to P12 at full speed clockwise.

' {$STAMP BS2}

' {$PBASIC 2.5}

DEBUG "Program Running!"

DO

PULSOUT 13, 850 PULSOUT 12, 650 PAUSE 20

LOOP

下面的理解非常重要。想一想:当电机安装在机器人底盘的两侧,一个顺时针旋转而另一个逆 时针旋转,将使机器人沿直线运动。听起来是否有些古怪?如果你无法理解,试试这样:

z 把两个电机背靠背放在一起重新运行程序。

该你了――调整速度和方向

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

z 试试下面的PULSOUT Duration组合,将结果填写到描述列。

表2-1 PULSOUT 指令的 Duration 参数组合

P13 P12 运动描述 实际运动行为

基础机器人制作与编程 850 650 全速,P13 电机逆时针,P12

电机顺时针 650 850 850 850 650 650 750 850 650 750

750 750 两个电机都静止,因为在任 务二中对电机进行了零点 调整

760 740 770 730 850 700 800 650

FOR…NEXT循环控制电机的运行时间

到目前为止,你已经完全理解了脉冲宽度控制连续旋转电机速度和方向的原理。控制电机速度 和方向的方法是非常简单的,当然也有一个简单的方法来控制电机运行的时间,那就是 用 FOR…NEXT循环。

下面是FOR…NEXT循环的例子,它会使电机运行几秒钟。

FOR counter = 1 TO 100 PULSOUT 13, 850 PAUSE 20

NEXT

你计算一下这段代码能使电机转动的确切时间。每执行循环一次,PULSOUT指令将持续1.7 ms,PAUSE指令持续20ms,执行一次循环大概额外需要1.3 ms,那么FOR…NEXT循环整体执行 一次的时间是:1.7 ms + 20 ms + 1.3 ms = 23.0 ms,本循环执行100次,即就是23.0 ms乘以100,时 间=100*23.0毫秒=100*0.023秒=2.3秒。

假如你要让电机运行4.6秒,FOR…NEXT循环必须执行上面两倍的次数。

FOR counter = 1 TO 200 PULSOUT 13, 850

PAUSE 20 NEXT

例程: ControlServoRunTimes.bs2

z 输入、保存并运行程序ControlServoRunTimes.bs2.

z 验证是否与P13 连接的电机首先逆时针旋转2.3秒,然后与P12 连接的电机旋转4.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.5}

基础机器人制作与编程

DEBUG "Program Running!"

counter VAR Byte

FOR counter = 1 TO 100 PULSOUT 13, 850

PAUSE 20 NEXT

FOR counter = 1 TO 200 PULSOUT 12, 850

PAUSE 20 NEXT

END

假如你想让两个电机同时都运行,给与P13连接的电机发出850的脉宽,给与P12连接的电机发 出650的脉宽,现在执行一次循环要用的时间是:

1.7ms – P13连接的电机 1.3ms – P12连接的电机 20 ms – 中断持续时间 1.6 ms – 代码执行时间

--- --- 一共是24.6 ms

如果你想使电机运行一段确定的时间,可以计算出需要循环的次数(或者说需要发出的脉冲数 量)如下:

脉冲数量=时间/0.0246秒=时间/0.0246 假如你想让电机运行3秒,计算如下:

脉冲数量=3 / 0.0246 = 122

现在,你可以将FOR…NEXT循环中EndValue的值设为122,程序如下:

FOR counter = 1 TO 122 PULSOUT 13, 850

PULSOUT 12, 650 PAUSE 20

NEXT

例程: BothServosThreeSeconds.bs2

下面的程序是让两个电机先向一个方向旋转3秒,然后反向旋转3秒钟的例子。

z 输入、保存并运行程序BothServosThreeSeconds.bs2。

' BothServosThreeSeconds.bs2

' Run both servos in opposite directions for three seconds, then reverse ' the direction of both servos and run another three seconds.

' {$STAMP BS2}

基础机器人制作与编程 ' {$PBASIC 2.5}

DEBUG "Program Running!"

counter VAR Byte

FOR counter = 1 TO 122 PULSOUT 13, 850

PULSOUT 12, 650 PAUSE 20

NEXT

FOR counter = 1 TO 122 PULSOUT 13, 650

PULSOUT 12, 850 PAUSE 20

NEXT

END

验证一下每个电机是否沿一个方向运行3秒然后反方向运行3秒。你是否注意到当电机同时反向 的时候,它们总是保持以相反的方向运行?这将有什么作用呢?

该你了 – 预计电机运行时间

z 设定一个你想让电机运行的时间。

z 用0.024除时间

z 所得到的结果就是你需要执行的循环次数。

z 更改程序BothServosThreeSeconds.bs2使两个电机都运行你所设定的时间。

z 比较预计的时间与实际运行的时间。

记住当做完实验后断开系统的电源。

在文檔中 基础机器人制作与编程 (頁 27-32)