树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

article/2025/4/21 21:09:43

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79758560
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...(点击传送门)

树莓派开发专栏(点击传送门)

上一篇:《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上) 》

下一篇:《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)》

 

前话

搭建好完整的Qt开发环境,对于开发Qt应用按照正常的开发即可,操作io口涉及到单片机硬件知识,本篇介绍树莓派类似于单片机的GPIO口使用(硬件+软件)。

 

树莓派GPIO口硬件资源介绍

引脚分布和功能图

统计下硬件资源

  • GPIO引脚 x 26
  • UART总线 x 1
  • SPI总线 x 1
  • I2C总线 x 1
  • 5V x 2
  • 3.3V x 2
  • GND x 8

 

模块化代码

我们模块化代码,写一个引脚输出的程序,以后需要类似直接修改引脚编号(或枚举)即可。

引入libwiringPi库。

 

关于wiringPi库

在qt中控制GPIO主要是使用wiring,树莓派已自带,我们查询树莓派的物理引脚与wiringPi库的编号对应表,如下图:

如果我们要操作GPIO2,对应的物理引脚为3,如下图:

我们操作引脚的时候,引脚序号就为8(wPI),当前模式为输出,V代表的是当前的输入电压,1:3.3V,0:0V。

更详细的具体参照Demo1理解。

同时,我们在工程中要加入对应的头文件和库,如何调用wiringPi,请参照具体例程。

 

Demo1:GPIO口的输出

使用物理引脚3,默认功能为GPIO2,我们使用GPIO2驱动LED,此时涉及到硬件知识,树莓派的GPIO口的输出电压为3.3V,所以先设置GPIO为输出高低电平,间隔1s,因为是测试,不使用限流电阻。

限流电阻解释下:电路VCC--->电阻R--->LED--->GND,LED分压为固定的,VCC减去LED压降后得到的电压除以电阻R则是该条电路的电流,所以电阻决定了电流大小,故称之为限流电阻,一般的GPIO口都对电流有要求,例如stm32的单个GPIO口不超过25mA,总的电流也有限制,所以在开发的过程中,需要根据实际情况设计电路原理图。

电路原理图

跳线的电路原理图如下:

关键代码

初始化

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);_gpioOut.init(GpioOut::GPIO2, false);ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("green"));startTimer(1000);
}

每1s钟切换

void MainWindow::timerEvent(QTimerEvent *event)
{if(_gpioOut.readOutput(GpioOut::GPIO2)){_gpioOut.setOutput(GpioOut::GPIO2, false);ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("green"));}else{_gpioOut.setOutput(GpioOut::GPIO2, true);ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg("red"));}
}

模块代码

gpiocout.h

#ifndef GPIOOUT_H
#define GPIOOUT_H
#include <QObject>
#include <QMap>
#include <QDebug>
#include "wiringPi.h"
class GpioOut : public QObject
{Q_OBJECT
public:enum GPIO{GPIO2  = 3,};
public:explicit GpioOut(QObject *parent = 0);
public slots:void init(GPIO pin, bool output = false);void setOutput(GpioOut::GPIO pin, bool output);bool readOutput(GpioOut::GPIO pin);
private:QMap<GPIO, int> _mapPhysical2Wiring;
};
#endif // GPIOOUT_H
gpioout.cpp
#include "gpioout.h"
GpioOut::GpioOut(QObject *parent) : QObject(parent)
{wiringPiSetup();_mapPhysical2Wiring.insert(GPIO2, 8);
}
void GpioOut::init(GpioOut::GPIO pin, bool output)
{pinMode(_mapPhysical2Wiring.value(pin), OUTPUT);digitalWrite(_mapPhysical2Wiring.value(pin), output?HIGH:LOW);
}
void GpioOut::setOutput(GpioOut::GPIO pin, bool output)
{digitalWrite(_mapPhysical2Wiring.value(pin), output?HIGH:LOW);
}
bool GpioOut::readOutput(GpioOut::GPIO pin)
{return digitalRead(_mapPhysical2Wiring.value(pin));
}

运行效果

 

Demo2:GPIO口的输入

使用物理引脚3,默认功能为GPIO2,我们使用GPIO2接受输入,此时涉及到硬件知识,让树莓派的GPIO口的输入电压为3.3V/0V即为输入1还是输入0,也涉及到限流电阻,一般使用1K或者10K的,因为是测试,此处不使用限流电阻,在开发的过程中,需要根据实际情况设计电路原理图。

电路原理图

关键代码

初始化

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);_gpioIn.init(GpioIn::GPIO2);bool in = _gpioIn.readOutput(GpioIn::GPIO2);ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg(in?"red":"green"));startTimer(1000);
}

每一秒钟检测一次

void MainWindow::timerEvent(QTimerEvent *event)
{bool in = _gpioIn.readOutput(GpioIn::GPIO2);ui->label_gpio2->setStyleSheet(QString("background-color: %1").arg(in?"red":"green"));
}

模块代码

gpioin.h

#ifndef GPIOIN_H
#define GPIOIN_H
#include <QObject>
#include <QMap>
#include <QDebug>
#include "wiringPi.h"
class GpioIn : public QObject
{Q_OBJECT
public:enum GPIO{GPIO2  = 3,};
public:explicit GpioIn(QObject *parent = 0);
public slots:void init(GPIO pin);bool readOutput(GpioIn::GPIO pin);
private:QMap<GPIO, int> _mapPhysical2Wiring;
};
#endif // GPIOIN_H
gpioin.h
#include "gpioin.h"
GpioIn::GpioIn(QObject *parent): QObject(parent)
{wiringPiSetup();_mapPhysical2Wiring.insert(GPIO2, 8);
}
void GpioIn::init(GpioIn::GPIO pin)
{pinMode(_mapPhysical2Wiring.value(pin), OUTPUT);
}
bool GpioIn::readOutput(GpioIn::GPIO pin)
{return digitalRead(_mapPhysical2Wiring.value(pin));
}

运行效果

 

上一篇:《树莓派开发笔记(四):更便捷的开发,qt远程运行(主机qt开发一键远程运行到目标机上) 》

下一篇:《树莓派开发笔记(六):GPIO口的UART的使用(串口通讯)》

 

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/79758560


http://chatgpt.dhexx.cn/article/TN4H3gcx.shtml

相关文章

树莓派4B引脚定义及运行实例

一、树莓派引脚定义 学习如何用树莓派驱动LED灯时需要先了解树莓派管脚GPIO的编码方式&#xff0c;树莓派的管脚编码方式与51单片机的管脚编码有些不一样&#xff0c;在树莓派的GPIO上分为两种编码方式&#xff0c;分别为BCM和wiringPi编码&#xff0c;不同的编码方式在编写程…

树莓派 串口如何使用 以及树莓派引脚对照表

本文档为个人博客文档系统的备份版本、作者&#xff1a;小游、作者博客&#xff1a;点击访问 树莓派引脚图如下&#xff1a; 默认情况下&#xff0c;树莓派的串口有两个一个分配给蓝牙&#xff0c;另一个是miini串口&#xff0c;不过这个串口几乎不能正常使用&#xff08;树莓…

树莓派引脚介绍与GPIO的初步认识与应用

树莓派引脚介绍与GPIO的初步认识 一&#xff0e;认识GPIO二&#xff0e;Python GPIO三&#xff0e;应用 一&#xff0e;认识GPIO 所谓GPIO&#xff0c;就是“通用输入/输出”接口&#xff0c;树莓派系统中已经编译自带了GPIO的驱动。 树莓派GPIO的编号方式&#xff1a; 1. 功…

树莓派:树莓派的各个引脚

由于第一次接触树莓派&#xff0c;&#xff0c;&#xff0c;emmmm&#xff0c;仔细写&#xff0c;奥里给 3.3V、5V&#xff08;VCC&#xff09;&#xff1a;显然是电源正极啦 GND&#xff1a;接地用&#xff0c;负极负极负极 SDA.0、SDA.1&#xff1a;这个是 I2C&#xff08…

Raspberry Pi 引脚说明

除了供电针脚(包括 GND&#xff0c;3.3V 和 5V )&#xff0c;所有的GPIO针脚均可被用于数字输入或输出。 标记为 SCL&#xff08;串行时钟&#xff09;和SDA&#xff08;串行数据&#xff09;的针脚可被用于 I2C。 标记为 MOSI&#xff0c;MISO 和SCKL 的针脚可以用于连接高速…

基础篇——树莓派通用引脚定义

背景故事 树莓派主板集成了丰富的IO口&#xff0c;可以用于输入输出&#xff0c;通信等功能&#xff0c;常常用于物联网控制、传感器数据交互等方面&#xff0c;这里我们讲解一下怎么使用IO口作为输入输出&#xff0c;并控制一些简单的电路。 引脚直观图 我在网上找到一张非…

硬盘插上出不显示盘符,提示“硬盘必须经过初始化”

一个2T的Seagate希捷移动硬盘&#xff0c;没有怎么用过&#xff0c;在笔记本上拷贝了几个文件就突然消失了&#xff0c;而且再次拔插USB线后发现仍然看不到硬盘盘符。 但发现插上USB线后&#xff0c;任务栏中出现了USB插入硬盘的提示图标&#xff0c;看到这个我放心多了&#x…

磁盘必须经过初始化,逻辑磁盘管理器才能访问——笔记本硬盘作为移动硬盘使用时遇到的问题...

1. 问题描述 把笔记本电脑的硬盘拆出来&#xff0c;套上一个网上买的移动硬盘盒&#xff0c;就是一个移动硬盘了。 我的新的“移动硬盘”在接上别的电脑的时候&#xff0c;无法被识别&#xff0c;如下图。 显示&#xff1a;磁盘需要经过初始化&#xff0c;逻辑磁盘管理器才能访…

磁盘在磁盘管理中显示没有初始化找回文件方案

磁盘没有初始化是因为0号扇区损坏&#xff0c;导致机械硬盘分区表读取不出来&#xff0c;从而机械硬盘出现磁盘没有初始化。 工具/软件&#xff1a;极限数据恢复软件 步骤1&#xff1a;程序打开后&#xff0c;直接双击需要恢复数据的物理盘。 步骤2&#xff1a;等待程序扫描完…

服务器信息未初始化失败怎么办,初始化服务器失败

初始化服务器失败 内容精选 换一换 云服务器新增磁盘&#xff0c;开机自动执行磁盘初始化脚本后&#xff0c;Oralce、MySQL和SQL Server等数据库系统日志Msg 823错误 。磁盘初始化脚本WinVMDataDiskAutoInitialize.ps1执行过程中会调用diskpart启用virtual disk服务&#xff0c…

计算机管理 没有初始化,win7系统电脑新增的硬盘没有初始化的解决方法

win7系统想必大家都非常熟悉吧&#xff0c;然而有时候可能会碰到win7系统电脑新增的硬盘没有初始化的情况&#xff0c;想必大家都遇到过win7系统电脑新增的硬盘没有初始化的情况吧&#xff0c;那么应该怎么处理win7系统电脑新增的硬盘没有初始化呢&#xff1f;我们依照  1、当…

服务器一直显示初始化,服务器一直初始化内存

服务器一直初始化内存 内容精选 换一换 本文以云服务器的操作系统为“Windows Server 2012 R2 Standard 64bit”、磁盘容量为3 TB举例&#xff0c;提供容量大于2 TB的Windows数据盘的初始化操作指导。MBR格式分区支持的磁盘最大容量为2 TB&#xff0c;GPT分区表最大支持的磁盘容…

windows下初始化格式化磁盘

新买来的硬盘是未初始化的&#xff0c;以我的理解就是没有引导扇区的&#xff0c;通常是没有MBR&#xff0c;如下图磁盘1&#xff0c;右边有大小&#xff0c;但显示“未分配”&#xff0c; 左边显示“没有初始化”&#xff0c; 点鼠标右键就可以【初始化磁盘】。 初始化时可以…

RAID初始化过程

RAID系统是用来对存储数据进行数据保护的有效手段。 在RAID创建过程中往往会存在一个时间极长的系统初始化过程&#xff0c; 为什么RAID初始化过程中会存在这样的一个操作呢&#xff1f; 这个操作对SSD会导致什么方面的影响呢&#xff1f; 传统RAID的基本组织结构如下图所示…

计算机中磁盘管理恢复分区,电脑磁盘修复

硬盘驱动器(Hard-Disk Drive)简称硬盘&#xff0c;是一种主要的电脑存储媒介&#xff0c;由一个或者多个铝制或者玻璃制的碟片组成。这些碟片外覆盖有铁磁性材料。绝大多数硬盘都是固定硬盘&#xff0c;被永久性地密封固定在硬盘驱动器中。现在可移动硬盘越来越普及&#xff0c…

【计算机考研408】磁盘的初始化过程

该图是磁盘物理图 关于磁盘存储器&#xff0c;[柱面号盘面号扇区号]⇔外存块号 注&#xff1a;柱面是相对位置相同的磁道所构成的面 磁盘初始化 低级初始化&#xff08;也称物理格式化&#xff09; &#xff08;1&#xff09;分扇区 &#xff08;2&#xff09;用特殊数据结构…

磁盘显示没有初始化找到数据法子

没有初始化是因为分区表损坏了&#xff0c;导致移动硬盘出现没有初始化。磁盘显示没有初始化找到数据法子 没有初始化是因为分区表损坏了&#xff0c;导致移动硬盘出现没有初始化。磁盘显示没有初始化找到数据法子 工具/软件&#xff1a;光明数据恢复软件 步骤1&#xff1a;…

盘符没有显示,磁盘管理器提示磁盘没有初始化(已解决)

一、问题 插入移动硬盘&#xff0c;文件资源管理器未显示对应的磁盘&#xff0c;拔出硬盘重新插入也没有用。打开磁盘管理&#xff0c;提示磁盘没有初始化&#xff1a; 二、解决方法 右击window图标&#xff0c;打开磁盘管理或者计算机管理&#xff1a; 右击磁盘名称&#xf…

磁盘显示没有初始化恢复数据办法

没有初始化是因为分区表损坏了&#xff0c;导致硬盘出现没有初始化。磁盘显示没有初始化恢复数据办法 工具/软件&#xff1a;光明数据恢复软件 步骤1&#xff1a;软件运行后&#xff0c;直接双击需要恢复文件的磁盘。 步骤2&#xff1a;坐等软件扫描完毕大概需要几分钟到半个…

移动硬盘插上出不显示盘符,提示“硬盘必须经过初始化”

一个2T的Seagate希捷移动硬盘&#xff0c;没有怎么用过&#xff0c;在笔记本上拷贝了几个文件就突然消失了&#xff0c;而且再次拔插USB线后发现仍然看不到硬盘盘符。 但发现插上USB线后&#xff0c;任务栏中出现了USB插入硬盘的提示图标&#xff0c;看到这个我放心多了&#x…