当前位置: 首页 > 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文件

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

http://www.lryc.cn/news/546185.html

相关文章:

  • 基于Android平台的SOME/IP测试模块 EPT-ETS
  • QT实现计算器
  • Go红队开发—语法补充
  • 二、Redis 安装与基本配置:全平台安装指南 服务器配置详解
  • halcon学习笔记1
  • 解决Docker拉取镜像超时错误,docker: Error response from daemon:
  • Masscan下载Linux安装
  • js的简单介绍
  • 神经网络 - 激活函数(Swish函数、GELU函数)
  • 关于后端使用Boolean或boolean时前端收到的参数的区别
  • 笔记:代码随想录算法训练营第35天: 01背包问题 二维、 01背包问题 一维 、LeetCode416. 分割等和子集
  • 安装 Windows Docker Desktop - WSL问题
  • Spring MVC 返回数据
  • QT-信号与槽
  • 版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点
  • 迷你世界脚本方块接口:Block
  • 打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第一天)
  • Docker项目部署-部署前端
  • 【向量数据库Weaviate】与ChromaDB的差异、优劣
  • 2024华为OD机试真题-热点网站统计(C++)-E卷-100分
  • 【大模型】大模型分类
  • Redis 的几个热点知识
  • 【新手入门】SQL注入之getshell(木马)
  • 【pytest框架源码分析二】pluggy源码分析之add_hookspecs和register
  • 四、数据存储
  • 【原创】Ollama Test API For Linux/MacOS/Unix
  • LeetCode-Hot100-005盛最多水的容器
  • 电源测试系统有哪些可以利用AI工具的科技??
  • 【3-3】springcloud
  • Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)