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

上传人:b****8 文档编号:10998869 上传时间:2023-02-24 格式:DOCX 页数:19 大小:1.57MB
下载 相关 举报
基于Qt的汽车车速仪表盘的设计讲解.docx_第1页
第1页 / 共19页
基于Qt的汽车车速仪表盘的设计讲解.docx_第2页
第2页 / 共19页
基于Qt的汽车车速仪表盘的设计讲解.docx_第3页
第3页 / 共19页
基于Qt的汽车车速仪表盘的设计讲解.docx_第4页
第4页 / 共19页
基于Qt的汽车车速仪表盘的设计讲解.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

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

《基于Qt的汽车车速仪表盘的设计讲解.docx》由会员分享,可在线阅读,更多相关《基于Qt的汽车车速仪表盘的设计讲解.docx(19页珍藏版)》请在冰豆网上搜索。

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

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

研究生课程论文

基于Qt的汽车车速仪表盘的设计

 

学院:

信息工程学院

专业:

交通信息工程及控制

课程:

嵌入式系统及应用

姓名:

学号:

授课教师:

 

一研究背景

仪表作为汽车整个系统中十分重要的部分,是提高汽车综合性能的重要方面之一。

随着计算机软硬件技术、总线技术、电子技术等的快速发展,控制系统臃肿、接线布线复杂、占用空间大的传统电磁机械仪表渐渐被淘汰,虚拟仪表正以传统机械仪表无法比拟的速度迅猛发展。

目前虚拟仪表通常包括纯数字仪表和虚拟仪表盘仪表两种:

纯数字仪表成本较低,但功能和界面比较简单,满足不了一般驾驶员的需求;而现有的虚拟仪表盘仪表虽然功能和界面比较丰富,但又存在着开发成本高、可移植性和可重绘性差、可扩展性不足等缺点,不利于大范围的推广与应用。

  针对传统仪表和现有仪表存在的不足,本文提出了一种新型的车载虚拟仪表设计方案,采用ARM处理器S3C6410为核心的硬件平台和以嵌入式Linux系统为核心的软件平台,并在此基础上采用开放源代码的图形界面库QT开发仪表终端应用程序。

该虚拟仪表可读性好,读数精度高,在可移植性、可维护性和成本方面都得到了良好的改善,具有较大的科研价值和商业使用价值。

本文目前只实现了仪表中关于车速的终端应用程序。

二开发环境

2.1Ubuntu与Qt简介

Ubuntu是一个以桌面应用为主的Linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。

Ubuntu拥有很多优点。

相对于其他版本的Linux,Ubuntu也有着自己的优势。

首先,安装系统非常简单,只需要非常少的设置即可,完全可以和Windows桌面系统相媲美;其次,图形界面很人性化,模仿了在xp下常用的快捷键;还有,安装和升级程序时,可以通过网络,由系统自行安装依赖的文件包,从此不必再为Linux系统的依赖关系大伤脑筋。

Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。

它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。

它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。

它注重于能给用户提供精美的图形界面所需的所有元素,而且其开发过程是基于面向对象的编程思想,并且它支持真正的组件编程。

Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(MetaObjectCompiler,moc))以及一些宏,易于扩展,允许组件编程。

基本上,Qt同XWindow上的Motif,Openwin,GTK等图形界面库和Windows平台上的MFC,OWL,VCL,ATL是同类型的东西。

2.2安装过程

主机Linux开发环境:

UbuntuLinux操作系统,

交叉编译器:

arm-linux-gcc-4.3.2,

ARM的内核使用的版本:

linux-3.0.1。

2.2.1主机上Linux的相关配置

1.Ubuntu设置为root用户

在Ubuntu中新建一个终端,输入如下命令:

#sudo–s

#sudopasswd

输入要设置的密码,这样以后我们只需要重新启动Ubuntu,我们就可以用root用户登录了。

Linux系统对不同的用户有不同的权限设置,root用户具有最高权限。

2.Ubuntu网络参数设置

启动Ubuntu,在桌面上端的网络图标上点击右键,选择“编辑网络”,在“网络连接”面板上选中Autoeth0,通过Autoeth0设置Ubuntu的IP地址、子网掩码、网关、DNS等信息,我们可以将Ubuntu的IP地址和主机的IP地址设置在同一个网段,这样我们通过虚拟机“桥接”的方式就可以在Ubuntu访问Internet了,这样比较方面对一些开发包的下载。

3.安装交叉编译器

交叉编译器是在交叉编译中必不可少的工具,我们需要开发ARM的Linux程序就必须在我们的主机上安装交叉编译器,交叉编译器的版本要与ARM使用的内核版本一致,否则会产生运行错误。

本次式样使用的交叉编译器为arm-linux-gcc-4.3.2,ARM的内核使用的版本为linux-3.0.1。

本次试验在网上下载了交叉编译器arm-linux-gcc-4.3.2的源码包arm-linux-gcc-4.3.2.tgz。

在Ubuntu的终端下通过命令解压该源码包,命令如下:

#tarxzvfarm-linux-gcc-4.3.2.tgz

该命令执行完后会生成4.3.2目录,我们进入该目录的bin目录下可以看见我们的交叉编译器安装文件arm-none-linux-gnueabi-gcc,并且我们可以通过相应的命令查看我们编译器的版本信息。

2.2.2Linux系统移植

1.编译UBoot和Linux内核

A.编译UBoot

UBoot是引导是Linux系统的引导启动项,需要将UBboot的源码编译成为u-boot.bin的可执行文件。

这样就可以在通过SD卡将Linux系统一键烧写到S3C6410的开发板中了。

在飞凌的官网上下载了uboot的源码包uboot1.16_FORLINX_6410.tgz。

通过解压命令解压该源码包。

命令如下:

#tarzxfuboot1.16_FORLINX_6410.tgz

解压完成后会生成一个uboot1.16目录。

在编译之前需要配置config文件,进入uboot1.16目录通过命令:

#makeforlinx_nand_ram128_config(配置适用于128M内存开发板的config)

#makeclean(删除以前编译的文件)

#make(编译)

如果编译成功,将在uboot1.16目录下产生一个u-boot.bin文件,这就是需要烧写到Nandflash的U-boot引导文件的镜像文件。

B.Linux内核编译

需要对Linux的内核源码进行编译,首先通过命令对内核源码的压缩包进行解压:

#tarzxfFORLINX_linux-3.0.1.tar.gz

同样,需要配置内核,在配置内核的时候需要使用“makemenuconfig”命令,这样需要安装“libncurses5”来支持其操作。

命令如下:

#sudoapt-getinstalllibncurses5-dev

#makemenuconfig(配置内核)

#makezImage

编译结束后,会在内核源码目录的/arch/arm/boot中得到Linux内核映像文件zImage。

2.制作yaffs2文件系统映像

本实验通过飞凌自带的文件系统目录,也可以根据自己的需求自己完成满足需要文件系统,但由于时间问题我们借助飞凌提供的文件系统目录生成系统文件。

用Yaffs文件系统制作工具,制作文件系统Yaffs。

通过命令:

#./mkyaffs2inage-nand256mFileSystem-Yaffs2rootfs.yaffs2

这样生成rootfs.yaffs2是可以下载到开发板nandflash中的yaffs2文件系统映像

3.Linux系统移植

在向ARM中移植Linux操作系统的时候需要一张SD卡,可以通过S3C6410的一件烧写功能将刚刚编译好的u-booot.bin、zImage、rootfs.yaffs三个文件写入ARM开发板目录下。

首先需要将SD卡格式化为FAT32格式并且将u-booot.bin、zImage、rootfs.yaffs文件考入SD卡中,在开发板中,调整拨码开关设置ARM为从SD卡启动,在启动完成后,需要将拨码开关设置为从nandflash启动。

这样就完成了Linux系统的烧写。

2.2.3Qtopia交叉编译环境的搭建

1.编译第三方库

编译Qtopia需要第三方库的支持,下载到了第三方库的源码和编译好的库文件,用的第三库文件为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库

设置环境变量:

#exportPATH=/usr/local/arm/4.4.1/bin:

$PATH

#exportCC=/usr/local/arm/4.4.1/bin/arm-linux-gcc

#./configure–enable-shared

修改生成的Makefile文件

CC=/usr/local/arm/4.4.1/bin/arm-linux-gcc

AR=/usr/local/arm/4.4.1/bin/arm-linux-arrc

AR2=/usr/local/arm/4.4.1/bin/arm-linux-arnlib

保存

#cpjconfig.docjconfig.h

#make

编译通过,执行以下命令即可完成jpeg头文件和库文件的制作。

#cpjpeglib.hjconfig.hjmorecfg.h/root/yizhi/arminclude

#cp.libs/libjpeg.so*/root/yizhi/armlib

B.交叉编译e2fsprogs-1.40.2库

编译e2fsprogs-1.40.2是为了得到两个文件,uuid.h及libuuid.so,编译Qtopia2.2.0需要这两个头文件。

设置环境变量:

#exportPATH=/usr/local/arm/4.4.1/bin:

$PATH

#exportCC=/usr/local/arm/4.4.1/bin/arm-linux-gcc

以上两个环境变量已经设置过,所以不需要在重新设置了,可以直接执行配置命令。

#./configure–enable-elf-shilbs–host=arm-linux

–with-cc=/usr/local/arm/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文件:

#viMakefile

修改:

[begin]

AR_RC=/usr/local/arm/4.4.1/bin/arm-linux-arrc

CC=/usr/local/arm/4.4.1/bin/arm-linux-gcc

RANLIB=/usr/local/arm/4.4.1/bin/arm-linux-arnlib

[end]

保存

#make

#cplibpng12.so*/root/yizhi/armlib

#cp*.h/root/yizhi/arminclude

完成libpng头文件和库文件的制作。

D.交叉编译zlib

#exportPATH=/usr/local/arm/4.4.1/bin:

$PATH

#exportCC=/usr/local/arm/4.4.1/bin/arm-linux-gcc

#exportLD_LIBRARY_PATH=/usr/local/arm/4.4.1/arm-linux/lib:

$LD_LIBRARY_PATH

#./configure–shared

这个也需要修改一下Makefile文件

修改为:

[begin]

CC=/usr/local/arm/4.4.1/bin/arm-linux-gcc

LDSHARED=/usr/local/arm/4.4.1/bin/arm-linux-gcc–shared–Wl,-soname,libz.xo.1

CPP=/usr/local/arm/4.4.1/bin/arm-linux-gcc–E

AR=/usr/local/arm/4.4.1/bin/arm-linux-arrc

RANLIB=/usr/local/arm/4.4.1/bin/arm-linux-ranlib

[end]

将生成的的动态库及相关的头文件分别复制到armlib和arminclude目录下,经过以上步骤,编译Qtopia2.2.0时所需要的头文件和库文件就制作完成了。

2.Qtopia-free-forlinx-2.2.0的编译

#tarzxvfARM-qtopia-free-src-2.2.0.tar.gz./

文件解压完成后就开始编译了。

#./build

Build为脚本程序,直接就可以进行qtopai-2.2.0的编译。

在编译过程中产生的状态信息将记录到当前目录下的qtopia2.2.0Makelog文件里,如果编译时产生大量错误信息,打开该文件,查找error关键字进行问题的定位,里面记录的信息对我们是很有帮助的。

编译成功完成后,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.4Qtopia2.2.0的使用

进入到Qtopia里面,在该目录下有Qtopia运行需要的全部文件。

飞凌的文件系统中提供了运行Qtopia的命令脚本,可以使用飞凌提供的脚本来运行Qtopia2.2.0。

进入终端,在命令行中输入

#qtopia

回车即可,这样就可以在开发板的LCD上看到Qtopia的运行界面了,如图2.1所示。

图2.1Qtopia运行效果

三总体设计

车载虚拟仪表的基本设计思想是将汽车上安装的各种传感器采集到的数据进行智能化的处理,然后在运行于嵌入式Linux系统的使用Qt设计的虚拟仪表盘上进行显示,以便于监测汽车各系统的工作状况,如剩余油量、当前车速、行驶里程等,并在某状态出现异常或存在危险时向驾驶员提示报警。

本文目前只实现了车载虚拟仪表中关于车速的终端应用程序,系统初始化一个车速值,最终界面车速的变化可以通过人为点击界面中车速控制按钮而实现。

本文程序总体流程图如图3.1所示:

图3.1总体流程图

四系统实现

基于Qt的汽车车速虚拟仪表盘将汽车的车速在LCD上通过表盘和数字直观、动态的显示出来。

1.界面中的数字部分是利用旋钮QSpinBox实现的,初始化时设置其初始值为50,单位是km/h,单击旋钮一次的变化值设置为10,程序中为该旋钮添加了槽,用于实现仪表盘的动态性,当单击旋钮后,界面会调用repaint()函数,实现界面的重绘。

信号/槽是Qt对象以及其派生类对象之间的一种高效通信接口,它是Qt的核心特性,也是区别与其他工具包的重要地方。

尽管它的机制很像回调函数,但是这里要注意它和与回调函数间的不同,回调函数传递的是函数指针,很容易造成程序崩溃,另一方面,回调方式紧紧的绑定了图形用户接口的功能元素,因此很难开发进行独立的分类,而信号/槽机制能携带任意数量和任意参数。

信号和槽是用来在对象间通讯的方法,当一个特定事件发生的时候,信号会被发送出来,槽调用是用来响应相应的信号的。

Qt对象已经包含了许多预定义的信号,但仍可以在派生类中添加新的信号。

Qt对象中也已经包含了许多预定义的槽,但仍可以在派生类中添加新的槽来处理我们感兴趣的信号。

具体实现函数如下:

Speed:

:

Speed()

{

startAngle=-35;

endAngle=215;

speedValueSpinBox=newQSpinBox;

speedValueSpinBox->setRange(0,240);//旋钮变化范围

speedValueSpinBox->setSingleStep(10);//单击旋钮一次的变化值

speedValueSpinBox->setSuffix("km/h");//设置计量单位

speedValueSpinBox->setValue(50);//设置初始值

hlayout=newQHBoxLayout;//水平布局

hlayout->addStretch(35);//将放在layout中的空间压缩成默认的大小

hlayout->addWidget(speedValueSpinBox);//添加旋钮

hlayout->addStretch(35);

hlayout->minimumSize();//确保布局没有因为space太小而重置为0

vlayout=newQVBoxLayout;//垂直布局

vlayout->addStretch(160);

vlayout->addLayout(hlayout);

vlayout->addStretch(40);

vlayout->addStretch(30);

vlayout->minimumSize();

setLayout(vlayout);

connect(speedValueSpinBox,SIGNAL(valueChanged(int)),this,SLOT(repaint()));

resize(500,300);

}

2.下面介绍虚拟仪表盘的绘制:

虚拟仪表模块中的虚拟仪表盘采用QT的二维图形引擎的基础类QPainter开发。

绘制工具为做到绝大部分绘制图形用户界面程序的需要提供了高度优化的丰富的图形图像绘制函数。

QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状,并支持反走样、渐变填充、像素混合、线性变换等特性。

它也可以绘制排列的文本和像素映射。

通常,它在一个“自然的”坐标系统中绘制,但是它也可以在视和世界转换中做到这些。

本文主要是利用类QPainter中的函数完成仪表盘的绘制。

绘图工具的典型用法是:

·构造一个绘图工具

·设置画笔、画刷等等

·绘制

·销毁这个绘图工具

2.1虚拟仪表盘中的弧线均是由函数drawArc(intx,inty,intw,inth,inta,intalen)实现的,绘制由矩形(x,y,w,h)确定的弧,开始角度为a,并且弧长为alen。

角度a和alen是1/16度,也就是说一个完整的圆等于5760(16*360)。

其中0度在3点的时钟位置,开始角度a是负值时,意味着由零度即三点钟位置顺时针方向确定a的具体位置,开始角度a是正值时,意味着由零度即三点钟位置逆时针方向确定a的具体位置,同理,弧长alen为负值时,意味着由初始位置a顺时针方向旋转alen*16度,弧长alen为正值时,意味着由初始位置a逆时针方向旋转alen*16度。

绘制虚拟仪表盘的弧线的程序如下:

voidSpeed:

:

drawSpeedArc(QPainter&painter)

{

QPenpen(QColor(Qt:

:

blue),3);//定义画笔的颜色和大小

painter.setPen(pen);//设置新的绘图工具画笔。

painter.drawArc(-200,-200,400,400,startAngle*16,(endAngle-startAngle)*16);//绘制弧线

}

虚拟仪表盘中弧线的不同颜色段代表车速是否安全,其中绿色的弧段代表车速在0~80km/h范围内,是安全的,黄色的弧段代表车速在80~160km/h范围内,车速有些高,处于警告状态,红色的弧段代表车速在160~240km/h范围内,车速过高,处于危险状态,

2.2弧线上的刻度划分线由函数drawLine(intx1,inty1,intx2,inty2)实现,绘制从(x1,y1)到(x2,y2)的直线并且设置当前画笔位置为(x2,y2)。

其程序实现如下:

voidSpeed:

:

drawMark(QPainter&painter)

{

QPenpen(QColor(Qt:

:

blue),3);

painter.setPen(pen);

doubleds=3.1415926/180;

//绘制划分弧线的较长的刻度线

for(doublei=(-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(doublei=(-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(constQRect&r,inttf,constQString&str)实现,在矩形框r中绘出字符串str。

其程序实现如下:

voidSpeed:

:

drawLabel(QPainter&painter)

{

QPenpen(QColor(Qt:

:

blue),1);

  painter.setPen(pen);

  doubleds=3.1415926/180;

QRectrect0(-200*cos(-30*ds)-20,-200*sin(-30*ds),10,10);

painter.drawText(rect0,Qt:

:

AlignCenter,tr("0"));

QRectrect1(-200*cos(-10*ds)-20,-200*sin(-10*ds)-5,15,15);

painter.drawText(rect1,Qt:

:

AlignCenter,tr("20"));

QRectrect3(-200*cos(10*ds)-20,-200*sin(10*ds)-7,15,15);

painter.drawText(rect3,Qt:

:

AlignCenter,tr("40"));

QRectrect4(-200*cos(30*ds)-20,-200*sin(30*ds)-8,15,15);

painter.drawText(rect4,Qt:

:

AlignCenter,tr("60"));

QRectrect5(-200*cos(50*ds)-20,-200*sin(50*ds)-10,15,15);

painter.drawText(rect5,Qt:

:

AlignCenter,tr("80"));

QRectrect6(-200*cos(70*ds)-2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

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

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