树莓派 GPIO
参考:https://www.raspberrypi.org/documentation/usage/gpio/
1)使用GPIO pinout命令确认板上GPIO配置
2)GPIO库分类:
- wiringPi C,有Perl, PHP, Ruby, Node.JS和Golang的扩展,支持wiringPi Pin和BCM GPIO两种编号
- RPi.GPIO Python,支持Board Pin和BCM GPIO两种编号(参考:https://sourceforge.net/projects/raspberry-gpio-python/)
- Webiopi,Python, 使用BCM GPIO编号
- WiringPi-Go, Go语言,支持以上三种编号
3)编号
- 第一列是wiringPi API中的缺省编号,
wiringPiSetup()
采用这列编号 - 第二列(Name)往往是转接板的编号
- 第三列是树莓派板子上的自然编号(左边引脚为1-15,右边引脚为2-26),
RPi.GPIO.setmode(GPIO.BOARD)
采用这列编号 - 树莓派主芯片提供商Broadcom的编号方法,相当于调用了
WiringPiSetupGpio()
或RPi.GPIO.setmode(GPIO.BCM)
采用这列编号
wiringPi Pin | Name | Board Pin | BCM GPIO |
0 | GPIO 0 | 11 | 17 |
1 | GPIO 1 | 12 | 18 |
2 | GPIO 2 | 13 | 21 |
3 | GPIO 3 | 15 | 22 |
4 | GPIO 4 | 16 | 23 |
5 | GPIO 5 | 18 | 24 |
6 | GPIO 6 | 22 | 25 |
7 | GPIO 7 | 7 | 4 |
8 | SDA | 3 | 0 |
9 | SCL | 5 | 1 |
10 | CE0 | 24 | 8 |
11 | CE1 | 26 | 7 |
12 | MOSI | 19 | 10 |
13 | MISO | 21 | 9 |
14 | SCLK | 23 | 11 |
15 | TXD | 8 | 14 |
16 | RXD | 10 | 15 |
17 | GPIO 8 | 28 | |
18 | GPIO 9 | 29 | |
19 | GPIO10 | 30 | |
20 | GPIO11 | 31 |
概念补充:
WiringPi
控制树莓派GPIO的C代码库
WiringPi is a PIN based GPIO access library written in C for the BCM2835, BCM2836 and BCM2837 SoC devices used in all Raspberry Pi. versions.
例程一(GPIO基本操作):
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) #使用板上GPIO Number号 #GPIO.setmode(GPIO.BCM) #使用BCM GPIO Number号 #mode = GPIO.getmode() #取得当前GPIO模式(GPIO.BOARD, GPIO.BCM or None)
#GPIO.setwarnings(False) #关闭不必要的warning
#GPIO.setup(channel, GPIO.IN) #设置channel为input端子
#GPIO.setup(channel, GPIO.OUT) #设置channel为output端子
#GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH) #设置channel为output端子,初始值为High
#chan_list = [11,12]
#GPIO.setup(chan_list, GPIO.OUT) #设置channel11,12为output端子
#GPIO.input(channel) #读取input端子的状态(0/GPIO.LOW/False or 1/GPIO.HIGH/True)
#GPIO.output(channel, state) #设置output端子的状态(0/GPIO.LOW/False or 1/GPIO.HIGH/True)
#chan_list = [11,12]
#GPIO.output(chan_list, GPIO.LOW)
#GPIO.output(chan_list, (GPIO.HIGH, GPIO.LOW)) #同时设置多个channel的输出状态
#GPIO.cleanup() #在脚本结尾用于清空GPIO的状态
#GPIO.cleanup(channel) #清空特定channel的状态
#GPIO.cleanup( (channel1, channel2) ) #同时清空多个channel的状态(使用tuple)
#GPIO.cleanup( [channel1, channel2] ) #同时清空多个channel的状态(使用list)
#GPIO.RPI_INFO #取得GPIO情报
#GPIO.RPI_INFO['P1_REVISION']
#GPIO.VERSION
例程二(GPIO PWM端子控制)
'''GPIO 基本控制 p = GPIO.PWM(channel, frequency) #创建PWM实例对象 p.start(dc) #dc为PWM的占空比 (0.0 <= dc <= 100.0) p.ChangeFrequency(freq) #修改PWM频率 p.ChangeDutyCycle(dc) #修改占空比 p.stop() #停止PWM ''' #########控制LED灯(闪烁)############# import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) #使用板上GPIO Number号 GPIO.setup(12, GPIO.OUT) p = GPIO.PWM(12, 0.5) p.start(1) input('Press return to stop:') # 压下enter key,停止PWM输出 p.stop() GPIO.cleanup() #########控制LED灯(亮度)############# import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) p = GPIO.PWM(12, 50) # channel=12 frequency=50Hz p.start(0) try: while 1: for dc in range(0, 101, 5): p.ChangeDutyCycle(dc) time.sleep(0.1) for dc in range(100, -1, -5): p.ChangeDutyCycle(dc) time.sleep(0.1) except KeyboardInterrupt: pass p.stop() GPIO.cleanup()