飞控的遥控器打算自己做,这样全局都能掌握,可以通过遥控器对飞控的参数和飞行模式进行修改,而买遥控器是做不到这样的哈。。以后做图传的时候,屏幕还可以实时现实摄像头拍回来的画面,挺好的哈。。

做遥控我们选的是原子的战舰开发板,开发板附带小霸王那种遥控器,可以用这个来控制飞控哈,回忆童年有木有。。。板子还带一个ADXL345的加速度传感器,那还可以用开发板的姿态控制飞控的姿态。。哈。。应该挺好玩。。。

第一步我们打算先写一个GUI的界面,UI这东西就让我头疼哈。额。。打算第一版就没什么UI,就把要显示的数据往屏幕上堆就好了。。。以前在学校的时候针对原子开发板自己移植过UCGUI3.90a,并且做了一个ucos+ucgui+fatfs的干净模版工程。。打算直接用。。但是发现有个叫emwin的,看了下效果好很多,就像windows98到windowsxp的效果,本来就对UI界面烦心,这个效果好这么多,果断要用。。看了下,其实就是ucgui,额。。其实ucgui就是emwin。。。

先上个视频:

视频地址:http://v.youku.com/v_show/id_XNzY1NTYwMjA0.html

ucgui和emwin的移植是差不多的,只是emwin不开源,移植的过程有些地方稍微有点不同。。

先大致说下ucgui的移植,移植ucgui其实很容易,只要修改GUI\LCDDriver里面的LCDDummy.c文件,填写void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 和unsigned int LCD_L0_GetPixelIndex(int x, int y) 函数就可以了,可以优化LCD_L0_FillRect来增加刷新速率。但是有个前提,就是屏幕的扫描方向需要和XY轴的增加方向一致。这样就可以直接填充颜色,而不需要更改XY的坐标值,可以批量修改,比一个一个点修改速度快很多。亲测STM32下6804的3.5屏可以快10倍左右。其实就是这么简单。。。

emwin的移植

我们用的stm32,可以用stemwin,不过下了stemwin,里面的源码不多,移植的时候还要到emwin里面去找,我们直接移植emwin好了,emwin改成stemwin是容易的,下面再说。。

下载emwin后,emwin可以不需要下载,在MDK里面是有的哈,在keil\arm\segger\emwin里面,5.0版本以上的MDK在keil\ARM\pack\keil\mdk=middleware\5.1.4\emwin里面

里面内容如下图1:

图1

移植主要有这么几个文件需要处理,GUIConf、LCDConf、和GUIDRV_Template,如果需要添加系统支持和触摸,那就还需要移植两个文件GUI_X_uCOS和GUI_X_Touch_Analog。

GUIConf是GUI的配置文件,主要是初始化GUI的内存池,LCDConf里面主要就是LCD的初始化函数。GUIDRV_Template主要就是用来实现打点和画线的函数,需要注意一点,要使用GUIDRV_Template文件作为i我们驱动函数的文件,需要在LCDConf.C里面将#define DISPLAY_DRIVER GUIDRV_LIN_32改成#define DISPLAY_DRIVER 。

第一步需要将lib和include复制到我们的项目里面,lib是库文件include是头文件。。。

在我的GUI里面有如下几个文件,用过UCGUI的和移植过UCGUI的下面的文件夹肯定不陌生。

图2

第二步就是移植底层代码。在我们的lcddriver里面,其实只要实现一个C文件,GUIDRV_Template.c,这个文件在图1的Sample\DisplayDriver文件夹里有。

GUIDRV_Template.c里面实现打点函数就可以了,然后需要优化,可以对画线,矩形填充等函数进行优化,会有明显的效果。

第三步,在LCDConf.c里面的LCD_X_DisplayDriver函数的LCD_X_INITCONTROLLER:下填写屏幕的初始化函数,顺便说下,触摸的初始化函数也可以放在这。

第四步,在GUIConf.c中,对GUI的内存池进行初始化,并且设置内存的大小,可以选择内部ram和外部的SRRAM,这里就看自己需要了。。

第五步,我们ucos系统,然后将GUI_X_uCOS添加到项目中,到此,就移植完了,emwin就可以跑了。。记得把库加到项目中。。

如果试用st的stemwin,只需要将库换成stemwin,通知在GUI初始化前开启CRC,执行RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);就可以。

触摸移植:

按照上面的三步,加入触摸屏的初始化函数进去,因为我们使用的是模拟芯片测touch的,和数字中断方式有点不同哈。。不过也很简单。。

第一步:在GUIConf里面设置宏定义,#define GUI_SUPPORT_TOUCH       (1)  开启触摸屏功能,在图1的\Sample\GUI_X中找到GUI_X_Touch_Analog.c文件夹,如果是使用数字式直接输出坐标的芯片,则要试用GUI_X_Touch_StoreState.c文件。。我们触摸屏输出的是模拟数据,所以采用GUI_X_Touch_Analog.c,在里面只需要实现

int GUI_TOUCH_X_MeasureX(void)和int GUI_TOUCH_X_MeasureY(void)函数,直接调用原子的TP_Read_XY2(&x,&y);就完成了,到此触摸屏也可以使用了。

外挂汉字库的移植

有点懒哈,本来打算用英文算了,以前ucgui里面也没有移植汉字库进去,今天想了想,还是弄进去吧,

可以直接参考这个http://bbs.armfly.com/read.php?tid=1604。。

这里只大致解释下汉字的实现原理。。

我们可以看到GUI_FONT的定于如下,要实现汉字的功能,我们就需要实现这个结构体的制定函数的功能。

 struct GUI_FONT {
GUI_DISPCHAR * pfDispChar;
GUI_GETCHARDISTX * pfGetCharDistX;
GUI_GETFONTINFO * pfGetFontInfo;
GUI_ISINFONT * pfIsInFont;
GUI_GETCHARINFO * pfGetCharInfo;
const tGUI_ENC_APIList* pafEncode;
U8 YSize;
U8 YDist;
U8 XMag;
U8 YMag;
union {
const void GUI_UNI_PTR * pFontData;
const GUI_FONT_MONO GUI_UNI_PTR * pMono;
const GUI_FONT_PROP GUI_UNI_PTR * pProp;
const GUI_FONT_PROP_EXT GUI_UNI_PTR * pPropExt;
} p;
U8 Baseline;
U8 LHeight; /* Height of a small lower case character (a,x) */
U8 CHeight; /* Height of a small upper case character (A,X) */
};

我们看下我们汉字字体的定义:

 GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ24_CharInfo[] =
{
{ , , , (void *)"0:/SYSTEM/FONT/ASC12x24.bin"},
{ , , , (void *)"0:/SYSTEM/FONT/HZ24x24.bin"},
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropHZ= {
0xA1A1,
0xFEFE,
&GUI_FontHZ24_CharInfo[],
(void *),
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropASC= {
0x0000,
0x007F,
&GUI_FontHZ24_CharInfo[],
(void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropHZ,
};
GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24 =
{
GUI_FONTTYPE_PROP_HZ,
,
,
,
,
(void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropASC
};
GUI_FontHZ24里面通过指向GUI_FontHZ24_Prop(GUI_FONT里面的GUI_FONT_PROP是个链表结构哈) ASC ASCII码字库,再通过GUI_FontHZ24_Prop里面的GUI_FontHZ24_PropHZ指向对应的汉字字库。
然后我们在看看对应 GUI_FONT 里面
 GUI_DISPCHAR * pfDispChar;
GUI_GETCHARDISTX * pfGetCharDistX;
GUI_GETFONTINFO * pfGetFontInfo;
GUI_ISINFONT * pfIsInFont;
GUI_GETCHARINFO * pfGetCharInfo;
const tGUI_ENC_APIList* pafEncode;
GUI_FONTTYPE_PROP_HZ,
GUI_FONTTYPE_PROP_HZ为
 #define GUI_FONTTYPE_PROP_HZ       \
GUIPROP_X_DispChar, \
GUIPROP_X_GetCharDistX, \
GUIMONO_GetFontInfo, \
GUIMONO_IsInFont, \
(GUI_GETCHARINFO *), \
(tGUI_ENC_APIList*)
如果你看了http://bbs.armfly.com/read.php?tid=1604,就直到这里面的GUIPROP_X_DispChar和 GUIPROP_X_GetCharDistX是在GUICharPEx.c实现的,这个也是具体读取汉字字库的地方,这里我们通过fatfa读取SD卡里面的字库。如果还需要添加其他字体,只需要实现对应的GUI_FONT结构体就可以了。。。。。
												

四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比的更多相关文章

  1. 四轴飞行器1.5 各种PID对比分析及选择

    原创文章,欢迎转载,转载请注明出处 这篇文章主要介绍我对PID的理解,以及选择PID算法的过程. 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频:介绍在后面 地址:ht ...

  2. 四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法

    四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法  原创文章,欢迎转载,转载请注明出处      最近时间花在最多的地方就是STM32的I2C上了.之前就知道STM32的I2C并不好用, ...

  3. 四轴飞行器1.2.2 RT-Thread 串口

    四轴飞行器1.2.2 RT-Thread 串口        本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了.下面我们说 ...

  4. 四轴飞行器1.1 Matlab 姿态显示

    四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的 ...

  5. 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲(转)

    源: 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲

  6. 从零开始的四轴飞行器-开篇flag

    在这里立下flag,我要理解学会四轴飞行器的控制方法.

  7. 四轴飞行器飞行原理与双闭环PID控制

    四轴轴飞行器是微型飞行器的其中一种,相对于固定翼飞行器,它的方向控制灵活.抗干扰能力强.飞行稳定,能够携带一定的负载和有悬停功能,因此能够很好地进行空中拍摄.监视.侦查等功能,在军事和民用上具备广泛的 ...

  8. Delphi笔记(GL_Scene四轴飞行器模型)

    有了前的一篇做铺垫,已经简单的说了GL_Scene的下载安装和一个简单的实例制作.现在就要开始制作一个3D的模型了,具体的步骤就不再这里多说了,直接上图和代码吧! [第一版]先看一下最开始的版本吧,比 ...

  9. 四轴飞行器1.2.1 RT-Thread 环境搭建

    买的飞控板到了,开始写下位机的程序了,本来打算用UCOS的,因为以前用过,比较熟悉,可以很快上手,不过板子的卖家推荐了RT-Thread,以前虽然有接触过,但是没用过,于是去官网看了下,感觉还不错.其 ...

随机推荐

  1. Xcode升级7.3 自动补全不提示导入的自定义类解决方案

    见图:

  2. Lua中强大的元方法__index详解

    今天要来介绍比较好玩的内容:__index元方法 我是备胎,记得回头看看 咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊!当然,又或许是成为过别人的备胎. 没有备胎的人,就不是完整的人生. ...

  3. struts中简单的校验

    Struts中简单的校验 “计应134(实验班) 凌豪” Struts2校验简要说明:struts2中通常情况下,类型转换要在数据校验之前进行.类型转换其实也是基本的服务器端校验,合法数据必然可以通过 ...

  4. 手机触屏的js事件

    处理Touch事件能让你跟踪用户的每一根手指的位置.你可以绑定以下四种Touch事件:     1.touchstart:  // 手指放到屏幕上的时候触发      2.touchmove:  // ...

  5. vb6.0 时间日期

    使用year(now)可以得到4位数的年    你还可以用Format来得到, 还有FormatDateTime 下面两种都是一样的结果:  FormatDateTime(now,vbLongDate ...

  6. Confluent

    Confluent介绍(一)   最开始接触confluent是通过这篇博客,How to Build a Scalable ETL Pipeline with Kafka Connect,对于做大数 ...

  7. VUE.JS组件化

    VUE.JS组件化 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎 ...

  8. odi增量更新策略

    增量更新策略:通过一个“update key”比较流数据记录与目标表中的记录比较进行数据整合.具有相同“update key”的记录当相关联列不同时将被更新:在目标表中不存在的记录将被插入.这种方式用 ...

  9. linux 环境操作faq 记录

    1. ubuntu adb 提示???? 找不到设备 这个问题不是一次两次了记录下,以后好找点. 问题:ubuntu下adb 不是别设备 http://blog.csdn.net/chychc/art ...

  10. 简易对象垃圾回收框架 for Delphi

    (一).缘起 1.1 我的一个出错程序 程序名称:呼叫处理模块的压力测试工具,分为客户端和服务端. 开发工具:Delhpi 5 相关技术:客户端通过与服务端建立Socket连接来模拟一组电话机的拨入. ...