【RPi树莓派使用指南】树莓派接口定义及GPIO驱动方法

  版权信息:
● 本博客使用CC 3.0协议,转载请保留该信息。
● 原文作者: 戴晓天 @ 云飞机器人实验室
● 原文地址: 【RPi树莓派使用指南】树莓派接口定义及GPIO驱动方法

• 树莓派GPIO介绍

树莓派包含8个通用IO (GPIO) 用于开关控制 (switch control),配合扩展版可以进行继电器、电机、LED等外设的驱动。该扩展IO的位置如下所示:

1330870446_80fd3de
Figure 1. 树莓派1扩展IO在板上的位置

树莓派的各引脚功能定义如下,其中横线下方为RPi B+,2,3新增加的GPIO:

+-------+---------+-------------+-----+-----+------------+----------+--------+
| BCM   | WIRING  | FUNCTION    | PIN | PIN | FUNCTION   | WIRING   | BCM    |
+-------+---------+-------------+-----+-----+------------+----------+--------+
|       |         | 3v3         | 1   | 2   | 5v         |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 2     | 8       | SDA1        | 3   | 4   | 5v         |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 3     | 9       | SCL1        | 5   | 6   | GND        |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 4     | 7       | GPCLK0      | 7   | 8   | TXD0       | 15       | 14     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
|       |         | GND         | 9   | 10  | RXD0       | 16       | 15     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 17    | 0       |             | 11  | 12  | PWM0       | 1        | 18     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 27    | 2       |             | 13  | 14  | GND        |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 22    | 3       |             | 15  | 16  |            | 4        | 23     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
|       |         | 3v3         | 17  | 18  |            | 5        | 24     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 10    | 12      | MOSI0       | 19  | 20  | GND        |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 9     | 13      | MISO0       | 21  | 22  |            | 6        | 25     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 11    | 14      | SCLK0       | 23  | 24  | CE0        | 10       | 8      |
+-------+---------+-------------+-----+-----+------------+----------+--------+
|       |         | GND         | 25  | 26  | CE1        | 11       | 7      |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| ----- | ------- | ----------- | --- | --- | ---------- | -------- | ------ |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 0     | 30      | SDA0        | 27  | 28  | SCL0       | 31       | 1      |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 5     | 21      | GPCLK1      | 29  | 30  | GND        |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 6     | 22      | GPCLK2      | 31  | 32  | PWM0       | 26       | 12     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 13    | 23      | PWM1        | 33  | 34  | GND        |          |        |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 19    | 24      | MISO1       | 35  | 36  |            | 27       | 16     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
| 26    | 25      |             | 37  | 38  | MOSI1      | 28       | 20     |
+-------+---------+-------------+-----+-----+------------+----------+--------+
|       |         | GND         | 39  | 40  | SCLK1      | 29       | 21     |
+-------+---------+-------------+-----+-----+------------+----------+--------+

目前有三种方式可以实现对树莓派GPIO的驱动:raspberry-gpio-pythonWiringPibcm2835驱动库,以下将分别介绍这三种方法。注意因为涉及硬件操作,程序执行时需要使用管理员权限sudo;同时注意各函数库使用的IO引脚号不同,编程时请参照上表中对引脚的定义。

• RPi.GPIO (raspberry-gpio-python)

项目主页:http://sourceforge.net/projects/raspberry-gpio-python/

RPi.GPIO是树莓派官方推荐的GPIO驱动库,该程序库使用Python语言。RPi.GPIO可用于对实时性要求不高的项目中,如果熟悉Python语言很快就能上手,该程序库的缺点是目前尚不支持SPI、IIC及1-wire。

本代码实现了使用RPi.GPIO程序库控制GPIO 7以1s频率进行开-关操作,如果外接一个220欧姆电阻和LED,可观察到LED以1HZ的频率闪烁。

Code 1. Python RPi.GPIO实现GPIO控制


#!/usr/bin/python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)

while True:
	GPIO.output(7, GPIO.LOW)
	time.sleep(0.5)
	GPIO.output(7, GPIO.HIGH)
	time.sleep(0.5)

• WiringPi

项目主页:http://wiringpi.com/

WiringPi是一个类似Arduino以C/C++实现的IO驱动库,该函数库在LGPL v3协议下发布。Wiring Pi是这三种程序库中功能最强大的,除了支持GPIO操作,还支持IIC、SPI、串口以及很多外扩外设:如Gertboards、74595、12864 LCD及PiFace扩展板。使用WiringPi之前需要下载相应的函数库,配置方法请参见:http://wiringpi.com/download-and-install/

使用Wiring Pi操作GPIO的代码如下:

Code 2. WiringPi实现GPIO控制

#include <wiringPi.h>
int main (void)  {
	wiringPiSetup() ;
	pinMode(0, OUTPUT) ;
	for (;;)  {
		digitalWrite(0, HIGH) ;
		delay (500) ;
		digitalWrite(0,  LOW) ;
		delay (500) ;
	}
	return 0 ;
}

通过以下命令进行编译,编译时需i包含WiringPi库:

gcc -Wall -o blink blink.c -lwiringPi

• bcm2835 C驱动库

项目主页:http://www.airspayce.com/mikem/bcm2835/

该程序库使用C语言,跨过Linux内核层,直接操控BCM2835的GPIO。因为并不是以Linux device driver的方式实现,这种方式会存在一些潜在的副作用。不过该函数库除了支持GPIO的操作,还支持SPI、IIC以及系统定时器。

示例代码:

Code 3. bcm2835驱动库实现GPIO控制

#include <bcm2835.h>

// Blinks on RPi Plug P1 pin 11 (which is GPIO pin 17)
#define PIN RPI_GPIO_P1_11

int main(int argc, char **argv)
{
  if (!bcm2835_init())
  return 1;

  // Set the pin to be an output
  bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);

  // Blink
  while (1)
  {
    bcm2835_gpio_write(PIN, HIGH);
    bcm2835_delay(100);

    bcm2835_gpio_write(PIN, LOW);
    bcm2835_delay(100);
  }
  bcm2835_close();
  return 0;
}

编译方法:

gcc -o blink blink.c -l bcm2835

【修订历史】

V1.3    2016/05/25 : 增加了Raspberry Pi B+, 2, 3的引脚定义。
V1.2    2014/09/11 : 修改了代码#include后头文件消失的问题,修改了文章标题。
V1.1    2014/03/04 : 增加了Wiring Pi及bcm2835 C函数库的说明。

%d bloggers like this: