GPIO 入门指南
在这篇博文中,你将了解有关Raspberry Pi的GPIO引脚的一切。这篇文章特别适合电子学方面的新手。
首先是警告:
如果引脚使用不当,Raspberry Pi可能会受到不可修复的损坏。所以一定要确保你的电路是正确的,而且要使用足够的电阻。
什么是GPIO引脚
GPIO引脚是Raspberry Pi顶部的40个小金属引脚。缩写GPIO代表通用输入输出。这意味着GPIO引脚可以用作几乎任何电子设备的接口。
由于有大量的方法可以(错误地)使用引脚,开始时可能有点混乱。因此,这篇博文提供了一些关于如何使用Bash、C和Python控制引脚的例子。所以有一点编程经验是很有优势的。
尽管这40个引脚看起来是一样的,但它们有不同的功能。26个引脚可用于GPIO,有些还有其他功能。另外4个引脚用作电源(POWER,2次3V3和2次5V),8个作为负极(也是地或GROUND)。剩下的两个引脚是ID EEPROM的I2C接口。
引脚分布
下面的图形显示了最重要的信息,其中包括引脚分布。大多数Raspberry Pi型号的引脚排列是相同的,但也有不同之处。在连接一个设备之前,一定要检查你的型号的确切引脚分布。为此,你只需在你的Raspberry Pi上打开一个终端(Ctrl+Alt+t)并执行以下命令。
pinout
你会看到一个所有连接的图形和你的Raspberry Pi的确切引脚分布。
你可能已经注意到,GPIO的编号是随机出现的,与引脚的编号不一致。为了避免混淆,我把1到40的编号称为BOARD编号,把1到26的编号称为BCM或GPIO编号。
所以电路板的1号针脚是3V3电源接口,GPIO 2号针脚是它旁边的电路板3号针脚。
如何将一个设备连接到引脚上
有几种方法可以将一个设备连接到GPIO引脚上。有些设备有一个GPIO头,这样设备就可以直接插入GPIO引脚。然而,一般来说,情况并非如此,这就是为什么要使用跳线或GPIO延长线。
观察 我们的视频 关于GPIO引脚!
在下面的例子中,一个LED用跳线连接到Raspberry Pi上。
电路
雌性到雄性跳线将GPIO引脚连接到一个接头或面包板上。然后必须对该引脚进行编程以操作设备。该设备可以是一个按钮、一个LED、一个传感器、一个电机或一个显示器。唯一重要的是,该设备可以在5伏或更低的电压下运行,并且与I2C、SPI或UART接口兼容。
对于施工,我们需要以下设备。
- 带有树莓派操作系统的树莓派
- 两根公到母的跳线
- 一条公对公跳线
- 10千欧姆电阻
- LED
- 无焊料面包板
将GPIO针脚13(电路板编号33)连接到 +条 和旁边的GROUND针脚(电路板编号34)到 - 剥离 面包板上的。然后将10千欧姆的电阻(任何电阻)的一端插入 +条 另一端插入其中一个横条。对于LED来说,方向是至关重要的。阳极是两个臂中较长的一个,通常是弯曲的,阴极是较短的那个臂。阳极必须始终指向 + 方向,即朝向电源,而阴极在 – 方向,即朝向GROUND。因此,将长臂放在与电阻相同的横条上,这样短臂就在相邻的横条上。最后,使用公对公跳线将阴极(LED的短臂)的横条连接到 - 剥离.
下图显示了装配情况,请确保所有的东西都是正确的,而且元件要尽可能地插入电路板,否则会出现接触松动。
下面的三个Bash、Python和C语言的代码例子就是基于这种结构。如果你使用其他针脚,你必须相应地修改代码。
巴什
通过Bash控制GPIO引脚是非常容易的。在Linux中,GPIO引脚是由在 /sys/class/gpio 文件夹。要使用一个GPIO引脚,必须先将其导出。作为一个例子,我使用GPIO引脚13。在下文中,文件名是粗体和斜体的。
打开一个终端,列出gpio文件夹的内容。
cd /sys/class/gpio
ls
该文件夹包含导出和未导出的文件,以及每个导出的GPIO引脚的子文件夹。
我们通过将GPIO编号写到 /sys/class/gpio/export 文件。在终端执行此命令。
echo 13 > /sys/class/gpio/export
ls
现在已经创建了一个对应引脚号为gpio13的文件夹。这个文件夹包含其他文件夹和文件。目前,只有方向和值文件对我们来说是重要的。
ǞǞǞ 方向 文件保存了引脚的模式。
在 -> 引脚处于读取或输入模式
出 -> 引脚处于写入或输出模式
ǞǞǞ 价值 文件存储引脚的电压状态。
0 --引脚处于低电平模式 --引脚无电压输入
1 --引脚处于高电平模式 --电压被施加到引脚上
以下命令将模式设置为 出 和值到 1.
echo out > /sys/class/gpio/gpio13/direction
echo 1 > /sys/class/gpio/gpio13/value
现在LED灯亮了。使用后重置引脚值是很重要的。每次使用后应执行以下命令。
echo 0 > /sys/class/gpio/gpio13/value
echo in > /sys/class/gpio/gpio13/direction
echo 13 > /sys/class/gpio/unexport
Python程序
现在我们在Python中对这些Bash命令进行抽象和自动化。
下面的Python脚本提供了一个简单的 GPIO_Pin 类。这使得它非常容易使用。的。 许可证 模块允许我们在Python中执行与上述相同的bash命令。 此外,通过使用 撤消 方法,我们不再需要手动重置和取消导出引脚。
import os
from time import sleep
class GPIO_Pin:
def __init__(self, num, mode):
if 0 <= num or num <= 40:
self.num = num
else:
print('Invalid Pin Number -> Enter a number from 0 - 40')
if mode == 'out' or mode == 'write':
self.mode = 'out'
elif mode == 'in' or mode == 'read':
self.mode = 'in'
else:
print('Invalid Pin Mode -> Enter "out" or "write" for output, "in" or "read" for input')
if self.num and self.mode:
os.system(f'echo {str(self.num)} > /sys/class/gpio/export')
sleep(0.05)
os.system(f'echo {self.mode} > /sys/class/gpio/gpio{str(self.num)}/direction')
def reset(self):
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
os.system(f'echo in > /sys/class/gpio/gpio{str(self.num)}/direction')
def write(self, value):
if value == 0 or value == 'LOW':
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
elif value == 1 or value == 'HIGH':
os.system(f'echo 1 > /sys/class/gpio/gpio{str(self.num)}/value')
else:
print('Invalid value -> Enter 1 or "HIGH" for HIGH, 0 or "LOW" for LOW')
def __del__(self):
self.reset()
os.system(f'echo {str(self.num)} > /sys/class/gpio/unexport')
def set_mode(self, mode):
self.mode = mode
os.system(f'echo {str(self.mode)} > /sys/class/gpio/gpio{str(self.num)}/direction')
def main():
pin = GPIO_Pin(13, 'out')
number_of_blinks = 10
for i in range(number_of_blinks):
pin.write('HIGH')
sleep(0.5)
pin.write('LOW')
sleep(0.5)
if __name__ == '__main__':
main()
有了时间模块,我们甚至可以毫无问题地使LED闪动。整个脚本可以扩展为一个用于控制GPIO的Python模块。
C计划
同样在C语言中,我们可以轻松地编辑gpio文件夹的内容。使用标准库 ǞǞǞ 我们可以打开文件并改变内容。
下面的C语言程序在执行前必须进行编译。创建一个文件 gpio.c 并将该程序复制到其中。
然后打开一个终端,导航至 gpio.c 文件的位置。使用以下命令来编译和执行程序。
gcc -o gpio gpio.c
./gpio
以下是该计划。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define GPIO_ROOT "/sys/class/gpio"
#define EXPORT "/sys/class/gpio/export"
#define UNEXPORT "/sys/class/gpio/export"
#define LOW 0
#define HIGH 1
int export_pin(int num) {
FILE* export = fopen(EXPORT, "w");
if (export == NULL) {
printf("Failed to open the export file\n");
exit(-1);
}
fprintf(export, "%d", num);
fclose(export);
return 0;
}
int unexport_pin(int num) {
FILE* unexport = fopen(UNEXPORT, "w");
if (unexport == NULL) {
printf("Failed to open the unexport file\n");
exit(-1);
}
fprintf(unexport, "%d", num);
fclose(unexport);
return 0;
}
int set_direction(char *mode, int num) {
char direction_file_path[1024];
snprintf(direction_file_path, sizeof(direction_file_path), "/sys/class/gpio/gpio%d/direction", num);
FILE* direction = fopen(direction_file_path, "w");
if (direction == NULL) {
printf("Failed to open the direction file\n");
exit(-1);
}
fputs(mode, direction);
fclose(direction);
return 0;
}
int set_value(int val, int num) {
char value_file_path[1024];
snprintf(value_file_path, sizeof(value_file_path), "/sys/class/gpio/gpio%d/value", num);
FILE* value = fopen(value_file_path, "w");
if (value == NULL) {
printf("Failed to open the value file\n");
exit(-1);
}
fprintf(value, "%d", val);
fclose(value);
return 0;
}
int main() {
int rslt;
int num;
int num_blinks;
num = 13;
num_blinks = 10;
rslt = export_pin(num);
rslt = set_direction("out", num);
for (int i = 0; i < num_blinks; i++) {
rslt = set_value(HIGH, num);
sleep(1);
rslt = set_value(LOW, num);
sleep(1);
}
rslt = set_value(LOW, num);
rslt = set_direction("in", num);
rslt = unexport_pin(num);
return EXIT_SUCCESS;
}
PiCockpit - GPIO应用
控制GPIO引脚的最简单方法是借助于GPIO应用程序。该应用程序 PiCockpit网络界面 是免费的,最多可用于5个Raspberry Pi。它提供了两个大的优势。你不需要知道编程来控制你的GPIO引脚,而且你可以从任何地方做这个。
只要在你的Raspberry Pi上安装PiCockpit客户端并连接到你的PiCockpit账户。之后,你就可以通过网络界面轻松地控制GPIO引脚。
接下来的步骤
现在你知道如何在跳线的帮助下使用GPIO引脚了。当然,也有外部的Python模块和C库来控制GPIO引脚。一个好的下一步将是扩展其中一个代码例子。例如,通过使用额外的LEDs或一个按钮。
祝您实验愉快!