树莓派 GPIO

参考:https://www.raspberrypi.org/documentation/usage/gpio/

 

1)使用GPIO pinout命令确认板上GPIO配置

  参考:https://pinout.xyz/

 

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.

  参考:http://wiringpi.com/

 

例程一(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()

 

posted @ 2020-04-28 13:34  不懂技术  阅读(448)  评论(0编辑  收藏  举报