这篇博文是我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,按物理位置显示

树莓派A+型、B+型和2代###

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

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()

树莓派点亮led灯C语言,树莓派点亮你的LED小灯——GPIO学习笔记相关推荐

  1. c语言imagesize怎么用里面的参数如何填写,【学习笔记】【C语言】sizeof

    1.用来计算一个变量或者一个常量.一种数据类型所占的内存字节数. 2.sizeof一共有3种形式 1>sizeof( 变量\常量 ) sizeof(10); char c = 'a'; size ...

  2. 【树莓派C语言开发】实验02:RGB小灯

    文章目录 前言 1.实验器材 1.1树莓派运行库准备 2.元件接线 3.函数解释 3.1关于softPwmWrite的使用问题,大大的疑惑 4.代码样例 4.1初始化针脚 4.2颜色参数设置 4.3完 ...

  3. 单片机旋转led程序c语言,基于单片机POV的旋转LED灯程序

    /************************************************************************************** *Name:旋转LED ...

  4. 流星灯C语言程序,(18)改进led驱动和流星灯程序

    (18)改进led驱动和流星灯程序 注:所以文章红色字体代表需要特别注意和有问题还未解决的地方,蓝色字体表示需要注意的地方 1.本文所介绍的程序平台 开发板:arm9-mini2440 虚拟机为:Re ...

  5. stm32呼吸灯c语言程序,STM32使用PWM控制LED呼吸灯效果

    实验的STM32型号: STM32F103C8T6   48引脚 涉及到的知识: RCC,GPIO,TIMER,PWM 设置 *RCC需打开外部时钟 *GPIO查表得知 PA3 默认复用引脚 TIM2 ...

  6. 5个流水灯c语言程序,五种编程方式实现流水灯的单片机C程序

    <五种编程方式实现流水灯的单片机C程序>由会员分享,可在线阅读,更多相关<五种编程方式实现流水灯的单片机C程序(5页珍藏版)>请在人人文库网上搜索. 1.五种编程方式实现流水灯 ...

  7. 32种花样流水灯c语言程序,32LED单片机心形花样流水灯程序+视频

    include #include #define uint unsigned int #define uchar unsigned char uchar code zou[]={0x01,0x02,0 ...

  8. 中断控制流水灯c语言程序,51单片机按键中断控制流水灯

    满意答案 levis501523 2018.01.03 采纳率:58%    等级:12 已帮助:8301人 #include #include #define uchar unsigned char ...

  9. C++语言程序设计(第5版 郑莉、董渊)学习笔记(自用~)

    C++语言程序设计 第5版 1.前言 2.内容 第一章 绪论 1.1语言发展 1.1.1 概述 机器语言-->汇编语言-->高级语言(包括C++) 1.1.2 面向对象 结构化程序设计(面 ...

最新文章

  1. 170个新项目,579个活跃代码仓库,Facebook开源年度回顾
  2. Cocos2dx源码记录(1) CCGLProgram
  3. 十张图说明机器学习在S/4中的应用
  4. 网站SEO优化之如何提升访客量?
  5. python3 字符串前字母(无前缀,前缀u,前缀b,前缀r)含义
  6. 副本的leader选举
  7. Python selenium —— 用chrome的Mobile emulation模拟手机浏览器测试手机网页
  8. Python基础学习总结__Day3
  9. P5748-集合划分计数【EGF,多项式exp】
  10. 一个35岁腾讯产品经理的忠告:在职场,这件事越早做越好
  11. python整数分节输出_pyfactor
  12. android动态波浪效果,android贝塞尔曲线实现波浪效果
  13. win10cmd重置系统_命令提示符修复系统win10 系统还原
  14. java线程状态与操作系统线程状态的关系
  15. 交通路口信号灯c语言编程,三菱PLC十字路口的红绿灯编程实例
  16. pcb 受潮_怎样让PCB远离潮湿危害
  17. 2021碳纤维山地车哪个牌子好世界10大顶级自行车品牌排行榜
  18. 体检报告录入有误,到底是谁的错?
  19. 消除span之间的空隙
  20. 解决Cannot invoke “java.sql.Connection.prepareStatement(String)“because “this.conn“ is null

热门文章

  1. 前端(day05)Vue,Vue的钩子函数created:
  2. 随着“过失导致死亡的诉讼案”要求 在发生灾难性的行人伤亡事件后, 关闭“北公园中心(NorthPark Center)
  3. word 怎么把左边目录显示出来
  4. Linux下C++多线程编程(入门实例)
  5. SQL Server2000 版本区别及安装图解
  6. c语言编写消防车声音程序教程,51单片机消防车、救护车声音模拟源程序
  7. windows系统如何轻松访问AppData文件夹
  8. MyEclipse部署项目和jsp实现99乘法表
  9. 中国男人生活压力最大的10个城市
  10. 超好用的PDF转换软件