树莓派点亮你的LED小灯——GPIO学习笔记

这篇博文是我Coursera学习笔记整理所得,入门操作基本都在这里了。闲话不多说,直接进入正题。

1.树莓派的GPIO##

GPIO是General Purpose Input Output (通用输入/输出)的缩写,一般译为总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。摘自百度百科

除了Raspberry Zero之外,其他版本的树莓派GPIO都带标准的GPIO,而且都是公头(与Arduino Uno正好相反)。Raspberry Zero比较奇葩。它是专门为制作嵌入式系统设计的,为了减小体积和成本(主要是体积),它的GPIO不带头。对于需要使用GPIO的研发人员,需要自己动手焊上去。

因为各个版本的树莓派GPIO的数量不一样,所以,可想而知,各个版本树莓派的GPIO布局也是不一样的。这在开发的时候有些小麻烦。本文以树莓派3代为例,不过,先给出各版本树莓派GPIO的布局以供参考:

  • 树莓派A型和B型###

Raspberry Pi A & B,按GPIO号显示
Raspberry Pi A & B,按GPIO号显示
Raspberry  Pi A & B,按物理位置显示
Raspberry Pi A & B,按物理位置显示
  • 树莓派A+型、B+型和2代###

Raspberry A+, B+, 2,按GPIO号显示
Raspberry A+, B+, 2,按GPIO号显示

Raspberry A+, B+, 2,按物理位置显示
Raspberry A+, B+, 2,按物理位置显示
  • 树莓派3代###

Raspberry Pi 3

以上我们可以看到一个GPIO针头既有GPIO号标识,也可以用物理物质标识,编程时你需要说明你用何种方式标识,后文还会提到。

2.树莓派编程基础##

树莓派基本都预装好了Python的GPIO库,通常在文件开头使用import RPi.GPIO as GPIO导入。

  • 设置模式——GPIO.setmode###

GPIO.setmode(mode),mode参数有两个值,GPIO.BOARD和GPIO.BCM,注意全是大写。前者是告诉程序按物理位置找GPIO头(或者叫channel),后者按GPIO号。两种模式各有各的好处,前者方便找,后者方便程序在不同的树莓派版本上跑,具体区别大家自己体会。

  • 设置GPIO头的输入和输出——GPIO.setup###

GPIO.setup(channel,mode),channel就是你要用的GPIO头,mode分为输入GPIO.IN和输出GPIO.OUT。

GPIO.output(channel, GPIO.HIGH)    #输出高电平,就是输出信号1
GPIO.output(channel, GPIO.LOW)     #输出低电平,就是输出信号0
- ###调制脉宽,输出模拟信号——GPIO.PWM###
树莓派本身既不能接受模拟信号,也不能输出模拟信号,要么输出1,要么输出0。不过可以通过改变数字信号的输出占空比(就是一个周期内,GPIO打开时间占总时间的比例),使输出效果近似的模拟信号。例如,我们牵绊周期打开GPIO输出1,后半周期关闭GPIO,接受的设备(例如一个舵机或者一盏LED灯)没方法反应过来,就会输出0.5。树莓派3代一般使用pin12和pin24调制脉宽。
p = GPIO.PWM(channel,frequency) #channel是GPIO头,frequency是频率
p.start(dc)                     #dc 是占空比 (0.0 <= dc <= 100.0)改变频率:
p.ChangeFrequency(freq)         #改变频率到 freq Hz
p.ChangeDutyCycle(dc)           #改变占空比: 0.0 <= dc <= 100.0
p.stop()                        # 停止 PWM:
- ###事件和回调函数——GPIO.add_event_detect###
熟悉交互编程的人都知道“事件”和“回调函数”。比如右击鼠标是个事件,程序接受到这个事件,就会调用一个函数,这就是回调函数(个人浅薄的理解,很可能不正确,请雅正)。
GPIO.add_event_detect(channel,event, callback = functionname)  
#channel就是你要用的GPIO头,event是触发事件,例如电平上升GPIO.RISING和电平下降GPIO.FALLING,functionname就是你要调用的函数的函数名。

##3.LED灯实验##
有了语法基础我们就可以做一些小实验了,这里给出介绍闪烁灯、呼吸灯和开关控制灯的代码。
- ###闪烁灯###
这段代码的效果是:按下按钮,LED保持长亮;松开按钮,LED灯一直闪烁。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT) #设置pin8负责输出电压
GPIO.setup(12, GPIO.IN) #设置pin12负责读取按钮的信号

def blink():
#通过交替输出高低电频来是LED灯闪烁
GPIO.output(8,GPIO.HIGH)
time.sleep(0.5)
GPIO.output(8,GPIO.LOW)
time.sleep(0.5)

主程序

try:
#如果pin12接受到按钮的信号,那么使LED灯亮; 否则灯就闪烁
while True:
if GPIO.input(12):
GPIO.output(8,GPIO.HIGH)
else:
blink()

except KeyboardInterrupt:
pass

GPIO.cleanup()


- ###呼吸灯###
这段代码是让LED等渐明渐暗。

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
p = GPIO.PWM(12, 50)

启动pwm

p.start(0)
try:
while True:
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

停止pwm

p.stop()
GPIO.cleanup()

- ###按钮开关###
这段代码的效果是:按一下按钮,关闭灯;再按一下,打开灯。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT) #设置pin8负责输出电压
GPIO.setup(12, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #设置pin12负责读取按钮的信号,pin12初始状态是GND(0电势,相当于接地电压)

全局变量ledStatus是一个逻辑开关,一开始设为False

ledStatus = False

定义回调函数

def my_callback(channel):
print("button pressed")
global ledStatus
ledStatus = not ledStatus
if ledStatus:
GPIO.output(8, GPIO.HIGH)
else:
GPIO.output(8, GPIO.LOW)

定义触发事件,bouncetime是防止消除按键抖动,不必在意

GPIO.add_event_detect(12,GPIO.RISING, callback = my_callback, bouncetime = 200)

主程序,如果不按下按钮,主程序就什么都不做。

try:
while True:
print("I'm working")
time.sleep(5)

except KeyboardInterrupt:
pass

GPIO.cleanup()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容