65.9K
CodeProject 正在变化。 阅读更多。
Home

机器人/嵌入式系统 - 第三部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (18投票s)

2007年7月12日

CPOL

13分钟阅读

viewsIcon

79064

本文是关于嵌入式系统及其应用的系列文章的第三部分。它将使用BASIC Stamp II微控制器来创建一个简单的机器人。

文章系列

引言

这是旨在向读者介绍嵌入式系统及其应用世界的系列文章的第三部分。在机器人/嵌入式系统第一部分中,我介绍了嵌入式系统的基本概念。我举了当今汽车中存在的嵌入式系统应用的例子。我还简要介绍了可用于您的项目的不同类型的处理器技术:通用处理器、单用途处理器和应用专用处理器。在机器人/嵌入式系统第二部分中,我介绍了一款由Parallax制造的特定通用处理器。BASIC Stamp II微处理器系列得到了较长时间的介绍。然后,我选择了BASIC Stamp II e (BS2e)型号,并对其内存架构和一些基本命令进行了介绍。

机器人/嵌入式系统第三部分中,我将使用Basic Stamp II微控制器实际构建机器人。本文更多地是对机器人基本概念及其应用实践的介绍。那么,事不宜迟,我将开始本系列的第三部分。

背景

了解计算机体系结构和微控制器是本系列文章的加分项。我将讨论系统设计和微处理器的理论概念。此外,一旦我们开始机器人电路设计,一些基本的电子知识也会很有帮助。

项目概述

我将使用BASIC Stamp II来构建和编程机器人的某些基本功能。本文系列的目的是构建以下四种基本功能,即机器人内部的逻辑和电路。

  • 使用传感器感知周围的世界。
  • 根据感知到的信息做出决策。
  • 根据传感器及其决策控制其运动。
  • 将信息交换回给用户。

在下一节中,我将讨论硬件的组装和测试。

机器人的组装与测试

为了成功完成项目,设计和实现机器人需要以下硬件和软件。下表将列出所需的硬件。

硬件组件

数量

BASIC Stamp 2 微控制器模块

1

教育开发板 Rev C

1

1 KΩ 电阻

2

10 KΩ 电阻

2

2 KΩ 电阻

2

220 Ω 电阻

8

470 Ω 电阻

4

4.7 KΩ 电阻

2

0.01 µF 电容器

2

0.1 µF 电容器

2

红外 LED

2

红色 LED

2

光敏电阻 (EG&G Vactec VT935G group B)

2

红外接收器 (Panasonic PNA4602M 或同等产品)

2

红外 LED 的 LED 支架

2

红外 LED 的 LED 光罩

2

3 针插头

2

胡须线

2

#4 螺丝尼龙垫圈

2

7/8" 4-40 平头螺丝,十字

2

½" 间隔件,铝,#4 圆形

2

跳线 (10 条装)

2

压电扬声器

1

Boe-Bot 硬件包

1

我们还需要获取软件来编程BASIC Stamp II微控制器,以及USB驱动程序(如果使用USB)以便与教育开发板Rev C建立通信。下表列出了本项目所需的软件组件。

软件组件

BASIC Stamp Editor 2.0 或更高版本

FTDI USB VCP 驱动程序

连接硬件

我们首先要做的是将BASIC Stamp II微控制器放在教育开发板上的正确位置。这可以通过以下步骤完成:

  1. 将教育开发板上的3位开关设置到位置0。
  2. 将电池装入电池盒。
  3. 将BASIC Stamp II微控制器插入教育开发板,将其插入下图所示的插座中。

注意:在将微控制器插入插座之前,请确保引脚对齐正确。

在我们继续之前,我们应该测试并确保我们能够与BASIC Stamp II微控制器通信。如果您尚未安装BASIC Stamp Editor和FTDI USB VCP驱动程序,现在就是时候了。本文将不介绍软件的安装;应该很简单。运行BASIC Stamp Editor。在主菜单下,选择运行->识别…,将出现一个窗口,指示硬件是否被检测到。

如果您能够成功连接到硬件,您就可以用一个简单的程序测试微控制器。我们将要求微控制器向其连接的PC发送消息。下面是用于测试微控制器的程序列表:

' BASIC Stamp send a text message to the PC
' {$STAMP BS@}
' {$PBASIC 2.5}

DEBUG "Hello, this is Ed the robot!"

END

我们需要将程序传输到微控制器。为此,请在主菜单中选择运行->运行。或者,您也可以按Ctrl+R作为键盘快捷方式。在程序从PC传输到微控制器的过程中,将短暂出现一个下载窗口。程序传输完成后,您将在调试窗口中看到测试消息“Hello, this is Ed the Robot!”

测试程序解释

代码的前两行称为编译器指令,每个PBASIC程序都以它们开头。第一个指令称为Stamp指令,它告诉编辑器您将把程序下载到BASIC Stamp II微控制器。第二个指令称为PBASIC指令,它告诉编辑器我们使用的是PBASIC编程语言的2.5版本

DEBUG命令告诉BASIC Stamp微控制器通过串行电缆向PC发送消息。END命令在BASIC Stamp完成程序运行时将其置于低功耗模式。此时,微控制器等待按下复位按钮或将新程序加载到内存中。

机器人组装

您可以从Parallax下载完整的手册,其中提供了有关如何构建机器人的详细说明。在这里,我将以更简短、更快的方式介绍机器人的组装。也就是说,我不会过于详细!

将伺服电机安装到底盘上

安装电池组

安装车轮

将开发板连接到底盘

机器人组装好后,我们需要测试伺服电机。这将有助于我们确保一切正常工作。为了测试伺服电机,我们将使用以下程序,它将使伺服电机顺时针旋转3秒,逆时针旋转3秒。

' {$STAMP BS2}
' {$PBASIC 2.5}

DEBUG "Program Running!"

CounterVARWord

FOR counter = 1 to 122'Clockwise three seconds
    PULSOUT 12, 650
    PAUSE 20
NEXT

FOR counter = 1 to 40'Stop one second
    PULSOUT 12, 750
    PAUSE 20
NEXT

FOR counter = 1 to 122'Counterclockwise three seconds
    PULSOUT 12, 850
    PAUSE 20
NEXT

伺服电机的控制与编程

导航是任何机器人项目的核心目标。机器人需要根据其传感器和背后的逻辑在给定环境中导航。这通过PBASIC语言中的某些命令来完成,这些命令指示BASIC Stamp II微控制器如何控制伺服电机运动的方向、速度和持续时间。

Parallax连续旋转伺服电机是驱动机器人车轮转动的电机。控制伺服电机速度和方向涉及一个程序,该程序使BASIC Stamp II一遍又一遍地发送消息。为了保持伺服电机的速度和方向,消息必须每秒重复大约50次。在继续前进之前,我现在将描述一些将用于控制伺服电机的基本命令。稍后我们将更详细地讨论它们。

PAUSE命令用于告诉微控制器在执行下一个命令之前等待特定的毫秒数,即:PAUSE 1000将暂停1秒。DOLOOP命令用于告诉微控制器重复DOLOOP代码块之间的命令,直到满足某个条件,或者根据应用程序的需要永远重复。例如,以下代码将每秒发送一条消息。

DO
    DEBUG "Hello!", CR
    PAUSE 1000
LOOP

HIGHLOW命令可用于使BASIC Stamp在VddVss之间切换。引脚参数是一个介于015之间的数字,表示要连接到VddVss的I/O引脚,即:HIGH 0将指示微控制器将I/O引脚0设置为Vdd。同样,LOW 0将指示微控制器将I/O引脚0设置为Vss。下图说明了HIGHLOW命令。

DO
    HIGH 13
    PAUSE 1000
    LOW 13
LOOP

上面的代码将使连接到引脚13的LED每秒亮起和熄灭。

控制伺服电机

发送到BASIC Stamp II以发送伺服电机的信号必须精确持续很长时间。这是因为伺服电机将这些信号用作指令,指示它们转到哪个方向。为此,我们需要一个更精确的命令来控制时间。

PULSOUT命令可以精确地发送高信号。时间以百万分之二秒为单位。例如,您可以向P13(引脚13)发送一个信号,使LED亮起2µs,即:PULSOUT 13, 1PULSOUT 13, 65000相当于运行一个0.13秒的高信号。下图是高信号的时序图。

将伺服电机连接到教育开发板

我们首先要做的是将伺服电机连接到开发板。我们将使用微控制器的P13P12引脚向伺服电机发送信号。以下原理图说明了如何做到这一点。

下一步是实际校准伺服电机。我们需要编写一个程序,向伺服电机发送信号,指示它们保持静止。这个信号的程序将是一个PULSOUT命令和一个PAUSE命令,它们都包含在一个DO...LOOP中。下图是伺服电机校准的时序图。

从时序图可以看出,对于PAUSE命令,我们需要20ms的持续时间,即PAUSE 20。对于1.5ms,我们需要使用PULSOUT命令,例如:PULSOUT 12, 750。如何计算PULSOUT命令的持续时间?1.5毫秒是0.0015秒。请记住,PULSOUT命令持续时间参数中的任何数字都必须乘以2µs,即0.000002秒。

持续时间参数 = 脉冲持续时间 / 2 µs,即:0.0015s/0.000002s = 7500。

如果伺服电机已经校准,它将不会转动。如果未校准,您需要通过慢慢转动螺丝刀在电位器接入孔中进行调整。

测试伺服电机

当您向Parallax连续旋转伺服电机发送1.3毫秒的脉冲时,它将全速顺时针旋转。全速范围为50至60 RPM。

以下程序将执行我们所需的操作。

' {$STAMP BS2}
' {$PBASIC 2.5}

DEBUG "Program Running!"

DO
    PULSOUT 13, 650
    PAUSE 20
LOOP

850的持续时间将发送1.7毫秒的脉冲到伺服电机,并使其以全速逆时针旋转。

' {$STAMP BS2}
' {$PBASIC 2.5}

DEBUG "Program Running!"

DO
    PULSOUT 13, 850
    PAUSE 20
LOOP

控制伺服电机运行时

这是一个FOR...NEXT循环的示例,该循环将使伺服电机转动几秒钟。

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

每次循环,PULSOUT命令持续1.7毫秒。PAUSE命令持续20毫秒,循环执行大约需要1.3毫秒。因此,一次循环 = 1.7毫秒 + 20毫秒 + 1.3毫秒 = 23.0毫秒。由于循环执行100次,总时间为23毫秒 x 100 = 2.30秒。

在基本原理就位后,我们现在可以开始编程我们的机器人,使其能够在周围环境中导航。我们可以创建以下子程序,以帮助我们协调机器人与传感器的运动。在此,我将列出四种基本运动:前进、后退、左转和右转。

Forward:
FOR counter = 1 to 64
    PULSOUT 13, 850
    PULSOUT 12, 650
    PAUSE 20
NEXT
RETURN

Backward:
FOR counter = 1 to 64
    PULSOUT 13, 650
    PULSOUT 12, 850
    PAUSE 20
NEXT
RETURN

Left:
FOR counter = 1 to 24
    PULSOUT 13, 650
    PULSOUT 12, 650
    PAUSE 20
NEXT
RETURN

Right:
FOR counter = 1 to 24
    PULSOUT 13, 850
    PULSOUT 12, 850
    PAUSE 20
NEXT
RETURN

您也可以构建复杂的机动动作,但我不会在本文中介绍。

让机器人具备感知能力

胡须通过触觉赋予机器人感知周围世界的能力,就像蚂蚁的触角或猫的胡须一样。胡须还可以与其他传感器结合使用,使机器人更加智能。首先,我们需要根据原理图组装胡须。

在安装好胡须后,机器人的最终外观和感觉可能是这样的:

下一步是编程BASIC Stamp II微控制器以检测胡须何时被按下。连接到每个开关电路的I/O引脚监控10 kΩ上拉电阻上的电压。当胡须未被按下时,连接到该胡须的I/O引脚上的电压为5 V。当胡须被按下时,I/O线路被短接到地(Vss),因此I/O线路看到0 V。

以下程序是一个测试程序,它将在调试屏幕上报告胡须的状态。

DEBUG "WHISKER STATE", CR,
    "LEFTRIGHT", CR,
    "========"

DO
    DEBUG CRSRXY, 0 , 3,
        "P5 = ", BIN IN5,
        "P7 = ", BIN IN7
    PAUSE 50
LOOP

这里您会看到两个新命令:BINCRSRXYBIN命令是一个格式化程序,它告诉调试终端显示一个二进制数字,即10CRSRXY命令是一个格式化程序,它允许我们方便地在调试终端上排列信息。03分别表示终端光标的列和行。我还将一个LED连接到了电路。这样,当机器人未连接到终端时,我们就有了一个视觉指示器,可以知道哪个胡须被激活了。我们需要在电路中添加以下内容,并添加一些额外的代码行来适当地打开和关闭LED。

将以下代码添加到程序中以使其正常工作:

IF( IN7 = 0 ) THEN
    HIGH 1
ELSE
    LOW 1
ENDIF

IF( IN5 = 0 ) THEN
    HIGH 10
ELSE
    LOW 10
ENDIF

现在我们可以编写一个程序,让机器人在与胡须感应到的物体碰撞时具有一定的智能。一旦检测到物体,我们将使用本文导航部分中定义的子程序来执行正确的移动。我将在下面概述程序的主体部分。

IF (IN5 = 0) AND (IN7 = 0) THEN
    GOSUB Back_Up ' Both whiskers detect obstacle,
    GOSUB Turn_Left ' back up & U-turn (left twice)
    GOSUB Turn_Left
ELSEIF (IN5 = 0) THEN ' Left whisker contacts
    GOSUB Back_Up ' Back up & turn right
    GOSUB Turn_Right
ELSEIF (IN7 = 0) THEN ' Right whisker contacts
    GOSUB Back_Up ' Back up & turn left
    GOSUB Turn_Left
ELSE ' Both whiskers 1, no contacts
    GOSUB Forward_Pulse ' Apply a forward pulse &
ENDIF ' check again

如果两个胡须都按下,则执行U型转弯。如果左侧胡须被按下,我们将后退并向右转。如果右侧胡须被按下,我们将后退并向左转。此代码唯一没有涵盖的是角落的发生。为此,我们需要编写额外的代码。

用于角落检测的完整源代码可在以下部分找到。简而言之:我们分配了两个变量来存储胡须的旧值。这将允许我们将胡须与其先前的值进行比较。如果机器人在短时间内四次撞到墙壁,那么有一个计数器将调用逻辑来使机器人后退并进行180度转弯。然后它将继续沿新路径前进。

胡须导航的源代码列表

' TestWhiskers.bs2
' Display what the I/O pins connected to the whiskers sense
' {$STAMP BS2}
' {$PBASIC 2.5}

DEBUG "Program Running!", CR
DEBUG "WHISKERSTATES", CR,
    "LeftRight", CR,
    "====== ======="

pulseCountVARByte'for..next loop
counterVARNib
old7VARBit
old5VARBit
FREQOUT 4, 2000, 3000'begining of the program
counter = 1
old7 = 0
old5 = 1

DO
    DEBUG CRSRXY, 0, 3,
        "P5 = ", BIN1 IN5,
        "P7 = ", BIN1 IN7
    PAUSE 50

    ' this condition is set for corner detection, if hit more then 4 times
    ' backup, turn 180 degrees and continue
    IF( IN7 <> IN5 ) THEN
        IF( old7 <> IN7 ) AND ( old5 <> IN5 ) THEN
            counter = counter + 1
            old7 = IN7
            old5 = IN5
            IF( counter > 4 ) THEN
                counter = 1
                GOSUB Back_up
                GOSUB Turn_Left
                GOSUB Turn_Left
            ENDIF
        ELSE
            counter = 1
        ENDIF
    ENDIF

    ' servo control based on whisker condition
    ' if both whiskers are activated, go back
    IF( IN5 = 0 ) AND ( IN7 = 0 ) THEN
        HIGH 1
        HIGH 10
        GOSUB Back_Up
        GOSUB Turn_Left
        GOSUB Turn_Left
    ELSEIF ( IN5 = 0 ) THEN ' right whisker activated
        HIGH 10
        GOSUB Back_Up
        GOSUB Turn_Right
    ELSEIF ( IN7 = 0 ) THEN' left whisker activated
        HIGH 1
        GOSUB Back_Up
        GOSUB Turn_Left
    ELSE ' nothing detected, go forward
        LOW 10
        LOW 1
        GOSUB Forward_Pulse
    ENDIF

    LOOP

    Navigation: 
    ' my new implementation
    FOR counter = 1 TO pulseCount
        PULSOUT 12, pulseRight
        PULSOUT 13, pulseLeft
        PAUSE 20
    NEXT
    PAUSE 200
    RETURN

    Forward_Pulse: ' send a single forward pulse
    PULSOUT 12, 850
    PULSOUT 13, 650
    PAUSE 20
    RETURN

    Turn_Left:
    FOR pulseCount = 0 TO 20' left turn, about 90-degrees
        PULSOUT 12, 650
        PULSOUT 13, 650
        PAUSE 20
    NEXT
    RETURN

    Turn_Right:
    FOR pulseCount = 0 TO 20
        PULSOUT 12, 850
        PULSOUT 13, 850
        PAUSE 20
    NEXT
    RETURN

    Back_Up:
    FOR pulseCount = 0 TO 40
        PULSOUT 12, 650
        PULSOUT 13, 850
        PAUSE 20
    NEXT
    RETURN

END

关注点

在本文中,我介绍了Parallax机器人(Boe-Bot)的组装,并介绍了一些微控制器基本编程。我还讨论了使用简单传感器输入,使机器人能够感知周围环境。这已通过所谓的“触须战术导航”来实现。您可以使用更高级的传感器,如光敏电阻、红外和距离检测传感器,使机器人对其周围环境更加智能。我将在本文系列的第四部分介绍这些高级传感器。一旦您组装和设置了伺服电机,并且掌握了机器人的导航和逻辑,添加和修改传感器将非常容易。

希望您喜欢本系列的第三部分,并欢迎给我发送您的评论和反馈。

历史

  • 2007年7月12日 - 发布原稿
© . All rights reserved.