GPIO 入门指南

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或一个按钮。


祝您实验愉快!

发表评论