0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式Qt-控制硬件:滑動條控制RGB燈

碼農(nóng)愛學(xué)習(xí) ? 來源:碼農(nóng)愛學(xué)習(xí) ? 作者:碼農(nóng)愛學(xué)習(xí) ? 2022-09-12 14:29 ? 次閱讀

前面的幾篇文章,介紹Qt例程,都是和硬件無關(guān)的,Windows平臺和嵌入式平臺都能運行。

本篇,來測試一下Qt界面控制嵌入式平臺上的硬件,以野火i.MX6ULL板子上的RGB LED為例,實現(xiàn)Qt界面控制3種顏色LED的不同亮度混合顯示。

1 設(shè)計Qt滑條控制LED界面

先來看一下最終設(shè)計的界面效果:

pYYBAGMdfbCAI2gPAAAW2fIX7nE490.png

有一個按鍵作為LED的總開關(guān),控制LED的點亮與熄滅。下面的3個滑條,控制3種顏色LED以不同的亮度點亮。右邊是一個顏色混合顯示面板,模擬RGB三種顏色的LED以不同亮度點亮后的混合亮度。

1.1 滑條控件

Qt Creator的UI設(shè)置界面中,有水平滑條和豎直滑條控件,可以直接使用:

pYYBAGMdfbiAFI0zAACH5F_WBKo506.png

右側(cè)的屬性窗戶可以設(shè)置滑條的取值范圍和初始值。

1.2 控件顏色

使用QPalette可以對界面顏色和控件的顏色進行自定義設(shè)置

QPalete::Window——通常指窗口部件的背景色

QPalette::WindowText——通常指窗口不見的前景色

QPalette::Base——底色

QPalette::Button——指按鈕窗口部件的背景色

QPalette::ButtonText——指按鈕窗口部件的前景色

QPalette::Text——文本輸入窗口的前景色

QPalette::Background——背景色

QPalette::Foreground——前景色(界面中文字的統(tǒng)一顏色)

poYBAGMdfcKAeAjxAAEESAzjM_4162.png

界面的顏色

整個UI界面的顏色可以這樣設(shè)置:

QPalette color = palette();//控制窗體顏色
color.setColor(QPalette::Background, QColor(255,255,255));//背景顏色
//color.setColor(QPalette::Foreground, QColor(0,0,255,255));//前景顏色
setPalette(color);

這里就是把整個界面的顏色設(shè)置為純白色

控件的顏色

例如文本標(biāo)簽控件(QLabel)的文字顏色可以這樣設(shè)置:

QPalette pal;
pal.setColor(QPalette::WindowText,Qt::red);
ui->label_R->setPalette(pal); //設(shè)置滑條左側(cè)的R字體為紅色
pal.setColor(QPalette::WindowText,Qt::green);
ui->label_G->setPalette(pal);
pal.setColor(QPalette::WindowText,Qt::blue);
ui->label_B->setPalette(pal);

顏色混合面板控件(QTextBrowser)的面板顏色可以這樣設(shè)置:

QColor color;
int R = ui->Slider_R->value(); //讀取滑條的當(dāng)前值
int G = ui->Slider_G->value();
int B = ui->Slider_B->value();
color.setRgb(R, G, B); //顏色混合
QPalette pal;
pal.setColor(QPalette::Base, color);
ui->textBrowser->setPalette(pal); //顯示到面板上

1.3 滑條UI界面代碼編寫

構(gòu)造函數(shù)

LedWidget::LedWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LedWidget)
{
    ui->setupUi(this);
    ui->Value_R->setText(QString::number(ui->Slider_R->value()));
    ui->Value_G->setText(QString::number(ui->Slider_G->value()));
    ui->Value_B->setText(QString::number(ui->Slider_B->value()));

    QPalette color = palette();//控制窗體顏色
    color.setColor(QPalette::Background, QColor(255,255,255));//背景顏色
    setPalette(color);
}

滑條滑動時的槽函數(shù)

void LedWidget::on_Slider_R_valueChanged(int value)
{
    ui->Value_R->setText(QString::number(value));
    UpdateShowColor();
}

void LedWidget::on_Slider_G_valueChanged(int value)
{
    ui->Value_G->setText(QString::number(value));
    UpdateShowColor();
}

void LedWidget::on_Slider_B_valueChanged(int value)
{
    ui->Value_B->setText(QString::number(value));
    UpdateShowColor();
}

更新RGB三種顏色的混合顯示

void LedWidget::UpdateShowColor()
{
    QColor color;
    int R = ui->Slider_R->value();
    int G = ui->Slider_G->value();
    int B = ui->Slider_B->value();
    color.setRgb(R, G, B);
    QPalette pal;
    pal.setColor(QPalette::Base, color);
    ui->textBrowser->setPalette(pal);
}

2 板子上RGB LED的控制

2.1 i.MX6ULL系統(tǒng)燒錄

本篇的RGB LED測試,需要先燒錄野火i.MX6ULL自帶的系統(tǒng)固件,因為該系統(tǒng)已有Qt運行環(huán)境,且對應(yīng)的RGB LED的驅(qū)動程序也已配置好了,這樣就不需要再自己寫RGB LED的驅(qū)動程序了,我們只寫好Qt的應(yīng)用程序,實現(xiàn)對板子上LED的控制即可。

燒寫方法可參考:https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/install_debian/install_debian.html#

可以燒寫到SD卡中

pYYBAGMdfgSACrnKAACTkTa96d4833.png

燒寫到eMMC中

因為在SD卡中運行系統(tǒng),無法使用WIFI連網(wǎng),可以通過fire-config工具將SD卡的系統(tǒng)燒寫到eMMC中,刷機過程可參考:

https://doc.embedfire.com/linux/imx6/linux_base/zh/latest/linux_basis/fire-config_brief/fire-config_brief.html#id7

poYBAGMdfhGAcnVvAACGz9dHzgg109.png

設(shè)置之后,選擇重啟,重啟后的系統(tǒng)將自動進行從SD卡到EMMC的刷機。刷機過程大約2分鐘左右。刷機完成后,控制臺會重新進入串口登錄頁面, 此時觀察開發(fā)板的LED燈,如果LED在持續(xù)閃爍,說明刷機成功。然后調(diào)整撥碼開關(guān)為相應(yīng)啟動方式,重新上電啟動系統(tǒng)即可。

也可以直接通過USB-OTG接口和 MFGTool2軟件燒寫到eMMC。ssh

燒寫到eMMC啟動,可以使用WIFI連網(wǎng),WIFI配網(wǎng)步驟參考:https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/wifi/wifi.html

Qt系統(tǒng)界面

野火i.MX6ULL自帶的系統(tǒng)固件燒錄后自啟動Qt程序界面如下:

pYYBAGIkn82AU_8qAAK3Luvf9HQ049.png

串口方式登錄時:

普通用戶(帶sudo權(quán)限)

賬戶: debian

密碼: temppwd

ROOT用戶

賬戶: root

密碼: root

這個系統(tǒng)第一次運行時,會進行屏幕觸摸校準(zhǔn),若校準(zhǔn)的不滿意,可刪除掉/etc/pointercal文件后重啟再進行校準(zhǔn)。

rm /etc/pointercal

2.2 無Qt的RGB LED測試

野火i.MX6ULL的RGB LED的原理圖如下,由于驅(qū)動程序不需要自己寫了,實際上我們也不需要關(guān)心具體的硬件引腳是哪個,只需要使用驅(qū)動程序提供的設(shè)備描述符進行LED的控制即可。

poYBAGMdflaAOgfPAABUVVg0r0U427.png

參考野火的測試代碼:https://doc.embedfire.com/linux/imx6/quick_start/zh/latest/quick_start/led_subsystem/led_subsystem.html#id4

測試代碼

編寫自己的沒有Qt界面的RGB LED測試代碼:

#include 
#include 
#include 

#include 
#include 

#define RLED_DEV_PATH "/sys/class/leds/red/brightness"
#define GLED_DEV_PATH "/sys/class/leds/green/brightness"
#define BLED_DEV_PATH "/sys/class/leds/blue/brightness"

int main(int argc,int *argv[])
{
    int r_fd;
    int g_fd;
    int b_fd;

    r_fd = open(RLED_DEV_PATH,O_WRONLY);
    if(r_fd < 0)
    {
        perror(RLED_DEV_PATH);
        exit(1);
    }
    
    g_fd = open(GLED_DEV_PATH,O_WRONLY);
    if(r_fd < 0)
    {
        perror(GLED_DEV_PATH);
        exit(1);
    }
    
    b_fd = open(BLED_DEV_PATH,O_WRONLY);
    if(r_fd < 0)
    {
        perror(BLED_DEV_PATH);
        exit(1);
    }

    while(1)
    {
        write(r_fd,"255",3);
        sleep(1);
        write(r_fd,"0",3);
        sleep(1);
        
        write(g_fd,"255",3);
        sleep(1);
        write(g_fd,"0",3);
        sleep(1);
        
        write(b_fd,"255",3);
        sleep(1);
        write(b_fd,"0",3);
        sleep(1);
    }

    close(r_fd);
    close(g_fd);
    close(b_fd);
}

將該程序在Ubuntu進行交叉編譯

arm-linux-gnueabihf-gcc led_noqt.c -o led_noqt

測試效果

運行效果如下,3種顏色的燈每隔1s依次點亮熄滅:

poYBAGMdfzSAKW--ACOOa4XRnrg378.png

對于亮度的控制,可以先參考教程中的命令行點燈測試: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的效果一樣,都是同樣的亮度,不知道是硬件的問題還是軟件驅(qū)動的問題。

2.3 Qt中移植RGB LED控制代碼

在滑條UI界面代碼工程的基礎(chǔ)上,添加一個自定義的類,名字可起為regled:

pYYBAGMdfn2AKCK_AAAWOsYrmmI236.png

然后在這個類中,將無Qt的RGB LED測試用到的代碼移植進來,并結(jié)合Qt的滑動條對三種顏色的燈進行控制。

這個是構(gòu)造函數(shù),先打開3個LED燈的文件描述符:

rgbled::rgbled(QObject *parent) : QObject(parent)
{
    r_fd = open(RLED_DEV_PATH,O_WRONLY);
    if(r_fd < 0)
    {
        return;
    }

    g_fd = open(GLED_DEV_PATH,O_WRONLY);
    if(r_fd < 0)
    {
        return;
    }

    b_fd = open(BLED_DEV_PATH,O_WRONLY);
    if(r_fd < 0)
    {
        return;
    }
}

編寫一個RGB燈的顏色和亮度的控制函數(shù),供外部調(diào)用:

void rgbled::SetRGBLedValue(LED_TYPE type, int val)
{
    if (val > 255)
    {
        val = 255;
    }
    else if (val < 0)
    {
        val = 0;
    }

    std::string value = std::to_string(val);

    switch (type)
    {
        case T_R_LED:
            write(r_fd, value.c_str(), 3);
        break;

        case T_G_LED:
            write(g_fd, value.c_str(), 3);
        break;

        case T_B_LED:
            write(b_fd, value.c_str(), 3);
        break;

        default:break;
    }
}

在UI界面類中,可以對RGB LED進行控制:

//LedWidget類中定義一個rgbled成員變量
rgbled *m_pRGBLed;

//LedWidget構(gòu)造函數(shù)中實例化一個rgbled對象
m_pRGBLed = new rgbled(this);

在更新UI界面上的模擬顏色面板的同時,也將板子上的RGB LED的亮度進行同步控制:

void LedWidget::UpdateShowColor()
{
    QColor color;
    int R = ui->Slider_R->value();
    int G = ui->Slider_G->value();
    int B = ui->Slider_B->value();
    color.setRgb(R, G, B);
    QPalette pal;
    pal.setColor(QPalette::Base, color);
    ui->textBrowser->setPalette(pal);

    //控制板子上的RGB LED的亮度
    m_pRGBLed->SetRGBLedValue(T_R_LED, R);
    m_pRGBLed->SetRGBLedValue(T_G_LED, G);
    m_pRGBLed->SetRGBLedValue(T_B_LED, B);
}

2.4 編譯時遇到的問題

程序首先在Windows的Qt Creator上進行編譯,遇到了一些問題,記錄下解決方法。

找不到unistd.h

在Windows中編譯時,Qt Creater提示找不到unistd.h,這個其實是Visual Stidio編譯器找不這個頭文件。

這個頭文件都是Linux系統(tǒng)中常用的,Windows中一般用不到,要消除這個編譯錯誤,可以在VS的安裝目錄手動添加一個這個文件。

我的目錄是:

D:\Tools1\vs2015\VC\include

新建一個unistd.h:

//for qt creater, 2022/8/13
#ifndef _UNISTD_H
#define _UNISTD_H
#include 
#include 
#endif 

open、write等函數(shù)的警告提示

這些也是Linux中用到的函數(shù),在Window平臺編譯只是警告信息,沒有報錯,可以不用管

poYBAGMdfqiAb96tAABlhZ5QvZo814.png

3 實驗演示

3.1 交叉編譯

和之前一樣,將Windows的Qt Creator中的源碼復(fù)制到Ubuntu中進行交叉編譯,具體操作過程可參考之前的文章:

嵌入式Qt-動手編寫并運行自己的第1個ARM-Qt程序

這里僅記錄下編譯指令:

/home/xxpcb/myTest/imx6ull/otherlib/qt/qt-everywhere-src-5.12.9/arm-qt/bin/qmake

3.2 文件復(fù)制到板子中

由于這次測試使用的是野火的系統(tǒng)固件,不能和之前用網(wǎng)絡(luò)位置掛載根文件系統(tǒng)的方式,在Ubuntu中直接將文件復(fù)制到板子中(Ubuntu中的網(wǎng)絡(luò)掛載位置),因此本篇需要使用其它的方法將Ubuntu中編譯的文件復(fù)制到板子中。

這里使用SSH的方式進行拷貝,首先要在Ubuntu中和i.MX6ULL板子中配置SSH功能,配置方法如下:

配置ssh

sudo apt update
sudo apt install openssh-server -y
sudo systemctl status ssh #查看狀態(tài)
# 如果你的防火墻開啟了,使用下面語句
sudo ufw allow ssh

連接方式

基本的ssh連接方法是:

ssh username@ip

username表示該機器的用戶名,ip表示對應(yīng)的ip地址

ssh方式文件復(fù)制

從Ubuntu拉取文件到板子中

# 從服務(wù)器拉取文件
# scp 服務(wù)器上的某個用戶@服務(wù)器IP::/服務(wù)器文件存放路徑 拉取文件保存路徑
scp server_user_name@192.168.1.101:server_file_path local_path

# 我的板子的拉取命令
cd /usr/local/qt-app/mytest/
scp xxpcb@192.168.5.104:~/myTest/imx6ull/qt-test/4-led/led ./
pYYBAGMdfseAP1umAADa0MvnwFQ933.png

3.3 測試效果

在測試自己的例程之前,需要先將野火的自啟動Qt例程kill掉,否則兩個Qt程序會同步運行互相遮擋。

kill掉自啟動Qt程序

通過ps 、top 等命令查詢到ebf-qtdemo的pid,然后通過kill命令停止App運行

#879 為當(dāng)前 App 的 PID 值,每次可能不一樣
sudo kill 879

運行自己的Qt程序

野火的系統(tǒng)中,提供了一個運行腳本run_myapp.sh,需要調(diào)用這個腳本來運行自己的Qt程序

sudo /usr/local/qt-app/run_myapp.sh /usr/local/qt-app/Control_1
pYYBAGMdfs6AN6bTAABLRZoaosk451.png

實際測試效果如下:

可以看出:

板子上的LED的亮度其實不能調(diào)節(jié),只能亮或滅,需要確認(rèn)下是不是LED驅(qū)動的問題

觸摸的方式拖動板子上的滑條,不太靈活,可能是觸摸和鼠標(biāo)都在起作用,兩者干擾了

Qt界面中模擬的顏色混合面板,顏色混合顯示正常

4 總結(jié)

本篇介紹了通過Qt中滑條的使用,并使用滑條來控制i.MX6ULL板子中RGB三個顏色LED的亮滅。通過燒錄野火自帶的系統(tǒng)固件,使用系統(tǒng)提供的LED驅(qū)動程序,再配置自己編譯的Qt應(yīng)用程序,來實現(xiàn)整個功能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5046

    文章

    18821

    瀏覽量

    298673
  • Qt
    Qt
    +關(guān)注

    關(guān)注

    1

    文章

    300

    瀏覽量

    37606
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式Qt-表格使用測試

    本篇介紹了Qt中QTable Widget這個表格組件的使用,后續(xù)可增加SQLite數(shù)據(jù)庫功能,利用表格可以直觀的展示出嵌入式設(shè)備的數(shù)據(jù)庫中的數(shù)據(jù)信息。
    的頭像 發(fā)表于 05-14 12:27 ?1418次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Qt-</b>表格使用測試

    基于Qt/Embedded的嵌入式控制界面是怎樣開發(fā)的?

    基于Qt/Embedded的嵌入式控制界面是怎樣開發(fā)的?嵌入式控制界面有什么優(yōu)點?
    發(fā)表于 04-27 06:43

    嵌入式QT的內(nèi)核分析與優(yōu)化

    本文給出了QT嵌入式版本(QT/E)與其它嵌入式GUI 工具箱在性能、結(jié)構(gòu)上的比較,從宏觀上分析了QT/E 的優(yōu)點及不足之處,對
    發(fā)表于 06-22 08:30 ?17次下載

    基于Qt/Embedded的嵌入式控制界面開發(fā)

    作者通過結(jié)合Qt/Embedded的特性和優(yōu)點,提出用Qt/Embedded實現(xiàn)風(fēng)力發(fā)電控制系統(tǒng)的圖形界面的思路和設(shè)計原則,重點介紹了在嵌入式Linux內(nèi)核基礎(chǔ)上
    發(fā)表于 08-12 10:14 ?48次下載

    嵌入式Linux智能家居控制系統(tǒng)設(shè)計

    隨著嵌入式技術(shù)、網(wǎng)絡(luò)及信息技術(shù)的發(fā)展,針對人們對智能家居的追求,提出了一種基于ARM9的嵌入式智能家居控制系統(tǒng)的解決方案。介紹了嵌入式Linux系統(tǒng)的軟
    發(fā)表于 03-07 15:25 ?1103次下載
    <b class='flag-5'>嵌入式</b>Linux智能家居<b class='flag-5'>控制</b>系統(tǒng)設(shè)計

    Qt嵌入式圖形開發(fā)(基礎(chǔ)篇)

    Qt嵌入式圖形開發(fā)(基礎(chǔ)篇)對Qt/embedded來說是很好的入門和提高教程
    發(fā)表于 12-16 17:14 ?51次下載

    Qt控制LED例程

    Qt控制LED例程
    發(fā)表于 12-14 18:11 ?29次下載

    嵌入式linux安裝qt

    嵌入式linux部署qt幾個疑問在windows系統(tǒng)里編好的QT程序,經(jīng)過交叉編譯后能直接運行在板子上嗎?還是板子需要弄個QT環(huán)境啥的?就是往里面安個相同版本的
    發(fā)表于 10-20 18:06 ?6次下載
    <b class='flag-5'>嵌入式</b>linux安裝<b class='flag-5'>qt</b>

    嵌入式Linux的Qt

    嵌入式Linux的Qt嵌入式Linux的Qt配置特定設(shè)備嵌入式Linux設(shè)備的平臺插件EGLFSLinuxFB輸入使用libinput鼠標(biāo)M
    發(fā)表于 11-01 17:06 ?3次下載
    <b class='flag-5'>嵌入式</b>Linux的<b class='flag-5'>Qt</b>

    嵌入式Linux的QT版本,嵌入式Linux版本Qt5.4快速部署

    關(guān)鍵詞:摘要:Qt是一個領(lǐng)先的跨平臺應(yīng)用和UI 開發(fā)框架(Framework),使用標(biāo)準(zhǔn)C++,適用于桌面,嵌入式和移動平臺。本文著重就利用Boot to Qt軟件包來實現(xiàn)Qt5在
    發(fā)表于 11-01 17:20 ?0次下載
    <b class='flag-5'>嵌入式</b>Linux的<b class='flag-5'>QT</b>版本,<b class='flag-5'>嵌入式</b>Linux版本<b class='flag-5'>Qt</b>5.4快速部署

    嵌入式linux安裝qt,嵌入式Linux版本Qt5.4快速部署

    摘要:Qt是一個領(lǐng)先的跨平臺應(yīng)用和UI 開發(fā)框架(Framework),使用標(biāo)準(zhǔn)C++,適用于桌面,嵌入式和移動平臺。本文著重就利用Boot to Qt 軟件包來實現(xiàn)Qt5在
    發(fā)表于 11-02 10:51 ?0次下載
    <b class='flag-5'>嵌入式</b>linux安裝<b class='flag-5'>qt</b>,<b class='flag-5'>嵌入式</b>Linux版本<b class='flag-5'>Qt</b>5.4快速部署

    Qt 嵌入式圖形開發(fā)大全和QT開發(fā)手冊

    Qt 嵌入式圖形開發(fā)大全和QT開發(fā)手冊,感覺這個資料會很多人要,畢竟學(xué)習(xí)嵌入式的人還蠻多的,各種找嵌入式的資料,今天給大家真理了這個
    發(fā)表于 11-03 09:51 ?21次下載
    <b class='flag-5'>Qt</b> <b class='flag-5'>嵌入式</b>圖形開發(fā)大全和<b class='flag-5'>QT</b>開發(fā)手冊

    最簡單DIY基于ESP8266的智能彩燈②(在網(wǎng)頁用按鍵和滑動控制RGB

    滑動控制RGB)文章目錄ESP8266和ESP32智能彩燈開發(fā)系列文章目錄前言一、最簡單DIY基于ESP8266的智能彩燈②(在網(wǎng)頁用
    發(fā)表于 12-29 19:02 ?7次下載
    最簡單DIY基于ESP8266的智能彩燈②(在網(wǎng)頁用按鍵和<b class='flag-5'>滑動</b><b class='flag-5'>條</b><b class='flag-5'>控制</b><b class='flag-5'>RGB</b><b class='flag-5'>燈</b>)

    Arduino控制RGB LED

    電子發(fā)燒友網(wǎng)站提供《Arduino控制RGB LED.zip》資料免費下載
    發(fā)表于 12-29 11:39 ?4次下載
    Arduino<b class='flag-5'>控制</b>的<b class='flag-5'>RGB</b> LED<b class='flag-5'>燈</b><b class='flag-5'>條</b>

    使用Arduino的Android控制RGB LED

    電子發(fā)燒友網(wǎng)站提供《使用Arduino的Android控制RGB LED.zip》資料免費下載
    發(fā)表于 07-05 09:45 ?2次下載
    使用Arduino的Android<b class='flag-5'>控制</b><b class='flag-5'>RGB</b> LED<b class='flag-5'>燈</b><b class='flag-5'>條</b>