物联网系统课程设计..

物联网系统课程设计..
物联网系统课程设计..

,

物联网系统课程设计

学系名称:物联网工程

班级名称:物联网工程 2 班

学生姓名:朱泓锦

指导教师:肖迎元助教:

二零一六年十月

;

摘要

$

智能车辆是集环境感知、规划决策、多等级辅助驾驶等功能于一体的综合系统,是智能交通系统的一个重要组成部分。它在军事、民用、太空开发等领域有着广泛的应用前景。随着电子工业的发展,智能技术广泛运用于各种领域,运用于智能家居中的产品更是越来越受到人们的青睐。

以arduino程序和蓝牙模组,app为基础,是蓝牙模组,arduino小车和手机之间信息交互的关键。本课题所研究的物联网应用系统以arduino 程序为核心,利用蓝牙模组,arduino小车和app等实现基本功能。

基本功能:利用蓝牙模组和app之间的信息交互,控制小车的移动,从而达到无线控制的效果

注:仅能实现小车的基本操作

关键词:arduino程序,arduino小车,app,蓝牙模组

1 绪论

随着科技进步,现代工业技术发展越来越体现出机电一体化的特征。无论是在金属加工、汽车技术、工业生产等等方面,机器设备表现了所谓智能化、集成化、小型化、高精度化的发展趋势。

选题背景

'

随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。可见其研究意义很大。本设计就是在这样的背景下提出的,指导教师已经有充分的准备。本题目是结合科研项目而确定的设计类课题。设计的智能电动小车应该能够实现适应能力,能自动避障,可以智能规划路径。

智能化作为现代社会的新产物,是以后的发展方向,他可以按照预先设定的模式在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或是更高的目标。同遥控小车不同,遥控小车需要人为控制转向、启停和进退,比较先进的遥控车还能控制器速度。常见的模型小车,都属于这类遥控车;智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无需人工干预。操作员可以通过修改智能小车的计算机程序来改变它的行驶方向。因此,智能小车具有再编程的特性,是机器人的一种。

中国自1978年把“智能模拟”作为国家科学技术发展规划的主要研究课题,开始着力研究智能化。从概念的引进到实验室研究的实现,再到现在高端领域(航天航空、军事、勘探等)的应用,这一过程为智能化的全面发展奠定基石。智能化全面的发展是实现其对资源的合理充分利用,以尽可能少的投入得到最大的收益,大大提高工业生产的效率,实现现有工业生产水平从自动化向智能化升级,实现当今智能化发展由高端向大众普及。从先前的模拟电路设计,到数字电路设计,再到现在的集成芯片的应用,各种能实现同样功能的元件越来越小为智能化产物的生成奠定了良好的物质基础。

智能小车,是一个集环境感知、规划决策,自动行驶等功能于一体的综合系统,它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型的高新技术综合体。

智能小车研究现状

智能车辆作为智能交通系统的关键技术,是许多高新技术综合集成的载体。智能车辆驾驶是一种通用性术语,指全部或部分完成一项或多项驾驶任务的综合车辆技术。智能车辆的一个基本特征是在一定道路条件下实现全部或者部分的自动驾驶功能,下面简单介绍一下国内外智能小车研究的发展情况。

1.2.1 国外智能车辆研究现状

国外智能车辆的研究历史较长,始于上世纪50年代。它的发展历程大体可以分成三个阶段:

)

第一阶段 20世纪50年代是智能车辆研究的初始阶段。1954年美国Barrett Electronics 公司研究开发了世界上第一台自主引导车系统AGVS(Automated Guided Vehicle System)。该系统只是一个运行在固定线路上的拖车式运货平台,但它却具有了智能车辆最基本得特征即无人驾驶。早期研制AGVS的目的是为了提高仓库运输的自动化水平,应用领域仅局限于仓库内的物品运输。随着计算机的应用和传感技术的发展,智能车辆的研究不断得到新的发展。

第二阶段从80年代中后期开始,世界主要发达国家对智能车辆开展了卓有成效的研究。在欧洲,普罗米修斯项目于1986年开始了在这个领域的探索。在美洲,美国于1995年成立了国家自动高速公路系统联盟(NAHSC),其目标之一就是研究发展智能车辆的可能性,并促进智能车辆技术进入实用化。在亚洲,日本于1996年成立了高速公路先进巡航/辅助驾驶研究会,主要目的是研究自动车辆导航的方法,促进日本智能

车辆技术的整体进步。进入80年代中期,设计和制造智能车辆的浪潮席卷全世界,一大批世界著名的公司开始研制智能车辆平台。

第三阶段从90年代开始,智能车辆进入了深入、系统、大规模研究阶段。最为突出的是,美国卡内基.梅隆大学(Carnegie Mellon University)机器人研究所一共完成了Navlab系列的10台自主车(Navlab1—Navlab10)的研究,取得了显著的成就。

目前,智能车辆的发展正处于第三阶段。这一阶段的研究成果代表了当前国外智能车辆的主要发展方向。在世界科学界和工业设计界中,众多的研究机构研发的智能车辆具有代表性的有:

德意志联邦大学的研究1985年,第一辆VaMoRs智能原型车辆在户外高速公路上以100km/h的速度进行了测试,它使用了机器视觉来保证横向和纵向的车辆控制。1988年,在都灵的PROMRTHEUS项目第一次委员会会议上,智能车辆维塔(VITA,7t)进行了展示,该车可以自动停车、行进,并可以向后车传送相关驾驶信息。这两种车辆都配备了UBM视觉系统。这是一个双目视觉系统,具有极高的稳定性。

荷兰鹿特丹港口的研究智能车辆的研究主要体现在工厂货物的运输。荷兰的Combi road系统,采用无人驾驶的车辆来往返运输货物,它行驶的路面上采用了磁性导航参照物,并利用一个光阵列传感器去探测障碍。荷兰南部目前正在讨论工业上利用这种系统的问题,政府正考虑已有的高速公路新建一条专用的车道,采用这种系统将货物从鹿特丹运往各地。

日本大阪大学的研究大阪大学的Shirai实验室所研制的智能小车,采用了航位推测系统(Dead Reckoning System),分别利用旋转编码器和电位计来获取智能小车的转向角,从而完成了智能小车的定位。

另外,斯特拉斯堡实验中心、英国国防部门的研究、美国卡内基梅隆大学、奔驰公司、美国麻省理工学院、韩国理工大学对智能车辆也有较多的研究。

1.2.2 国内智能车辆研究现状

相比于国外,我国开展智能车辆技术方面的研究起步较晚,开始于20世纪80年代。而且大多数研究处在于针对某个单项技术研究的阶段。虽然我国在智能车辆技术方面的研究总体上落后于发达国家,并且存在一定得技术差距,但是我们也取得了一系列的成果,主要有:

(1)中国第一汽车集团公司和国防科技大学机电工程与自动化学院与2003年研制

成功我国第一辆自主驾驶轿车。该自主驾驶轿车在正常交通情况下的高速公路上,行驶的最高稳定速度为13km/h,最高峰值速度达170km/h,并且具有超车功能,其总体技术性能和指标已经达到世界先进水平。

(2)南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合研制了军用室外自主车,该车装有彩色摄像机、激光雷达、陀螺惯导定位等传感器。计算机系统采用两台Sun10完成信息融合、路径规划,两台PC486完成路边抽取识别和激光信息处理,8098单片机完成定位计算和车辆自动驾驶。其体系结构以水平式结构为主,采用传统的“感知-建模-规划-执行”算法,其直线跟踪速度达到20km/h,避障速度达到5-10km/h。

智能车辆研究也是智能交通系统ITS的关键技术。目前,国内的许多高校和科研院所都在进行ITS关键技术、设备的研究。随着ITS研究的兴起,我国已形成一支ITS技术研究开发的技术专业队伍。并且各交通、汽车企业越来越加大了对ITS及智能车辆技术研发的投入,整个社会的关注程度在不断提高。交通部已将ITS研究列入“十五”科技发展计划和2010年长期规划。相信经过相关领域的共同努力,我国ITS及智能车辆的技术水平一定会得到很大提高。

可以预计,我国飞速发展的经济实力将为智能车辆的研究提供一个更加广阔的前景。我们要结合我国国情,在某一方面或某些方面,对智能车进行深入细致的研究,为它今后的发展及实际应用打下坚实的基础。

课题主要内容

本课题南京嵌入之梦工作室的fira智能小车平台,选择通用、价廉的Arduino单片机为控制平台,通过细化设计要求,结合传感器技术和电机控制技术相关知识实现小车的各种功能。实现小车的前进倒退、转向行驶,达到设计目标。

2 智能小车总体结构

方案综述

本设计以两直流电动机为主驱动,通过各类传感器件来采集各类信息,送入主控单元Arduino单片机处理数据后完成相应动作,以达到自身控制。电机驱动电路采用H桥驱动模块,驱动2个直流电机;最后由控制单元处理数据后通过编程有序合理的将各模块信号整合在一起并完成相应动作,实现了智能控制,相当于简易机器人。

根据设计的作品要达到的效果,本系统以Arduino单片机为核心控制器,主要由电源模块、电机驱动模块、构成。系统的结构框图如下图1所示。

图系统结构框图

主控单元方案比较与选择

按照题目要求,控制器主要用于控制电机,通过相关传感器对路面的轨迹信息进行处理,并将处理信号传输给控制器,然后控制器做出相应的处理,实现小车的自动循迹和自动避障。

方案一:可以采用ARM为系统的控制器,优点是该系统功能强大,片上外设集成度搞密度高,提高了稳定性,系统的处理速度也很高,适合作为大规模实时系统的控制核心。

方案二:采用Arduino单片机作为系统控制的方案。Arduino单片机算术运算功能强,软件编程灵活、自由度大,功耗低、体积小、技术成熟,成本也比ARM低。

@

考虑到性价比问题,本设计选择用Arduino单片机做控制器。

“小车”的必要的信息步进电机参数:

步进电机技术要求:

;

步进电机示例图:

智能小车底盘参考电路图:

,

蓝牙模块:

3智能小车的大脑

这是学习单片机应用的平台,而单片机的种类众多,除了流行的 8位机:51、AVR、PIC系列,还有日渐被接受的 16位机 MSP430系列,以及最近升势很猛的

ARM Cortex‐M系列,这些单片机各有优势,无法说谁好谁坏,完全取决于学习者的需求和喜好,此外还有越来越接近 MCU的DSP,所以我将这个权力交还给用户。而且我认为:所谓单片机应用学习,最核心的就是能自己消化一个 MCU,根据控制需求自己分配 MCU 的资源,编写相应的程序,使之能按自己的想法工作。这才是掌握单片机应用的关键!

Arduino单片机简介

Arduino单片机,是一块基于开放源代码的USB接口Simple i/o接口板(包括12通道数字GPIO,4通道PWM输出,6-8通道10bit ADC输入通道),并且具有使用类似Java,C语言的IDE集成开发环境。

让您可以快速使用Arduino语言与Flash或Processing…等软件,作出互动作品。

Arduino可以使用开发完成的电子元件例如Switch或sensors或其他控制器、LED、步进马达或其他输出装置。Arduino也可以独立运作成为一个可以跟软件沟通的接口,例如说:flash、processing、Max/MSP、VVVV 或其他互动软件…。Arduino开发IDE

接口基于开放源代码原,可以让您免费下载使用开发出更多令人惊艳的互动作品。

Arduino单片机特色:

1、开放源代码的电路图设计,程序开发接口免费下载,也可依需求自己修改。

2、使用低价格的微处理控制器(ATMEGA8或ATmega128)。可以采用USB接口供电,不需外接电源。也可以使用外部9VDC输入

3、Arduino支持ISP在线烧,可以将新的“bootloader”固件烧入ATmega8或ATmega128芯片。有了bootloader之后,可以通过串口或者USB to Rs232线更新固件。

4、可依据官方提供的Eagle格式PCB和SCH电路图,简化Arduino模组,完成独立运作的微处理控制。可简单地与传感器,各式各样的电子元件连接(EX:红外线,超音波,热敏电阻,光敏电阻,伺服马达,…等)

5、支持多种互动程序,如:Flash、Max/Msp、VVVV、PD、C、Processing等

?

6、应用方面,利用Arduino,突破以往只能使用鼠标,键盘,CCD等输入的装置的互动内容,可以更简单地达成单人或多人游戏互动。

Arduino单片机引脚简介

Arduino的数字I/O被分成两个部分,其中每个部分都包含有6个可用的I/O管脚,即管脚2到管脚7和管脚8到管脚13。在数字电路中开关(switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。Arduino从数字I/O管脚上只能读出高电平(5V)或者低电平(0V),因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上/下拉电阻,按照电路的不同通常又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种。

A rduino的优势在于对数字信号的识别和处理,但我们所生活的真实世界并不是数字(digital)化的,简单到只要用0和1就能够表示所有的现象。例如温度这一我们已经司空见惯的概念,它只能在一个范围之内连续变化,而不可能发生像从0到1这样

的瞬时跳变,类似这样的物理量被人们称为是模拟(analog)的。Arduino是无法理解这些模拟量的,它们必须在经过模数转换后变成数字量后,才能被Arduino进一步处理。

像温度这样的数据必须先被转换成微处理器能够处理的形式(比如电压),才能被Arduino处理,这一任务通常由各类传感器(sensor)来完成的。例如,电路中的温度传感器能够将温度值转换成0V到5V间的某个电压,比如、、等。由于传感器表达的是模拟信号,它不会像数字信号那样只有简单的高电平和低电平,而有可能是在这两者之间的任何一个数值。至于到底有多少可能的值则取决于模数转换的精度,精度越高能够得到的值就会越多。

Arduino所采用的ATmega8微处理器一其有6个模数转换器(ADC,Analog to Digital Converter),每一个模数转换器的精度都是10bit,也就是说能够读取1024(2^10 = 1024)个状态。在Arduino的每一个模拟输入管脚上,电压的变化范畴是从0V到5V,因此Arduino能够感知到的最小电压变化是毫伏(5/1024 = )。

(

图 Arduino单片机引脚定义

就像模拟输入一样,在现实的物理世界中我们经常需要输出除了0和1之外的其他数值。例如,除了想用微控制器找开或者关闭电灯之外,我们还会想控制灯光的亮度,这时就需要用到模拟输出。由于Arduino的微控制器只能产生高电压(5V)或者低电压(0V),而不能产生变化的电压,因此必须采用脉宽度调制技术(PWM,Pulse Width Modulation)来模仿模拟电压。

PWM是一种开关式稳压电源应用,它是借助微处理器的数字输出来对模拟电路进行控制的一种非常用效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

简而言之,PWM是一种对模拟信号电平进行数字编码的方法,它通过对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等但宽度不相等的脉冲,而这些脉冲能够被用来代替正弦波或其它所需要的波形。

在Arduino数字I/O管脚9、10和11上,我们可以通过analogWrite()函数来产生模拟输出。该函数有两个参数,其中第一个参数是要产生模拟信号的引脚(9、10或者11);第二个参数是用于产生模拟信号的脉冲宽度,取值范围是0到255。脉冲宽度的值取0可以产生0V的模拟电压,取255则可以产生5V的模拟电压。不难看出,脉冲宽度的取值变化1,产生的模拟电压将变化(5/255 = )。

图 Arduino单片机引脚功能表

在许多实际应用场合中我们会要求在Arduino和其它设备之间实现相互通信,而最常见通常也是最简单的办法就是使用串行通信。在串行通信中,两个设备之间一个接一个地来回发送数字脉冲,它们之间必须严格遵循相应的协议以保证通信的正确性。

在PC机上上最常见的串行通信协议是RS-232串行协议,而在各种微控制器(单片机)上采用的则是TTL串行协议。由于这两者的电平有很大的不同,因此在实现PC机和微控制器的通信时,必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片,如MAX232等,但在Arduino上是用相应的电平转换电路来完成的。

根据Arduino的原理图我们不难看出,ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号管脚,另一方面又通过电平转换电路接到了串口的母头上。因此,当我们需要用Arduino与PC机通信时,可以用串口线将两者连接起来;当我们需要用Arduino与微控制器(如另一块Arduino)通信时,则可以用数字I/O端口的0号和1号管脚。

串行通信的难点在于参数的设置,如波特率、数据位、停止位等,在Arduino语言可以使用()函数来简化这一任务。为了实现数据的发送,Arduino则提供了()和()两个函数,它们的区别在于后者会在请求发送的数据后面加上换行符,以提高输出结果的可读性。

Arduino编程软件

A rduino 语言是建立在 C/C++基础上的,其实也就是基础的 C 语言,Arduino 语言只不过把 AVR 单片机(微控制器)相关的一些寄存器参数设置等都函数化了,不用我们去了解他的底层,让不太了解 AVR 单片机(微控制器)的朋友也能轻松上手。

图编程界面

Arduino 语言是以 setup()开头,loop()作为主体的一个程序构架。官方网站是这样描述 setup()的:用来初始化变量,管脚模式,调用库函数等等,此函数只运行一次。loop()函数是一个循环函数,函数内的语句周而复始的循环执行,功能类似 c 语言中的“main();”。

4智能小车控制流程及程序

烧录程序:

*前进按下发出 ONA 松开ONF

后退:按下发出 ONB 松开ONF

'

左转:按下发出 ONC 松开ONF

右转:按下发出 OND 松开ONF

停止:按下发出 ONE 松开ONF

蓝牙程序功能是按下对应的按键执行操,松开按键就停止*/

char getstr; //定义字符变量

int Left_motor_go=8; //左电机前进(IN1)

@

int Left_motor_back=9; //左电机后退(IN2)

int Right_motor_go=10; // 右电机前进(IN3)

int Right_motor_back=11; // 右电机后退(IN4)

//定义电机的接口

void setup()

{

//初始化电机驱动IO为输出方式

(9600);

pinMode(Left_motor_go,OUTPUT); // PIN 8 (无PWM)

pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)

pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)

pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM) }

void run()

{

digitalWrite(Right_motor_go,HIGH); // 右电机前进

[

digitalWrite(Right_motor_back,LOW);

//analogWrite(Right_motor_go,150);//PWM比例0~255调速,左右轮差异略增减 //analogWrite(Right_motor_back,0);

digitalWrite(Left_motor_go,LOW); // 左电机前进

digitalWrite(Left_motor_back,HIGH);

//analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减 //analogWrite(Left_motor_back,150);

//delay(time * 100); //执行时间,可以调整

}

void brake() //刹车,停车

{

digitalWrite(Right_motor_go,LOW);

digitalWrite(Right_motor_back,LOW);

digitalWrite(Left_motor_go,LOW);

digitalWrite(Left_motor_back,LOW);

^

}

void left()

{

digitalWrite(Right_motor_go,HIGH); // 右电机前进

digitalWrite(Right_motor_back,LOW);

//analogWrite(Right_motor_go,150);

*

//analogWrite(Right_motor_back,0);//PWM比例0~255调速

digitalWrite(Left_motor_go,LOW); //左轮后退

digitalWrite(Left_motor_back,LOW);

//analogWrite(Left_motor_go,0);

//analogWrite(Left_motor_back,0);//PWM比例0~255调速

//delay(time * 100); //执行时间,可以调整

}

|

void spin_left(int time) //左转(左轮后退,右轮前进) {

digitalWrite(Right_motor_go,HIGH); // 右电机前进

digitalWrite(Right_motor_back,LOW);

//analogWrite(Right_motor_go,200);

//analogWrite(Right_motor_back,0);//PWM比例0~255调速

digitalWrite(Left_motor_go,HIGH); //左轮后退

digitalWrite(Left_motor_back,LOW);

//analogWrite(Left_motor_go,200);

//analogWrite(Left_motor_back,0);//PWM比例0~255调速

//delay(time * 100); //执行时间,可以调整

}

void right()

{

digitalWrite(Right_motor_go,LOW); //右电机后退

digitalWrite(Right_motor_back,LOW);

//analogWrite(Right_motor_go,0);

// analogWrite(Right_motor_back,0);//PWM比例0~255调速

digitalWrite(Left_motor_go,LOW);//左电机前进

digitalWrite(Left_motor_back,HIGH);

//analogWrite(Left_motor_go,0);

//analogWrite(Left_motor_back,150);//PWM比例0~255调速

//delay(time * 100); //执行时间,可以调整

}

void spin_right(int time) //右转(右轮后退,左轮前进) {

digitalWrite(Right_motor_go,LOW); //右电机后退

digitalWrite(Right_motor_back,HIGH);

//analogWrite(Right_motor_go,0);

// analogWrite(Right_motor_back,200);//PWM比例0~255调速 digitalWrite(Left_motor_go,LOW);//左电机前进

,

digitalWrite(Left_motor_back,HIGH);

// analogWrite(Left_motor_go,0);

// analogWrite(Left_motor_back,200);//PWM比例0~255调速

//delay(time * 100); //执行时间,可以调整

}

void back()

{

digitalWrite(Right_motor_go,LOW); //右轮后退

!

digitalWrite(Right_motor_back,HIGH);

// analogWrite(Right_motor_go,0);

// analogWrite(Right_motor_back,150);//PWM比例0~255调速 digitalWrite(Left_motor_go,HIGH); //左轮后退

digitalWrite(Left_motor_back,LOW);

//analogWrite(Left_motor_go,150);

//analogWrite(Left_motor_back,0);//PWM比例0~255调速 //delay(time * 100); //执行时间,可以调整

!

}

void loop()

{

getstr=(); // 将串口收到的数据返回变量

if(getstr=='A') //当变量值为A

{

("go forward!");

run();

#

}

else if(getstr=='B')//当变量值为B

{

("go back!");

back();

}

else if(getstr=='C')//当变量值为C

{

\

("go left!");

left();

}

else if(getstr=='D')//当变量值为D

{

("go right!");

right();

}

相关主题
相关文档
最新文档