嵌入式Qt-控制硬件-滑动条控制RGB灯
前面的几篇文章,介绍Qt例程,都是和硬件无关的,Windows平台和嵌入式平台都能运行。
本篇,来测试一下 Qt界面控制嵌入式平台上的硬件 ,以野火i.MX6ULL板子上的RGB LED为例,实现Qt界面控制3种颜色LED的不同亮度混合显示。
1 设计Qt滑条控制LED界面
有一个按键作为LED的总开关,控制LED的点亮与熄灭。下面的3个滑条,控制3种颜色LED以不同的亮度点亮。右边是一个颜色混合显示面板,模拟RGB三种颜色的LED以不同亮度点亮后的混合亮度。
1.1 滑条控件
Qt Creator的UI设置界面中,有水平滑条和竖直滑条控件,可以直接使用:
右侧的属性窗户可以设置滑条的取值范围和初始值。
1.2 控件颜色
使用 QPalette 可以对界面颜色和控件的颜色进行自定义设置
界面的颜色
1 |
QPalette color = palette();//控制窗体颜色 |
这里就是把整个界面的颜色设置为纯白色
控件的颜色
例如文本标签控件( QLabel )的文字颜色可以这样设置:
1 |
QPalette pal; |
颜色混合面板控件( QTextBrowser )的面板颜色可以这样设置:
1 |
QColor color; |
1.3 滑条UI界面代码编写
1 |
LedWidget::LedWidget(QWidget *parent) : |
滑条滑动时的槽函数
1 |
void LedWidget::on_Slider_R_valueChanged(int value) |
更新RGB三种颜色的混合显示
1 |
void LedWidget::UpdateShowColor() |
2 板子上RGB LED的控制
2.1 i.MX6ULL系统烧录
烧写方法可参考: https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/install_debian/install_debian.html#
可以烧写到SD卡中
烧写到eMMC中
因为在SD卡中运行系统,无法使用WIFI连网,可以通过fire-config工具将SD卡的系统烧写到eMMC中,刷机过程可参考:
设置之后,选择重启,重启后的系统将自动进行从SD卡到EMMC的刷机。刷机过程大约2分钟左右。刷机完成后,控制台会重新进入串口登录页面, 此时观察开发板的LED灯,如果LED在持续闪烁,说明刷机成功。然后调整拨码开关为相应启动方式,重新上电启动系统即可。
也可以直接通过 USB-OTG接口和 MFGTool2软件 烧写到eMMC。ssh
烧写到eMMC启动,可以使用WIFI连网,WIFI配网步骤参考: https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/wifi/wifi.html
Qt系统界面
野火i.MX6ULL自带的系统固件烧录后自启动Qt程序界面如下:
串口方式登录时:
普通用户(带sudo权限)
账户: debian
密码: temppwd
ROOT用户
账户: root
密码: root
这个系统第一次运行时,会进行屏幕触摸校准,若校准的不满意,可删除掉**/etc/pointercal文件**后重启再进行校准。
1 |
rm /etc/pointercal |
2.2 无Qt的RGB LED测试
野火i.MX6ULL的RGB LED的原理图如下,由于驱动程序不需要自己写了,实际上我们也不需要关心具体的硬件引脚是哪个,只需要使用驱动程序提供的设备描述符进行LED的控制即可。
参考野火的测试代码: https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/led_subsystem/led_subsystem.html#id4
测试代码
1 |
|
将该程序在Ubuntu进行交叉编译
1 |
arm-linux-gnueabihf-gcc led_noqt.c -o led_noqt |
测试效果
对于亮度的控制,可以先参考教程中的命令行点灯测试: https://doc.embedfire.com/linux/imx6/linux_base/zh/latest/linux_basis/led_key_command_line_testing/led_key_command_line_testing.html
实际测试,串口指令无法控制灯的亮度, 只能控制亮灭,亮度为1和亮度为255的效果一样,都是同样的亮度 ,不知道是硬件的问题还是软件驱动的问题。
2.3 Qt中移植RGB LED控制代码
在滑条UI界面代码工程的基础上,添加一个自定义的类,名字可起为regled:
然后在这个类中,将无Qt的RGB LED测试用到的代码移植进来,并结合Qt的滑动条对三种颜色的灯进行控制。
这个是构造函数,先打开3个LED灯的文件描述符:
1 |
rgbled::rgbled(QObject *parent) : QObject(parent) |
编写一个RGB灯的颜色和亮度的控制函数,供外部调用:
1 |
void rgbled::SetRGBLedValue(LED_TYPE type, int val) |
在UI界面类中,可以对RGB LED进行控制:
1 |
//LedWidget类中定义一个rgbled成员变量 |
在更新UI界面上的模拟颜色面板的同时,也将板子上的RGB LED的亮度进行同步控制:
1 |
void LedWidget::UpdateShowColor() |
2.4 编译时遇到的问题
程序首先在Windows的Qt Creator上进行编译,遇到了一些问题,记录下解决方法。
在Windows中编译时,Qt Creater提示找不到unistd.h,这个其实是Visual Stidio编译器找不这个头文件。
这个头文件都是Linux系统中常用的,Windows中一般用不到,要消除这个编译错误,可以在VS的安装目录手动添加一个这个文件。
我的目录是:
1 |
D:\Tools1\vs2015\VC\include |
新建一个unistd.h:
1 |
//for qt creater, 2022/8/13 |
open、write等函数的警告提示
这些也是Linux中用到的函数,在Window平台编译只是警告信息,没有报错,可以不用管
3 实验演示
3.1 交叉编译
和之前一样,将Windows的Qt Creator中的源码复制到Ubuntu中进行交叉编译,具体操作过程可参考之前的文章:
这里仅记录下编译指令:
1 |
/home/xxpcb/myTest/imx6ull/otherlib/qt/qt-everywhere-src-5.12.9/arm-qt/bin/qmake |
3.2 文件复制到板子中
这里使用SSH的方式进行拷贝,首先要在Ubuntu中和i.MX6ULL板子中配置SSH功能,配置方法如下:
配置ssh
1 |
sudo apt update |
基本的ssh连接方法是:
1 |
ssh username@ip |
从Ubuntu拉取文件到板子中
1 |
# 从服务器拉取文件 |
3.3 测试效果
在测试自己的例程之前,需要先将野火的自启动Qt例程kill掉,否则两个Qt程序会同步运行互相遮挡。
kill掉自启动Qt程序
通过ps 、top 等命令查询到ebf-qtdemo的pid,然后通过kill命令停止App运行
1 |
#879 为当前 App 的 PID 值,每次可能不一样 |
运行自己的Qt程序
野火的系统中,提供了一个运行脚本 run_myapp.sh ,需要调用这个脚本来运行自己的Qt程序
1 |
sudo /usr/local/qt-app/run_myapp.sh /usr/local/qt-app/Control_1 |
实际测试效果如下:
可以看出: