资源描述
物联网系统课程设计
学系名称:物联网工程
班级名称:物联网工程 2 班
学生姓名:朱泓锦 6239
指引教师:肖迎元 助教:
二零一六年十月
摘要
智能车辆是集环境感知、规划决策、多级别辅助驾驶等功能于一体综合系统,是智能交通系统一种重要构成某些。它在军事、民用、太空开发等领域有着广泛应用前景。随着电子工业发展,智能技术广泛运用于各种领域,运用于智能家居中产品更是越来越受到人们青睐。
以arduino程序和蓝牙模组,app为基本,是蓝牙模组,arduino小车和手机之间信息交互核心。本课题所研究物联网应用系统以arduino程序为核心,运用蓝牙模组,arduino小车和app等实现基本功能。
基本功能:运用蓝牙模组和app之间信息交互,控制小车移动,从而达到无线控制效果
注:仅能实现小车基本操作
核心词:arduino程序,arduino小车,app,蓝牙模组
1 绪论
随着科技进步,当代工业技术发展越来越体现出机电一体化特性。无论是在金属加工、汽车技术、工业生产等等方面,机器设备体现了所谓智能化、集成化、小型化、高精度化发展趋势。
1.1 选题背景
随着汽车工业迅速发展,关于汽车研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次均有智能小车这方面题目,全国各高校也都很注重该题目研究。可见其研究意义很大。本设计就是在这样背景下提出,指引教师已有充分准备。本题目是结合科研项目而拟定设计类课题。设计智能电动小车应当可以实现适应能力,能自动避障,可以智能规划途径。
智能化作为当代社会新产物,是后来发展方向,她可以按照预先设定模式在一种特定环境里自动运作,无需人为管理,便可以完毕预期所要达到或是更高目的。同遥控小车不同,遥控小车需要人为控制转向、启停和进退,比较先进遥控车还能控制器速度。常用模型小车,都属于此类遥控车;智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度控制,无需人工干预。操作员可以通过修改智能小车计算机程序来变化它行驶方向。因而,智能小车具备再编程特性,是机器人一种。
中华人民共和国自1978年把“智能模仿”作为国家科学技术发展规划重要研究课题,开始着力研究智能化。从概念引进到实验室研究实现,再到当前高品位领域(航天航空、军事、勘探等)应用,这一过程为智能化全面发展奠定基石。智能化全面发展是实现其对资源合理充分运用,以尽量少投入得到最大收益,大大提高工业生产效率,实现既有工业生产水平从自动化向智能化升级,实现当今智能化发展由高品位向大众普及。从先前模仿电路设计,到数字电路设计,再到当前集成芯片应用,各种能实现同样功能元件越来越小为智能化产物生成奠定了良好物质基本。
智能小车,是一种集环境感知、规划决策,自动行驶等功能于一体综合系统,它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型高新技术综合体。
1.2 智能小车研究现状
智能车辆作为智能交通系统核心技术,是许多高新技术综合集成载体。智能车辆驾驶是一种通用性术语,指所有或某些完毕一项或多项驾驶任务综合车辆技术。智能车辆一种基本特性是在一定道路条件下实现所有或者某些自动驾驶功能,下面简朴简介一下国内外智能小车研究发展状况。
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)中华人民共和国第一汽车集团公司和国防科技大学机电工程与自动化学院与研制成功国内第一辆自主驾驶轿车。该自主驾驶轿车在正常交通状况下高速公路上,行驶最高稳定速度为13km/h,最高峰值速度达170km/h,并且具备超车功能,其总体技术性能和指标已经达到世界先进水平。
(2)南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合研制了7B.8军用室外自主车,该车装有彩色摄像机、激光雷达、陀螺惯导定位等传感器。计算机系统采用两台Sun10完毕信息融合、途径规划,两台PC486完毕路边抽取辨认和激光信息解决,8098单片机完毕定位计算和车辆自动驾驶。其体系构造以水平式构造为主,采用老式“感知-建模-规划-执行”算法,其直线跟踪速度达到20km/h,避障速度达到5-10km/h。
智能车辆研究也是智能交通系统ITS核心技术。当前,国内许多高校和科研院所都在进行ITS核心技术、设备研究。随着ITS研究兴起,国内已形成一支ITS技术研究开发技术专业队伍。并且各交通、汽车公司越来越加大了对ITS及智能车辆技术研发投入,整个社会关注限度在不断提高。交通部已将ITS研究列入“十五”科技发展筹划和长期规划。相信通过有关领域共同努力,国内ITS及智能车辆技术水平一定会得到很大提高。
可以预测,国内飞速发展经济实力将为智能车辆研究提供一种更加辽阔前景。咱们要结合国内国情,在某一方面或某些方面,对智能车进行进一步细致研究,为它此后发展及实际应用打下坚实基本。
1.3 课题重要内容
本课题南京嵌入之梦工作室fira智能小车平台,选取通用、价廉Arduino单片机为控制平台,通过细化设计规定,结合传感器技术和电机控制技术有关知识实现小车各种功能。实现小车迈进倒退、转向行驶,达到设计目的。
2 智能小车总体构造
2.1 方案综述
本设计以两直流电动机为主驱动,通过各类传感器件来采集各类信息,送入主控单元Arduino单片机解决数据后完毕相应动作,以达到自身控制。电机驱动电路采用H桥驱动模块,驱动2个直流电机;最后由控制单元解决数据后通过编程有序合理将各模块信号整合在一起并完毕相应动作,实现了智能控制,相称于简易机器人。
依照设计作品要达到效果,本系统以Arduino单片机为核心控制器,重要由电源模块、电机驱动模块、构成。系统构造框图如下图1所示。
Arduino单片机
驱动电路
直流电动机
轮子
电源
图2.1 系统构造框图
2.2 主控单元方案比较与选取
按照题目规定,控制器重要用于控制电机,通过有关传感器对路面轨迹信息进行解决,并将解决信号传播给控制器,然后控制器做出相应解决,实现小车自动循迹和自动避障。
方案一:可以采用ARM为系统控制器,长处是该系统功能强大,片上外设集成度搞密度高,提高了稳定性,系统解决速度也很高,适合伙为大规模实时系统控制核心。
方案二:采用Arduino单片机作为系统控制方案。Arduino单片机算术运算功能强,软件编程灵活、自由度大,功耗低、体积小、技术成熟,成本也比ARM低。
考虑到性价比问题,本设计选取 用Arduino单片机做控制器。
2.3 “小车”必要信息
步进电机参数:
步进电机技术规定:
步进电机示例图:
智能小车底盘参照电路图:
蓝牙模块:
3智能小车大脑
这是学习单片机应用平台,而单片机种类众多,除了流行 8位机:51、AVR、PIC系列,尚有日渐被接受 16位机 MSP430系列,以及近来升势很猛 ARM Cortex‐M系列,这些单片机各有优势,无法说谁好谁坏,完全取决于学习者需求和喜好,此外尚有越来越接近 MCUDSP,因此我将这个权力交还给顾客。 并且我以为:所谓单片机应用学习,最核心就是能自己消化一种 MCU,依照控制需求自己分派 MCU 资源,编写相应程序,使之能按自己想法工作。这才是掌握单片机应用核心!
5.1 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等输入装置互动内容,可以更简朴地达到单人或多人游戏互动。
5.2 Arduino单片机引脚简介
Arduino数字I/O被提成两个某些,其中每个某些都包具有6个可用I/O管脚,即管脚2到管脚7和管脚8到管脚13。在数字电路中开关(switch)是一种基本输入形式,它作用是保持电路连接或者断开。Arduino从数字I/O管脚上只能读出高电平(5V)或者低电平(0V),因而咱们一方面面临到一种问题就是如何将开关开/断状态转变成Arduino可以读取高/低电平。解决办法是通过上/下拉电阻,按照电路不同普通又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种。
Arduino优势在于对数字信号辨认和解决,但咱们所生活真实世界并不是数字(digital)化,简朴到只要用0和1就可以表达所有现象。例如温度这一咱们已经司空见惯概念,它只能在一种范畴之内持续变化,而不也许发生像从0到1这样瞬时跳变,类似这样物理量被人们称为是模仿(analog)。Arduino是无法理解这些模仿量,它们必要在通过模数转换后变成数字量后,才干被Arduino进一步解决。
像温度这样数据必要先被转换成微解决器可以解决形式(例如电压),才干被Arduino解决,这一任务普通由各类传感器(sensor)来完毕。例如,电路中温度传感器可以将温度值转换成0V到5V间某个电压,例如0.3V、3.27V、4.99V等。由于传感器表达是模仿信号,它不会像数字信号那样只有简朴高电平和低电平,而有也许是在这两者之间任何一种数值。至于究竟有多少也许值则取决于模数转换精度,精度越高可以得到值就会越多。
Arduino所采用ATmega8微解决器一其有6个模数转换器(ADC,Analog to Digital Converter),每一种模数转换器精度都是10bit,也就是说可以读取1024(2^10 = 1024)个状态。在Arduino每一种模仿输入管脚上,电压变化范畴是从0V到5V,因而Arduino可以感知到最小电压变化是4.8毫伏(5/1024 = 4.8mV)。
图5.2 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,产生模仿电压将变化0.0196V(5/255 = 0.0196)。
图5.3 Arduino单片机引脚功能表
在许多实际应用场合中咱们会规定在Arduino和其他设备之间实现互相通信,而最常用普通也是最简朴办法就是使用串行通信。在串行通信中,两个设备之间一种接一种地来回发送数字脉冲,它们之间必要严格遵循相应合同以保证通信对的性。
在PC机上上最常用串行通信合同是RS-232串行合同,而在各种微控制器(单片机)上采用则是TTL串行合同。由于这两者电平有很大不同,因而在实现PC机和微控制器通信时,必要进行相应转换。完毕RS-232电平和TTL电平之间转换普通采用专用芯片,如MAX232等,但在Arduino上是用相应电平转换电路来完毕。
依照Arduino原理图咱们不难看出,ATmegaRX和TX引脚一方面直接接到了数字I/O端口0号和1号管脚, 另一方面又通过电平转换电路接到了串口母头上。因而,当咱们需要用Arduino与PC机通信时,可以用串口线将两者连接起来;当咱们需要用Arduino与微控制器(如另一块Arduino)通信时,则可以用数字I/O端口0号和1号管脚。
串行通信难点在于参数设立,如波特率、数据位、停止位等,在Arduino语言可以使用Serial.begin()函数来简化这一任务。为了实现数据发送,Arduino则提供了Serial.print()和Serial.println()两个函数,它们区别在于后者会在祈求发送数据背面加上换行符,以提高输出成果可读性。
5.3 Arduino编程软件
Arduino 语言是建立在 C/C++基本上,其实也就是基本 C 语言,Arduino 语言只但是把 AVR 单片机(微控制器)有关某些寄存器参数设立等都函数化了,不用咱们去理解她底层,让不太理解 AVR 单片机(微控制器)朋友也能轻松上手。
图5.4 编程界面
Arduino 语言是以 setup()开头,loop()作为主体一种程序构架。官方网站是这样描述 setup():用来初始化变量,管脚模式,调用库函数等等,此函数只运营一次。loop()函数是一种循环函数,函数内语句周而复始循环执行,功能类似 c 语言中“main();”。
4智能小车控制流程及程序
开始
蓝牙模组待机
启动app
与蓝牙模组配对
运用app对小车进行操作
4.2arduino烧录程序:
*迈进 按下发出 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为输出方式
Serial.begin(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=Serial.read();// 将串口收到数据返回变量
if(getstr=='A') //当变量值为A
{
Serial.println("go forward!");
run();
}
else if(getstr=='B')//当变量值为B
{
Serial.println("go back!");
back();
}
else if(getstr=='C')//当变量值为C
{
Serial.println("go left!");
left();
}
else if(getstr=='D')//当变量值为D
{
Serial.println("go right!");
right();
}
else if(getstr=='F'){
Serial.println("Stop!");
brake();
}
else if(getstr=='E'){
Serial.println("Stop!");
brake();
}
}
//PS:在烧录程序时,一定要将蓝牙模组串口连线拔掉,由于会与下载到小车程序有冲突
小 结:
在学习知识这段时间里,我与教师建立了浓厚师生情谊。教师们谆谆辅导,使我体会了学习乐趣。我与身边许多同窗,也建立了良好学习关系,互帮互助,克服难关。锻炼了自我动手和分析问题能力,受益匪浅。
通过本次课程设计,我深刻结识到程序和硬件有关性,懂得了运用arduino和app之间如何进行信息交互,使得程序学习更加深刻,明确了后来要发展方向。
参照文献
1、 Arduino使用教程 http:// .cn
2、谭浩强 C程序设计 清华大学出版社
3、何希才 新型实用电子电路400例 电子工业出版社
4、赵负图 传感器集成电路手册,第一版 化学工业出版社
5、陈伯时 电力拖动自动控制系统,第二版 机械工业出版社
6、Arduino Homepage Arduino Nano user manual .cc
展开阅读全文