ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:1.57MB ,
资源ID:10998869      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10998869.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于Qt的汽车车速仪表盘的设计讲解.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于Qt的汽车车速仪表盘的设计讲解.docx

1、基于Qt的汽车车速仪表盘的设计讲解 研 究 生 课 程 论 文基于Qt的汽车车速仪表盘的设计学 院: 信息工程学院 专 业: 交通信息工程及控制 课 程: 嵌入式系统及应用 姓 名: 学 号: 授课教师: 一 研究背景仪表作为汽车整个系统中十分重要的部分,是提高汽车综合性能的重要方面之一。随着计算机软硬件技术、总线技术、电子技术等的快速发展,控制系统臃肿、接线布线复杂、占用空间大的传统电磁机械仪表渐渐被淘汰,虚拟仪表正以传统机械仪表无法比拟的速度迅猛发展。目前虚拟仪表通常包括纯数字仪表和虚拟仪表盘仪表两种:纯数字仪表成本较低,但功能和界面比较简单,满足不了一般驾驶员的需求;而现有的虚拟仪表盘仪

2、表虽然功能和界面比较丰富,但又存在着开发成本高、可移植性和可重绘性差、可扩展性不足等缺点,不利于大范围的推广与应用。针对传统仪表和现有仪表存在的不足,本文提出了一种新型的车载虚拟仪表设计方案,采用ARM处理器S3C6410为核心的硬件平台和以嵌入式Linux系统为核心的软件平台,并在此基础上采用开放源代码的图形界面库QT开发仪表终端应用程序。该虚拟仪表可读性好,读数精度高,在可移植性、可维护性和成本方面都得到了良好的改善,具有较大的科研价值和商业使用价值。本文目前只实现了仪表中关于车速的终端应用程序。二 开发环境2.1 Ubuntu与Qt简介Ubuntu是一个以桌面应用为主的Linux操作系统

3、,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 拥有很多优点。相对于其他版本的Linux,Ubuntu也有着自己的优势。首先,安装系统非常简单,只需要非常少的设置即可,完全可以和Windows桌面系统相媲美;其次,图形界面很人性化,模仿了在xp下常用的快捷键;还有,安装和升级程序时,可以通过网络,由系统自行安装依赖的文件包,从此不必再为Linux系统的依赖关系大伤脑筋。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Qt是一

4、个1991年由奇趣科技开发的跨平台C+图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。它注重于能给用户提供精美的图形界面所需的所有元素,而且其开发过程是基于面向对象的编程思想,并且它支持真正的组件编程。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc)以及一些宏,易于扩展,允许组件编程。基本上,Qt同X Window上的Motif,Openwin,GTK等图形界面库和Windows平台上的 MFC,OWL,VCL

5、,ATL 是同类型的东西。2.2 安装过程主机Linux开发环境:Ubuntu Linux操作系统,交叉编译器:arm-linux-gcc-4.3.2,ARM的内核使用的版本:linux-3.0.1。2.2.1主机上Linux的相关配置1.Ubuntu设置为root用户在Ubuntu中新建一个终端,输入如下命令: #sudo s #sudo passwd 输入要设置的密码,这样以后我们只需要重新启动Ubuntu,我们就可以用root用户登录了。Linux系统对不同的用户有不同的权限设置,root用户具有最高权限。2.Ubuntu网络参数设置启动Ubuntu,在桌面上端的网络图标上点击右键,选择

6、“编辑网络”,在“网络连接”面板上选中Auto eth0,通过Auto eth0设置Ubuntu的IP地址、子网掩码、网关、DNS等信息,我们可以将Ubuntu的IP地址和主机的IP地址设置在同一个网段,这样我们通过虚拟机“桥接”的方式就可以在Ubuntu访问Internet了,这样比较方面对一些开发包的下载。3.安装交叉编译器交叉编译器是在交叉编译中必不可少的工具,我们需要开发ARM的Linux程序就必须在我们的主机上安装交叉编译器,交叉编译器的版本要与ARM使用的内核版本一致,否则会产生运行错误。本次式样使用的交叉编译器为arm-linux-gcc-4.3.2,ARM的内核使用的版本为li

7、nux-3.0.1。本次试验在网上下载了交叉编译器arm-linux-gcc-4.3.2的源码包arm-linux-gcc-4.3.2.tgz。在Ubuntu的终端下通过命令解压该源码包,命令如下:#tar xzvf arm-linux-gcc-4.3.2.tgz 该命令执行完后会生成4.3.2目录,我们进入该目录的bin目录下可以看见我们的交叉编译器安装文件arm-none-linux-gnueabi-gcc,并且我们可以通过相应的命令查看我们编译器的版本信息。2.2.2 Linux系统移植1.编译UBoot和Linux内核A.编译UBootUBoot是引导是Linux系统的引导启动项,需要

8、将UBboot的源码编译成为u-boot.bin的可执行文件。这样就可以在通过SD卡将Linux系统一键烧写到S3C6410的开发板中了。在飞凌的官网上下载了uboot的源码包uboot1.16_FORLINX_6410.tgz。通过解压命令解压该源码包。命令如下:#tar zxf uboot1.16_FORLINX_6410.tgz解压完成后会生成一个uboot1.16目录。在编译之前需要配置config文件,进入uboot1.16目录通过命令:#make forlinx_nand_ram128_config(配置适用于128M内存开发板的config)#make clean(删除以前编译的

9、文件)#make (编译)如果编译成功,将在uboot1.16目录下产生一个u-boot.bin文件,这就是需要烧写到Nandflash 的U-boot引导文件的镜像文件。B.Linux内核编译需要对Linux的内核源码进行编译,首先通过命令对内核源码的压缩包进行解压:#tar zxf FORLINX_linux-3.0.1.tar.gz同样,需要配置内核,在配置内核的时候需要使用“make menuconfig”命令,这样需要安装“libncurses5”来支持其操作。命令如下:#sudo apt-get install libncurses5-dev#make menuconfig(配置内

10、核)#make zImage编译结束后,会在内核源码目录的/arch/arm/boot中得到Linux内核映像文件zImage。2.制作yaffs2文件系统映像本实验通过飞凌自带的文件系统目录,也可以根据自己的需求自己完成满足需要文件系统,但由于时间问题我们借助飞凌提供的文件系统目录生成系统文件。用Yaffs文件系统制作工具,制作文件系统Yaffs。通过命令:#./mkyaffs2inage-nand256m FileSystem-Yaffs2 rootfs.yaffs2这样生成rootfs.yaffs2 是可以下载到开发板nandflash 中的yaffs2 文件系统映像3. Linux系统

11、移植在向ARM中移植Linux操作系统的时候需要一张SD卡,可以通过S3C6410的一件烧写功能将刚刚编译好的u-booot.bin、zImage、rootfs.yaffs三个文件写入ARM开发板目录下。首先需要将SD卡格式化为FAT32格式并且将u-booot.bin、zImage、rootfs.yaffs文件考入SD卡中,在开发板中,调整拨码开关设置ARM为从SD卡启动,在启动完成后,需要将拨码开关设置为从nand flash启动。这样就完成了Linux系统的烧写。2.2.3 Qtopia交叉编译环境的搭建1.编译第三方库 编译Qtopia需要第三方库的支持,下载到了第三方库的源码和编译好

12、的库文件,用的第三库文件为3rdpart-lib-for-Qtopia2.2.0.tar.gz。通过命令解压该压缩包,得到jpeg-6b(一个jpeg图形编码解码程序库)、libpng-1.2.19(一个png 图形编码解码程序库)、zlib-1.2.3(一个压缩解压程序库)、e2fsprogs-1.40.2(提供uuid支持)。A.交叉编译jpeg库设置环境变量:#export PATH=/usr/local/arm/4.4.1/bin:$PATH#export CC=/usr/local/arm/4.4.1/bin/arm-linux-gcc#./configure enable-shar

13、ed修改生成的Makefile文件CC=/usr/local/arm/4.4.1/bin/arm-linux-gccAR=/usr/local/arm/4.4.1/bin/arm-linux-ar rcAR2=/usr/local/arm/4.4.1/bin/arm-linux-arnlib保存#cp jconfig.doc jconfig.h#make编译通过,执行以下命令即可完成jpeg头文件和库文件的制作。#cp jpeglib.h jconfig.h jmorecfg.h /root/yizhi/arminclude#cp .libs/libjpeg.so* /root/yizhi/a

14、rmlibB.交叉编译e2fsprogs-1.40.2库编译e2fsprogs-1.40.2是为了得到两个文件,uuid.h及libuuid.so,编译Qtopia2.2.0需要这两个头文件。设置环境变量:#export PATH=/usr/local/arm/4.4.1/bin:$PATH#export CC=/usr/local/arm/4.4.1/bin/arm-linux-gcc以上两个环境变量已经设置过,所以不需要在重新设置了,可以直接执行配置命令。#./configure enable-elf-shilbs host=arm-linux with-cc=/usr/local/arm

15、/4.4.1/bin/arm-linux-gcc with-linker=/usr/local/arm/4.4.1/bin/arm-linux-ld#make这样就可以生成uuid.h及libuuid.so两个文件。C.交叉编译libpng库Libpng这里的Makefile不用./configure生成的,而是直接从scripts文件夹里复制的,修改Makefile文件:#vi Makefile修改:beginAR_RC=/usr/local/arm/4.4.1/bin/arm-linux-ar rcCC=/usr/local/arm/4.4.1/bin/arm-linux-gccRANLI

16、B=/usr/local/arm/4.4.1/bin/arm-linux-arnlibend保存#make#cp libpng12.so* /root/yizhi/armlib#cp *.h /root/yizhi/arminclude完成libpng头文件和库文件的制作。D.交叉编译zlib#export PATH=/usr/local/arm/4.4.1/bin:$PATH#export CC=/usr/local/arm/4.4.1/bin/arm-linux-gcc#export LD_LIBRARY_PATH=/usr/local/arm/4.4.1/arm-linux/lib:$L

17、D_LIBRARY_PATH#./configure shared这个也需要修改一下Makefile文件修改为:beginCC=/usr/local/arm/4.4.1/bin/arm-linux-gccLDSHARED=/usr/local/arm/4.4.1/bin/arm-linux-gcc shared Wl, -soname, libz.xo.1CPP=/usr/local/arm/4.4.1/bin/arm-linux-gcc EAR=/usr/local/arm/4.4.1/bin/arm-linux-ar rcRANLIB=/usr/local/arm/4.4.1/bin/ar

18、m-linux-ranlibend将生成的的动态库及相关的头文件分别复制到armlib和arminclude目录下,经过以上步骤,编译Qtopia2.2.0时所需要的头文件和库文件就制作完成了。2.Qtopia-free-forlinx-2.2.0的编译#tar zxvf ARM-qtopia-free-src-2.2.0.tar.gz ./文件解压完成后就开始编译了。#./buildBuild为脚本程序,直接就可以进行qtopai-2.2.0的编译。在编译过程中产生的状态信息将记录到当前目录下的qtopia2.2.0Makelog文件里,如果编译时产生大量错误信息,打开该文件,查找error

19、关键字进行问题的定位,里面记录的信息对我们是很有帮助的。编译成功完成后,Qtopia2.2.0会自动的安装到qtopia-free-2.2.0/qtopia/zImage/opt/下面,进入Qtopai目录下面,需要把字体放到Qtopia/lib/fonts下面,qtopia-free-2.2.0/qt2/lin/font文件夹下有可以用的字体,只需要helvetica类型,该类型支持中文。另外需要把armlib下面的文件全部拷贝到Qtopai/lib/目录下面。这样就可以运行自己的Qtopia程序了。2.2.4 Qtopia2.2.0的使用进入到Qtopia里面,在该目录下有Qtopia运行

20、需要的全部文件。飞凌的文件系统中提供了运行Qtopia的命令脚本,可以使用飞凌提供的脚本来运行Qtopia2.2.0。进入终端,在命令行中输入#qtopia回车即可,这样就可以在开发板的LCD上看到Qtopia的运行界面了,如图2.1所示。图2.1 Qtopia运行效果三 总体设计车载虚拟仪表的基本设计思想是将汽车上安装的各种传感器采集到的数据进行智能化的处理,然后在运行于嵌入式Linux系统的使用Qt设计的虚拟仪表盘上进行显示,以便于监测汽车各系统的工作状况,如剩余油量、当前车速、行驶里程等,并在某状态出现异常或存在危险时向驾驶员提示报警。本文目前只实现了车载虚拟仪表中关于车速的终端应用程序

21、,系统初始化一个车速值,最终界面车速的变化可以通过人为点击界面中车速控制按钮而实现。本文程序总体流程图如图3.1所示:图3.1 总体流程图四 系统实现基于Qt的汽车车速虚拟仪表盘将汽车的车速在LCD上通过表盘和数字直观、动态的显示出来。1.界面中的数字部分是利用旋钮QSpinBox实现的,初始化时设置其初始值为50,单位是km/h,单击旋钮一次的变化值设置为10,程序中为该旋钮添加了槽,用于实现仪表盘的动态性,当单击旋钮后,界面会调用repaint()函数,实现界面的重绘。信号/槽是Qt对象以及其派生类对象之间的一种高效通信接口,它是Qt的核心特性,也是区别与其他工具包的重要地方。尽管它的机制

22、很像回调函数,但是这里要注意它和与回调函数间的不同,回调函数传递的是函数指针,很容易造成程序崩溃,另一方面,回调方式紧紧的绑定了图形用户接口的功能元素,因此很难开发进行独立的分类,而信号/槽机制能携带任意数量和任意参数。信号和槽是用来在对象间通讯的方法,当一个特定事件发生的时候,信号会被发送出来,槽调用是用来响应相应的信号的。Qt对象已经包含了许多预定义的信号,但仍可以在派生类中添加新的信号。Qt对象中也已经包含了许多预定义的槽,但仍可以在派生类中添加新的槽来处理我们感兴趣的信号。具体实现函数如下:Speed:Speed()startAngle=-35;endAngle=215;speedVa

23、lueSpinBox=new QSpinBox;speedValueSpinBox-setRange(0,240);/旋钮变化范围speedValueSpinBox-setSingleStep(10);/单击旋钮一次的变化值speedValueSpinBox-setSuffix(km/h); /设置计量单位speedValueSpinBox-setValue(50); /设置初始值hlayout=new QHBoxLayout;/水平布局hlayout-addStretch(35); / 将放在layout中的空间压缩成默认的大小hlayout-addWidget(speedValueSpin

24、Box);/添加旋钮hlayout-addStretch(35);hlayout-minimumSize();/确保布局没有因为space太小而重置为0vlayout=new QVBoxLayout;/垂直布局vlayout-addStretch(160);vlayout-addLayout(hlayout);vlayout-addStretch(40);vlayout-addStretch(30);vlayout-minimumSize();setLayout(vlayout); connect(speedValueSpinBox,SIGNAL(valueChanged(int),this,

25、SLOT(repaint();resize(500,300); .下面介绍虚拟仪表盘的绘制:虚拟仪表模块中的虚拟仪表盘采用QT的二维图形引擎的基础类QPainter开发。绘制工具为做到绝大部分绘制图形用户界面程序的需要提供了高度优化的丰富的图形图像绘制函数。QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状,并支持反走样、渐变填充、像素混合、线性变换等特性。它也可以绘制排列的文本和像素映射。通常,它在一个“自然的”坐标系统中绘制,但是它也可以在视和世界转换中做到这些。本文主要是利用类QPainter中的函数完成仪表盘的绘制。绘图工具的典型用法是:构造一个绘图工具设置画笔、画刷等等绘

26、制销毁这个绘图工具2.1 虚拟仪表盘中的弧线均是由函数drawArc ( int x, int y, int w, int h, int a, int alen ) 实现的,绘制由矩形(x, y, w, h)确定的弧,开始角度为a,并且弧长为alen。角度a和alen是1/16度,也就是说一个完整的圆等于5760(16*360)。其中0度在3点的时钟位置,开始角度a是负值时,意味着由零度即三点钟位置顺时针方向确定a的具体位置,开始角度a是正值时,意味着由零度即三点钟位置逆时针方向确定a的具体位置,同理,弧长alen为负值时,意味着由初始位置a顺时针方向旋转alen*16度,弧长alen为正值时

27、,意味着由初始位置a逆时针方向旋转alen*16度。绘制虚拟仪表盘的弧线的程序如下:void Speed:drawSpeedArc(QPainter &painter)QPen pen(QColor(Qt:blue),3);/定义画笔的颜色和大小painter.setPen(pen);/设置新的绘图工具画笔。 painter.drawArc(-200,-200,400,400,startAngle*16,(endAngle-startAngle)*16);/绘制弧线虚拟仪表盘中弧线的不同颜色段代表车速是否安全,其中绿色的弧段代表车速在080km/h范围内,是安全的,黄色的弧段代表车速在80 1

28、60km/h范围内,车速有些高,处于警告状态,红色的弧段代表车速在160 240km/h范围内,车速过高,处于危险状态,2.2 弧线上的刻度划分线由函数drawLine ( int x1, int y1, int x2, int y2 )实现,绘制从(x1, y1)到(x2, y2)的直线并且设置当前画笔位置为(x2, y2)。 其程序实现如下:void Speed:drawMark(QPainter &painter)QPen pen(QColor(Qt:blue),3);painter.setPen(pen);double ds=3.1415926/180;/绘制划分弧线的较长的刻度线fo

29、r(double i=(-30*ds);i(3.1415926+(50*ds);i+=20*ds)painter.drawLine(-200*cos(i),-200*sin(i),-185*cos(i),-185*sin(i);/绘制划分弧线的较短的刻度线for(double i=(-20*ds);i(3.1415926+(40*ds);i+=20*ds)painter.drawLine(-200*cos(i),-200*sin(i),-193*cos(i),-193*sin(i);2.3 弧线上刻度划分的数字标签由函数drawText ( const QRect & r, int tf, c

30、onst QString & str) 实现,在矩形框r中绘出字符串str。其程序实现如下:void Speed:drawLabel(QPainter &painter) QPen pen(QColor(Qt:blue),1);painter.setPen(pen);double ds=3.1415926/180; QRect rect0(-200*cos(-30*ds)-20,-200*sin(-30*ds),10,10); painter.drawText(rect0, Qt:AlignCenter, tr(0); QRect rect1(-200*cos(-10*ds)-20,-200*

31、sin(-10*ds)-5,15,15); painter.drawText(rect1, Qt:AlignCenter, tr(20); QRect rect3(-200*cos(10*ds)-20,-200*sin(10*ds)-7,15,15); painter.drawText(rect3, Qt:AlignCenter, tr(40); QRect rect4(-200*cos(30*ds)-20,-200*sin(30*ds)-8,15,15); painter.drawText(rect4, Qt:AlignCenter, tr(60); QRect rect5(-200*cos(50*ds)-20,-200*sin(50*ds)-10,15,15); painter.drawText(rect5, Qt:AlignCenter, tr(80); QRect rect6(-200*cos(70*ds)-2

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1