1、1目 录1 前言 .12 总体方案设计 .33 安卓操作系统简介 .53.1 安卓操作系统发展 .53.2 安卓开发与建立 .53.3 安卓的应用程序分析 .63.4 安卓的蓝牙开发技术 .73.5 安卓平台的蓝牙编程 .74 系统软件程序设计 .124.1C 语言编程环境介绍: .124.2 各模块的编程 .135 系统调试 .205.1C 语言的调试 .205.2JAVA 语言的调试 .236 总结与体会 .257 谢辞 .268 参考文献 .27附录:程序: .27第 0 页第 1 章 前言(绪论)1.1 智能小车的意义和作用 随着科学技术的发展,机器人开始出现在人们的视野中,机器人的研
2、究一直是科学家们热衷的事,并努力把机器人运用到生活的方方面面。目前机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。随着科学技术的发展,机器人的感觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。视觉的典型应用领域为自主式智能导航系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。视觉传感器的核心器件是摄像管或 CCD,目前的 CCD
3、 已能做到自动聚焦。但 CCD 传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是一种实用有效的方法。机器人要实现自动导引功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。避障控制系统是基于自动导引小车(AVG auto-guide vehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。使用传感器感知路线和障碍并作出判断和相应的执行动作。该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、执行部分、CPU。机器人要实现自动避障功能,还可以扩展循迹
4、等功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。单片机驱动直流电机一般不占用单片机资源,直接选择有PWM功能的单片机,这可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。考虑到实际情况,CPU使用STC89C52单片机,配合软件编程实现。第 1 页1.2智能小车的现状随着计算机和
5、控制技术的发展,智能移动小车在很多行业都有实质成果。工作的环境也从很单纯的室内环境发展成了各种复杂环境,如地面,水下,太空等等。在小车的功能发面,越来越多的新功能被小车所运用,如实现循迹、避障、检测贴片、寻光入库、避崖,拍摄,远程传输信号等等。国内智能车辆研究现状 相比于国外,我国开展智能车辆技术方面的研究起步较晚,开始于20世纪80年代。而且大多数研究处在于针对某个单项技术研究的阶段。虽然我国在智能车辆技术方面的研究总体上落后于发达国家,并且存在一定得技术差距,但是我们也取得了一系列的成果,主要有: (1)中国第一汽车集团公司和国防科技大学机电工程与自动化学院与2003年研制成功我国第一辆自
6、主驾驶轿车。该自主驾驶轿车在正常交通情况下的高速公路上,行驶的最高稳定速度为13km/h,最高峰值速度达170km/h,并且具有超车功能,其总体技术性能和指标已经达到世界先进水平。 (2)南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合研制了7B.8军用室外自主车,该车装有彩色摄像机、激光雷达、陀螺惯导定位等传感器。计算机系统采用两台Sun10完成信息融合、路径规划,两台PC486完成路边抽取识别和激光信息处理,8098单片机完成定位计算和车辆自动驾驶。其体系结构以水平式结构为主,采用传统的“感知-建模-规划-执行”算法,其直线跟踪速度达到20km/h,避障速度达到5
7、-10km/h。 智能车辆研究也是智能交通系统ITS的关键技术。目前,国内的许多高校和科研院所都在进行ITS关键技术、设备的研究。随着ITS研究的兴起,我国已形成一支ITS技术研究开发的技术专业队伍。并且各交通、汽车企业越来越加大了对ITS及智能车辆技术研发的投入,整个社会的关注程度在不断提高。交通部已将ITS研究列入“十五”科技发展计划和2010年长期规划。相信经过相关领域的共同努力,我国ITS及智能车辆的技术水平一定会得到很大提高。 可以预计,我国飞速发展的经济实力将为智能车辆的研究提供一个更加广阔的前景。我们要结合我国国情,在某一方面或某些方面,对智能车进行深入细致的研究,为它今后的发展
8、及实际应用打下坚实的基础。第 2 页第 2 章 总体方案设计 根据要求,确定如下方案:在现有玩具电动车的基础上,加装红外对光管,超声波收发传感器,实现对电动车的速度、位置、运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。同时。加装的蓝牙模块,可以辅助控制小车,当小车的循迹出现故障,或者需要手动控制小车实现某种功能时,可以使用手机上的安卓软件,发出控制信号给蓝牙,蓝牙接收后传给小车,实现对小车的控制。这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求总体方案框图Stc89c52循迹红外对管时钟
9、电路复位电路蓝牙模块电机驱动超声波红外避障第 3 页循迹模块;用两只红外对管,分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好两只光电开关的位置就可以很好的实现循迹的功能避障模块;用超声波避障,声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差 T,然后求出距离L=CT。超 声 波 发 射 器 向 某 一 方 向 发 射 超 声 波 , 在 发 射 时 刻 的 同 时 开 始 计 时 ,超 声 波 在 空 气 中 传 播 , 途 中 碰 到 障 碍 物 就 立 即 返 回 来 , 超 声
10、 波 接 收 器 收 到 反射 波 就 立 即 停 止 计 时 。 然 后 通 过 一 定 的 电 路 把 数 据 传 给 单 片 机 , 单 片 机 通 过和 障 碍 物 间 的 距 离 来 决 定 小 车 是 否 需 要 调 整 前 进 方 向 。电源模块;采用 2 支 18650 锂电池电源供电,电源电压足够小车和单片机的运行,可以很好的实现功能,锂电池还可以充电,可以多次使用。无线模块;用的无线模块是当今社会上便携式设备中普遍具有的蓝牙无线模块,该模块性能稳定,传输速率快,稳定可靠,传输距离可观。该芯片使用简单,具有通用的串行通信端口,在市场中具有较高的知名度,且蓝牙技术发展前景良好,
11、广受客户的好评。该设备最大的优点是无需制作专门的遥控器,可直接通过手机上的蓝牙设备发送相关的指令,操作方便快捷,界面人性化设计,具有良好的人机对话界面第 4 页第 3 章 安卓操作系统的简介3.1 安卓操作系统的发展在 20007 年 11 月 12 日,开放手机联盟发布 google android sdk,android 作为一个系统,是一个运行在 LINUX2.6 核心上的 Java 基础的操作系统。系统是非常轻量。Android 应用程序用 Java 开发而且很容易被放置到新的平台上。在此同时,谷歌也宣布建立一个全球性质的联盟,这个组织由许多家手机的制造,软件的开发商,芯片制造商,运营
12、这些产品的销售商组成。这一联盟将致力于谷歌发布手机操作系统的开发以及它所涉及的应用软件的开发, 3.2 安卓开发建立一、 Android 平台所具有的特点1 开放性,Android 从底层被构建,使开发者可以创造隐忍注意的手机应用程序并且能够充分利用所有的付费的手机,它是真正的被构建成开放的。例如,一个应用程序可以调用任一手机的核心功能,打短信,打电话等等。它允许开发者为使用者创造平台使其有身临其境的体验。2 所有的平台都是平等建立的,打破了应用程序局限,Android 打破创建新的,创新的应用程序的局限,例如,开发者可以让个人手机上的数据和网站上的数据连接在一起,如用户的联系人,日历,位置提
13、供了一个很有意义的用户体验,开发者可以创建一个应用程序,这个程序可以使用户看到他们朋友的位置和改变后的位置,如果发现他们就在附近,就可以马上和他们联系了。3,快速并且简单的应用程序的开发。Android 提供了宽范围的有用类库和工具,用这些可以创建丰富的应用程序,例如 Android 使开发者可以获得设备的地理位置,并允许设备通过同类对同类的方式和其他设备通信,另外 Android 包括一套完整的工具,这些工具提供开发者高度的生产力和深度探究他们的应用程序4。Google 应用;互联网上的谷歌已经有多年的历史了,从开始的只是搜索岛现在各个方面的渗透,如谷歌地图,邮件等等,谷歌的这些服务已经成为
14、联系用户和互联网的重要关系纽带,安卓平台的手机都可以完美的结合这些优秀的第 5 页服务。3.3Android 应用程序的分析对于一个 Android 应用程序有四种部分构成;1 activity2intent receiver3service4content provider不是每一个的应用程序都需要这四个部分,但是应用程序将会用这些来组合编写。一但决定了应用程序所需要的组件,就需要在一个叫 Android manifest.xml 文件中列出他们,这是一个 XML 文件,在里面需要声明应用程序的组件和他们的功能需求。Activity 是 Android 最普通的构建模块,它通常在应用程序中是
15、一个单独的屏幕。每一个 activity 是被实现作为一个继承于 activity 基类的单独的类。例如;一个文本消息发送程序可能有一个显示要发送信息的屏幕,有一个显示给选中要发送的联系人的屏幕。每一个这些屏幕都会被一个 activity 实现。Android 使用一个叫做 intent 的特殊类来让应用程序从一个屏动到另外一个屏幕。Intent 描述了一个应用程序想要干什么。Intent 数据结构的两个最重要的部分是;要响应的 action 和 data。典型的 action 值是 MAIN,VIEW,PICK,EDIT,等等,data表示成一个统一资源定界符。Intent receiver
16、 当你想要在你的应用程序中编码来执行对外部事件的响应,你可以使用一个 intent receiver.例如当电话响铃,或当数据网络可用时,或当午夜时,虽然 intent receiver 不显示一个 UI,但它们也许会显示一个来通知和提醒用户是否有令人感兴趣的事件发生。intent receiver 也是在 Android manifest.XML 中被注册,但你也可以在代码中使用 context.register receiver()来注册它们,它的 intent receiver 被调用时,你的程序不是非得运行;假如必要时,当一个 intent receiver 被触发时,系统将会调用你的
17、应用程序。Service;一个 service 是长期存活并且运行时不带 UI 的编码,例如,当在音乐播放器中播放歌曲时,可能在这个播放器中能有一个或者更多的 activity,这些activity 允许用户选择歌曲和开始播放歌曲。然而,音乐回放本身不应该被一个activity 处理,因为用户将期望在导航到一个新的屏幕后音乐保持播放。Content provider 应用程序可以把他们的数据存储到文件中,一个 SQLite 数据库中,设置中,或者是任何其他的有意义结构中。如果你想要你的应用程序的数据和其他应用程序共享,一个 content provider 是有用的。一个 content 第
18、6 页provider 是一个类,它实现了方法的一个标准设置来让其他应用程序存储和恢复被 content provider 处理的数据类型。3.4Android 蓝 牙 开 发 技 术在 两 个 不 同 设 备 上 的 应 用 之 间 建 立 一 条 完 整 的 通 信 道 路 , 并 在 他 们 之 间 保 持 一 通信 段 , RFCOMM 是 一 个 简 单 传 输 协 议 , 它 的 目 的 是 针 对 如 何 在 两 个 不 同 设 备 上 的应 用 上 保 证 一 条 完 整 的 通 信 道 路 , 并 保 持 一 通 信 段 。 RFCOMM 是 为 了 兼 容 传 统 的串 口
19、 应 用 , 同 时 取 代 有 线 的 通 信 方 式 , 蓝 牙 协 议 栈 需 要 提 供 与 有 线 串 口 一 致 的 通信 接 口 而 开 发 出 的 协 议 。MAC 地 址 是 烧 录 在 网 卡 里 的 .MAC 地 址 ,也 叫 硬 件 地 址 ,是 由 48 比 特 长 (6 字 节 ),16 进 制 的 数 字 组 成 .0-23 位 叫 做 组 织 唯 一 标 志 符 (organizationally unique, 是 识 别 LAN(局 域 网 )节 点 的 标 识 .24-47 位 是 由 厂 家 自 己 分 配 。 在 网 络 底 层 的 物 理 传 输 过
20、程 中 , 是 通 过 物 理 地 址 来 识 别 主 机 的 , 它 一 般 也 是 全 球 唯 一 的 。 MAC 地 址 就 如 同我 们 身 份 证 上 的 身 份 证 号 码 。步 骤 一 : Setting Up Bluetooth 通 过 BluetoothAdapter 得 到 蓝 牙 的 Activity 发 送 蓝 牙 连 接 意 图 通 过 e onActivityResult()得 到 蓝 牙 连 接 意 图 。步 骤 二 : Finding Devices 通 过 得 到 开 启 蓝 牙 用 户 名 和 MAC 地 址 配 对 蓝 牙 。步 骤 三 : 连 接 蓝 牙
21、 就 像 java 的 聊 天 系 统 一 样 用 一 个 蓝 牙 手 机 当 服 务 器 , 一 个当 客 户 端 , 在 用 一 个 类 当 做 连 接 的 管 理 类 就 行 了 。 3.5 android 平 台 蓝 牙 编 程 Android 平 台 支 持 蓝 牙 网 络 协 议 栈 , 实 现 蓝 牙 设 备 之 间 数 据 的 无 线 传 输 。 蓝 牙 设备 之 间 的 通 信 主 要 包 括 了 四 个 步 骤 : 设 置 蓝 牙 设 备 、 寻 找 局 域 网 内 可 能 或 者 匹 配的 设 备 、 连 接 设 备 和 设 备 之 间 的 数 据 传 输 。以 下 是
22、建 立 蓝 牙 连 接 的 所 需 要 的 一 些 基 本 类 :第 7 页BluetoothDevice 类代 表 了 一 个 远 端 的 蓝 牙 设 备 , 使 用 它 请 求 远 端 蓝 牙 设 备 连 接 或 者 获 取 远 端 蓝 牙 设 备 的 名 称 、 地 址 、 种 类 和 绑 定 状 态 。Bluetoothsocket 类代 表 了 一 个 蓝 牙 套 接 字 的 接 口 ( 类 似 于 tcp 中 的 套 接 字 ) , 他 是 应 用 程 序 通 过 输 入 、 输 出 流 与 其 他 蓝 牙 设 备 通 信 的 连 接 点 。Blueboothserversocke
23、t 类代 表 打 开 服 务 连 接 来 监 听 可 能 到 来 的 连 接 请 求 ( 属 于 server 端 ) , 为 了 连 接 两 个 蓝 牙 设 备 必 须 有 一 个 设 备 作为 服 务 器 打 开 一 个 服 务 套 接 字 。 当 远 端 设 备 发 起 连 接连接请求的时候,并且已经连接到了的时候,Blueboothserversocket 类将会返回一个 bluetoothsocket。 Bluetoothclass 类描 述 了 一 个 蓝 牙 设 备 的 一 般 特 点 和 能 力 。 他 的 只 读 属 性 集 定 义 了 设 备 的 主 、 次 设 备 类 和
24、 一 些 相 关 服 务 。 然 而 , 他 并 没 有 准 确 的 描 述 所 有 该设 备 所 支 持 的 蓝 牙 文 件 和 服 务 , 而 是 作 为 对 设 备 种 类 来 说 的 一 个 小 小暗 示 。BluetoothAdapter 类代 表 了 一 个 本 地 的 蓝 牙 适 配 器 。 他 是 所 有 蓝 牙 交 互 的 的 入 口 点 。 利 用 它 你 可 以 发 现 其 他 蓝 牙 设 备 , 查 询 绑 定 了 的 设 备 , 使 用 已 知 的 MAC 地 址 实 例 化 一 个 蓝 牙 设 备 和 建 立 一 个 BluetoothServerSocket( 作
25、 为 服 务 器 端 ) 来 监 听 来 自 其他 设 备 的 连 接 。应 用 程 序 里 启 动 蓝 牙 功 能 , 首 先 通 过 调 用 静 态 方 法 getDefaultAdapter()获 取 蓝 牙 适配 器 bluetoothadapter, 以 后 你 就 可 以 使 用 该 对 象 了 。 如 果 返 回 为 空 , the story is over。 其 次 , 调 用 isEnabled()来 查 询 当 前 蓝 牙 设 备 的 状 态 , 如 果 返 回 为 false, 则表 示 蓝 牙 设 备 没 有 开 启 , 接 下 来 你 需 要 封 装 一 个 ACT
26、ION_REQUEST_ENABLE 请 求 到 intent 里 面 , 调 用 startActivityForResult()方 法 使 能 蓝 牙 设 备 。查 找 设 备 : 使 用 bluetoothadapter 类 里 的 方 法 , 你 可 以 查 找 远 端 设 备 , 在 这 次 的设 计 中 , 蓝 牙 MAC 地 址 确 定 , 利 用 个 信 息 , 就 可 以 选 择 初 始 化 一 个 连 接 , 当 设备 配 对 好 之 后 , MAC会 被 保 存 下 来 并 可 以 使 用 蓝 牙 的 API 来 读 取 , 使 用 已 知 的 MAC 地 址 就 可 以
27、 对 远 端 的 蓝 牙 设 备 发 起 连 接 请 求 。客 户 端 的 连 接 : 为 了 初 始 化 一 个 与 远 端 设 备 的 连 接 , 需 要 先 获 取 代 表 该 设 备 的 一 个 bluetoothdevice 对 象 。 通 过 bluetoothdevice 对 象 来 获 取 bluetoothsocket 并 初 始 化第 8 页连 接 : 具 体 步 骤 : 使 用 bluetoothdevice 对 象 里 的 方 法 createRfcommSocketToServiceRecord(UUID)来 获 取 bluetoothsocket。 UUID 就 是匹 配 码 。 然 后 , 调 用 connect( ) 方 法 来 。 如 果 远 端 设 备 接 收 了 该 连 接 , 他 们 将 在 通 信 过 程 中 共 享 RFFCOMM 信 道 , 并 且 connect( ) 方 法 返回 。安 卓 的 系 统 构 架Androi d总 共 分 为 了 四 个 层 , 这 四 个 层 分 别 是 应 用 程 序 层 、 应 用 程 序 框 架 层 、 系统 运 行 库 层 和 Linux内 核 层 9