当前位置: 首页 > news >正文

二、QT和驱动模块实现智能家居-----5、通过QT控制LED

在QT界面,我们要实现点击“LED”按钮就可以控制板子上的LED。LED接线图如下:

在Linux 系统里,我们可以使用2种方法去操作上面的LED:

① 使用GPIO SYSFS系统:这需要一定的硬件知识,需要设置引脚的方向、数值。

② 使用驱动程序:无需硬件知识,使用open/read/write接口调用驱动即可。

1、GPIO SYSFS 系统

一个芯片内部,有多个 GPIO 控制器,每个 GPIO 控制器有多个引脚。在 /sys/bus/gpio/devices 目录下,列出了所有的 GPIO 控制器,如下表示有 6 个 GPIO 控制器:

# ls /sys/bus/gpio/devices 
gpiochip0  gpiochip1  gpiochip2  gpiochip3  gpiochip4  gpiochip5 

怎么查看每个GPIO 控制器的详细信息?/sys/class/gpio/gpiochipXXX 下,有这些信息:

ls /sys/class/gpio/gpiochip* -d1  //列出GPIOx的信息

/sys/class/gpio/gpiochip0 
/sys/class/gpio/gpiochip128 
/sys/class/gpio/gpiochip32 
/sys/class/gpio/gpiochip504 
/sys/class/gpio/gpiochip64 
/sys/class/gpio/gpiochip96 
ls /sys/class/gpio/gpiochip0 -1 //列出GPIO0的信息
base      // 这个GPIO控制器的GPIO编号基值 
device 
label     // 名字 
ngpio     // 引脚个数 
power 
subsystem 
uevent 
cat /sys/class/gpio/gpiochip0/label //GPIO0的标签

209c000.gpio 

查看GPIO使用情况,执行如下命令即可:

cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/209c000.gpio, 209c000.gpio: 
 gpio-5   (                    |goodix_ts_int       ) in  hi IRQ 
 gpio-19  (                    |cd                  ) in  hi IRQ 
 gpio-20  (                    |spi_imx             ) out hi 
 
gpiochip1: GPIOs 32-63, parent: platform/20a0000.gpio, 20a0000.gpio: 
 
gpiochip2: GPIOs 64-95, parent: platform/20a4000.gpio, 20a4000.gpio: 
 gpio-68  (                    |lcdif_rst           ) out hi 
 
gpiochip3: GPIOs 96-127, parent: platform/20a8000.gpio, 20a8000.gpio: 
 gpio-110 (                    |User2 Button        ) in  hi IRQ 
 gpio-120 (                    |spi_imx             ) in  lo 
 gpio-122 (                    |spi_imx             ) in  lo 
 
gpiochip4: GPIOs 128-159, parent: platform/20ac000.gpio, 20ac000.gpio: 
 gpio-129 (                    |User1 Button        ) in  hi IRQ 
 gpio-130 (                    |goodix_ts_rst       ) out hi 
 gpio-133 (                    |sysfs               ) out hi 
 gpio-134 (                    |phy-reset           ) out hi 
 gpio-135 (                    |spi32766.0          ) out hi 
 gpio-136 (                    |?                   ) out lo 
 gpio-137 (                    |phy-reset           ) out hi 
 gpio-138 (                    |spi4                ) out hi 
 gpio-139 (                    |spi4                ) out lo 

2、通过SYSFS使用GPIO

1.)确定GPIO编号

查看每个/sys/class/gpio/gpiochipXXX目录下的label,确定是你要用的GPIO控制器,也称为GPIO Bank。 根据它名字gpiochipXXX,就可以知道基值是XXX基值加上引脚offset,就是这个引脚的编号。

注:对于GPIOx_y,一般有一个公式:编号=(x-1)*32+y。x从1开始。 在IMX6ULL的原理图里,LED使用的引脚是GPIO5_3,它的编号为:(5-1)*32+3=131。

2) 导出/设置方向/读写值

举例:IMX6ULL使用的GPIO5_3引脚编号是131,可以如下操作:

echo 131 > /sys/class/gpio/export 
echo out > /sys/class/gpio/gpio131/direction 
echo 1 > /sys/class/gpio/gpio131/value 
echo 131 > /sys/class/gpio/unexport 

如果GPIO5_3是按键,可以如下读取它的值:

echo 131 > /sys/class/gpio/export 
echo in > /sys/class/gpio/gpio131/direction 
cat /sys/class/gpio/gpio131/value 
echo 131 > /sys/class/gpio/unexport 

3)编写应用程序

打开QT在原文件Sources内新建一个led.cpp

①按键初始化程序

void LED_Init(void)
{
    static int fd;
        fd = open("/sys/class/gpio/export", WRONLY);
        if(fd < 0)
{
        qDebug() << "open /sys/class/gpio/export error";
        return;
}
        write(fd, "131\n", 4);
        close(fd);
        fd = open("/sys/class/gpio/export", WRONLY);
        if(fd < 0)
{
        qDebug() << "open /sys/class/gpio/gpio131/direction error";
        return;
}
        write(fd, "out\n", 4);
        close(fd);
}

②:按键控制程序

void LED_Control(int on)
{
    static fd = -1;
    if(fd == -1)
{
       fd = open("/sys/class/gpio/gpio131/value", O_RDWR);
        return;
}
    if(fd < 0)
{
        qDebug() << "open /sys/class/gpio/gpio131/valuen error";
        return;
}
    if(on)
{
        write(fd, "0\n", 2);
}
else
{
        write(fd, "1\n", 2);
}
}

然后在Header文件下编写led.h文件

最后主函数调用初始化程序,主窗函数调用控制函数。

相关文章:

  • Python 课堂点名桌面小程序
  • spark 虚拟机基本命令(2)
  • 深入解析Java虚拟机(JVM)的核心组成
  • 2025-03-03 学习记录--C/C++-PTA 7-38 数列求和-加强版
  • 探索Elasticsearch:索引的CRUD
  • DeepSeek系列 清华大学-AIGC发展研究3.0版 pdf完整版(附下载)
  • Qt:day1
  • 聆听PostgreSQL数据库的使用
  • 【音视频】视频基本概念
  • 27、Java 反射机制
  • LeetCode 225. 用队列实现栈 java题解
  • 《2025软件测试工程师面试》性能测试面试篇
  • C++知识整理day10——多态(多态的定义和实现、虚函数重写/覆盖、override和final关键字、纯虚函数和抽象类、多态的原理)
  • macOS skhd+ yabai
  • 动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南
  • 标签的ref属性 vue中为什么不用id标记标签
  • RTC、直播、点播技术对比|腾讯云/即构/声网如何选型 — 2025 版
  • centos虚拟机安装
  • 嵌入式学习笔记-卡尔曼滤波,PID,MicroPython
  • 一、图形图像的基本概念
  • 2025年“新时代网络文明公益广告”征集展示活动在沪启动
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应
  • 观察|本轮印巴冲突或促使印度空军寻求更先进战机
  • 七部门:进一步增强资本市场对于科技创新企业的支持力度
  • 马上评|“为偶像正名”的正确做法是什么
  • 某博主遭勒索后自杀系自导自演,成都警方立案调查