树莓派Qt开发入门(一):流水灯实验——GPIO的使用

前言

配置好Qt开发环境后,我们就可以进行树莓派的C++开发了。本次我们利用树莓派的GPIO,控制8位LED模块,完成流水灯的控制。
这也是树莓派类似于单片机的一种控制方法,如果你对单片机不陌生的话,相信你很快就可以上手。

基础知识

树莓派GPIO

树莓派 3B+开发板上有 40 个 GPIO 接口,如图所示。
树莓派Qt开发入门(一):流水灯实验——GPIO的使用_第1张图片
GPIO(General Purpose Input/Output)的意思就是通用型输入输出,可以使用第三方库wiringPi进行控制,支持wiringPi Pin和BCM GPIO两种编号。

WiringPi库

当你完成系统和Qt的安装后,第三方的wiringPi库就应该已经安装完成了。或者你可以在终端输入:

sudo apt-get install wiringpi

来进行安装。安装完毕后,可以输入以下指令查看版本号和读取io状态:

gpio -v
gpio readall

之后我们能够在终端中看到如下图所示的GPIO状态图。
树莓派Qt开发入门(一):流水灯实验——GPIO的使用_第2张图片
可以看到BCM编号和wiringPi编号有区别,下面我们会使用wiringPi编号对GPIO进行开发。

8位LED灯模块

本次开发装置采用一个8位 LED 流水灯模块来作为被控对象,完成流水灯的控制。

D0~D7 这8个脚位分别控制这8个LED,所以只要跟树莓派的GPIO数字引脚连接起来就好。另外旁边有三个 RGB 的脚位,需要跟 GND 相连,跟R相连就亮红色,跟G相连就亮绿色,跟B相连就亮蓝色,三个同时连起来就全都亮。
树莓派Qt开发入门(一):流水灯实验——GPIO的使用_第3张图片

开发过程

首先新建一个Qt工程,在pro文件的最后添加一行代码:

LIBS += -lwiringPi
LIBS += -lwiringPiDev

然后在cpp文件中包含wiringPi的头文件:

#include "wiringPi.h"

使用前首先要初始化,在MainWindow的构造函数中添加如下初始化代码:

wiringPiSetup();

若希望将GPIO设定为输入/输出模式,则使用pinMode(pin,mode)来定义,例如将GPIO的0号引脚设定为输出模式:

pinMode(0,OUTPUT);

进行控制时,可以采用自己的控制逻辑编写代码,如:

digitalWrite(0,HIGH);
digitalWrite(0,LOW);

code

下面附上完整的代码
gpio.h

#ifndef GPIO_H
#define GPIO_H

#define D0 0
#define D1 1
#define D2 2
#define D3 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7

void GPIO_init(void);
void GPIO_blink(void)__attribute__((noreturn));

#endif // GPIO_H

gpio.cpp

#include "wiringPi.h"
#include "gpio.h"

static int D[8]={0,1,2,3,4,5,6,7};

void GPIO_init()
{    
	wiringPiSetup();
    	int i;
    	for(i=0;i<8;i++)
		pinMode(D[i],OUTPUT);
}

void GPIO_blink()
{    	
	int i,j;    
	while(1)    
	{        
		for(j=0;j<3;j++)        
		{            
			for(i=0;i<8;i++)                
				digitalWrite(D[i],HIGH);            
			delay(200);            
			for(i=0;i<8;i++)                
				digitalWrite(D[i],LOW);            
			delay(200);        
		}        
		for(i=0;i<8;i++)            
		digitalWrite(D[i],HIGH);        
		for(i=0;i<8;i++)        
		{            
			digitalWrite(D[i],LOW);            
			delay(100);            
			digitalWrite(D[i],HIGH);            
			delay(100);        
		}        
		for(i=0;i<8;i++)        
		{            
			digitalWrite(D[i],LOW);            
			delay(100);        
		}        
		for(i=0;i<8;i++)        
		{            
			digitalWrite(D[i],HIGH);            
			delay(100);        
		}    
	}
}

你可能感兴趣的:(树莓派Qt开发)