首页
社区
课程
招聘
[原创]初玩树莓派B 4 GPIO操作点亮LED灯
2016-9-17 11:30 19671

[原创]初玩树莓派B 4 GPIO操作点亮LED灯

2016-9-17 11:30
19671
初玩树莓派 B  4 GPIO操作点亮LED灯

bbs.pediy.com

相信学ardunio或者其他单片机的第一个工作绝对是点亮一个LED灯,就跟C语言的hello world是一个意思,那么这次我们也要尝试用树莓派的GPIO点亮一个LED等。

1了解树莓派B的GPIO

首先了解GPIO

GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
来自 维基百科的GPIO解释
初学来说了解GPIO可以理解成由芯片引出的一些外部针脚,至少有两个功能(输入和输出)。输出怎么解释?比如我们外接了一个LED灯,需要CPU控制某个针脚变成高电平为LED提供+电源,这就是输出。输入怎么解释?比如我们外接了一个红外人体感应器。需要CPU从某个针脚检测状态,如果感应到人体,那么某个针脚会变成高电平,这就是输入了。
GPIO的复用指的是某些引脚除了用作普通的输入输出,还有非普通IO的功能性作用。比如用做JATG调试,串口的TX,RX等,但是一个针脚每次只能作为一个功能使用,复用不是说一个针脚同一时间既可以做输入又可以做输出。
也就是说每次使用GPIO之前 需要对要使用的针脚设置对应的模式,才有对应的作用,重启以后又恢复到初始的MODE状态。每个PIN设置为不同的模式有不同的作用。有些针脚是固定的。比如 3.3V 5.5V和GND都是固定的作用,不能作为可以操作的GPIO使用。
首先来看看树莓派B的GPIO 我的PI  B是26针脚的。
树莓派的PIN有很多的编号方式:实质其实没有太多区别,只是不同的编号方式对应的PIN有不同的号码。
假设我们使用的是P1编号的15号PIN(Header一栏中15号) 名字叫GPIO3(名字也可能叫法不同),如果用BCM的标号方式就是22号。如果是WiringPi来操作的话就是3号。使用不同编号方式,PIN的号码可能是不相同的。只要对照了准确的表操作就没有任何问题。
实际图中板子上标号就是P1的编号方式。在python的gpio中就是BOARD模式。
后续如果不特别指明。就默认是P1标号方式。从上到下从左到右(我贴的图请你你顺时针转90度再数 QAQ) 编号1-26.





通过执行 #gpio readall可以准确得到你的主板的GPIO信息


我们先看一看初始的每个PIN模式是什么。这里先看结果。后续会有使用python的读取的源码。


这里可以看到 PIN8 和PIN10默认就是串口模式。前面一节调试串口的时候我们并没有设置模式。也可以正常工作就是因为板子启动后,默认 8 10 就是串口模式。其中还有
1,2,4,6,9,14,17,20,25号是电源,3.3V 5.5V或者GND。其他的默认是GPIO.IN全部是输入模式
我们点亮LED灯肯定要设置某个针脚为OUT模式。

2直接点亮一个LED灯
对照表中可以看到PIN1是3.3V电源正极。PIN6是0V也就是GND 负极。是不是接上一个LED自动就亮了呢?真聪明啊。就是这么接的,但是为了安全起见,还是接一个300左右的电阻吧。
3.3/300=0.011A=11ma .这样比较安全。 高中物理这里就不再多说了
需要的材料
1面包板 (方便插线,不用手动接线)

面包板
中间的插孔竖向是相通的,两两不互通。
边缘的插孔横向是相通的,两两不互通。

2 公对母杜邦线2条


公母很好分。
公的是插别人的。母的是被插的。(自觉面壁两分钟)
当然杜邦线还有 公-公 母-母的。因为便宜。买的时候多买一些没关系。

3 LED灯一个(参考电压3.0-3.2V)电流5-20 ma


注意LED的正负。如何区分?
第一种:引脚较长的是正,引脚较短为负,图中可以看出负极较短。
第二种:看灯头里面分为两部分,较大的一部分连着负极。较小的一部分连着正极

4       300欧姆左右的电阻一个



这个没啥好说的。

接线
PIN1 (3.3V正极)--------电阻------LED正极--------LED负极---------PIN6(GND负极)
LED灯就会亮起来了




3编程来控制LED

常用来操作树莓派GPIO的库有两个:
一个是python的 rpi.gpio (https://pypi.python.org/pypi/RPi.GPIO)
一个是C语言的wiringpi   (http://wiringpi.com/)
A: 使用RPI.GPIO
默认安装的完整版本的IMG是自带RPI.GPIO库和python环境的。不用我们安装
如果需要安装的话
#sudo apt-get update
安装python
#sudo apt-get install python
安装pip 用pip安装 rpig.pio
#sudo pip install rpi.gpio

这次我们需要修改上面的布线方案。因为我们要编程操作一个PIN了,是不能操作电源针脚。我们选择PIN3
连接方式其余的不变。将原来接PIN1的线接PIN3就好了。这里就不上图了
PIN3正极--------电阻------LED正极--------LED负极---------PIN6负极
python的语法就不说了。这个简单易学。请自学
编辑一个文本文件。写入

#导入操作GPIO的库
import RPi.GPIO as GPIO
#导入time库,我们需要用到sleep
import time
#设置引脚的编码模式为P1.等同于这里的BOARD
GPIO.setmode(GPIO.BOARD)
#设置PIN3的操作模式为输出
GPIO.setup(3,GPIO.OUT)
#循环执行
while True:
     #给PIN3一个高电平,此时LED亮了
     GPIO.output(3,GPIO.HIGH)
    #休眠一秒
     time.sleep(1)
    #再给PIN3一个低电平。此时LED灭了
     GPIO.output(3,GPIO.LOW)
     time.sleep(1)


上面的效果你就看到你的LED一秒闪烁一次。(这个脚本没有退出,也没有退出时清理资源)。
尝试修改sleep时间什么的也都是可以的哦
time.sleep(0.2) 闪烁频率就变快了 。

同时我们再查看一下PIN3针脚的模式



发现已经变成GPIO.OUT了。这就是我们脚本内GPIO.setup(3,GPIO.OUT)的作用。

Getmode.py脚本如下。就不再解释了。(电源PIN是不能操作的,会出异常。)

import RPi.GPIO as GPIO 
import time 
strmap={\ 
GPIO.IN:"GPIO.IN",\ 
GPIO.OUT:"GPIO.OUT",\ 
GPIO.SPI:"GPIO.SPI",\ 
GPIO.I2C:"GPIO.I2C",\ 
GPIO.HARD_PWM:"GPIO.HARD_PWM",\ 
GPIO.SERIAL:"GPIO.SERIAL",\ 
GPIO.UNKNOWN:"GPIO.UNKNOWN" 
} 
GPIO.setmode(GPIO.BOARD) 
for x in range(1,26): 
 if x not in [1,2,4,6,9,14,17,20,25]: 
   print ("PIN"+str(x)+" :"+strmap[GPIO.gpio_function(x)]) 
 else: 
   print ("PIN"+str(x)+" : POWER")


B使用wiringpi操作
同样是上面的工作。这次我们用C语言的wiringpi来操作
下载wiringpi库。(git的安装就不讲了,默认完整的img也带了)
去git上clone
#git clone git://git.drogon.net/wiringPi
#cd wiringPi

#./build

等待编译完成,树莓派的B CPU 700MHZ相对来说还是比较慢。需要稍微等待

编译好以后会自动给你安装到/usr/local/lib目录中。只需要直接用头文件和lib就行
如果你的系统没有这个目录。参看wiringPi目录下的INSTALL解决

我们新建一个led.c
#include <wiringPi.h> 
#include <unistd.h> 
#include <stdbool.h> 
int main() 
{ 
//初始化环境
 wiringPiSetup(); 
//设置PIN3为输出模式 对应于,wiringpi由之前的图标号应该是8.这里特别注意
 pinMode(8,OUTPUT); 
 while(true) 
 { 
  sleep(1); 
//写入高电平
  digitalWrite(8,HIGH); 
  sleep(1); 
//写入低电平
  digitalWrite(8,LOW); 
 } 
 
}


这里需要特别注意的是 编号不再是3.而是8了。因为我们用的是wiringPi



开始编译这个文件
#gcc -o led led.c -lwiringPi
意思是通过led.c产生 led 这个bin文件,链接的时候使用wiringPi开发库(基础库是默认链接的,不要明显指出)。如果不使用-lwiringPi会提示链接错误。未定义的引用。



编译完毕后使用管理员权限执行
#sudo ./led
这样就又能看到led一秒闪烁一次了

下一次我们玩什么设备呢?
是蜂鸣器?还是人体红外感应?还是摄像头?
还是人体红外感应以后,蜂鸣器发出报警?
又或者是互联网摄像头,树莓派当客户端,通过互联网传输家里的视频到你的手机,让你在手机上也能看到家里的状况?继续为摄像头添加一个移动检测。监测到异常移动蜂鸣器报警。并且报警到外网云端?

组合蜂鸣器,人体感应,摄像头 ,互联网云终端,手机移动端  就是一个小小的安防监控系统。
再取个响亮的名字,找两个销售,脚踩*华,拳打*康,我的口水已经流出来了。我已经快要走向人生巅峰了,随后迎娶一群白富美,然后嘿嘿嘿。
砰砰砰
一阵敲门声,惊醒我,我从容地扔掉手中的卫生纸。
“谁啊”
“我是房东。这个月房租加水电费一共1276,打我支付宝啊”
“哦,过两天打给你,我还没发工资呢”
“你又要拖?还有啊,租房合同要到期了,附近人都涨了几次了,再签这次房租怎么也要涨一点的,不行就准备搬走。”
“.................”

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

上传的附件:
收藏
免费 3
打赏
分享
最新回复 (14)
雪    币: 6782
活跃值: (4441)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2016-9-18 10:54
2
0
楼主辛苦了,感谢奉献树莓派教学这个系列。
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-18 13:38
3
0
老大,目前对于电路硬件了解依然很少。比如什么上拉 下拉 推挽,开漏等。暂时实力还不足加入小组,来日方长,等我功力深厚一些再申请加入。
雪    币: 457
活跃值: (218)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
机械瞑衍 2016-9-19 14:03
4
0
赞一个 个人也挺喜欢玩这些东西的 哈
雪    币: 5083
活跃值: (3213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vigiles 2016-9-20 22:57
5
0
感谢楼主,非常好的系列文章。准备入手学习
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-21 08:26
6
0
别买我这种。买第三代最新的版本,细节上都差不多的,GPIO这些都差不多。我这都吃灰吃了几年了,性能也比不上现在的。
后续会讲驱动蜂鸣器 人体红外感应 等等。基本功能都玩一遍,初学系列差不多就完成了。

这些元器件都很便宜,几毛钱一个,贵一点的人体感应或者什么的也只要4块。可以多买一些奇奇怪怪的模块玩一玩
雪    币: 5083
活跃值: (3213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vigiles 2016-9-21 22:50
7
0
能推荐个可信的网店吗
雪    币: 16
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jercheng 2016-9-22 16:09
8
0
谢谢楼主分享
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-23 08:06
9
0
这个你就自己找吧。我就避免广告嫌疑了。树莓派三代+现在淘宝到处有。选个销量高一些的就行。
其他电子元器件。你搜一下比如HC-SR501 或者红外感应模块。基本上其他的配套的也都有卖的。
雪    币: 5083
活跃值: (3213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vigiles 2016-9-24 22:59
10
0
多谢。如果可以,悄悄话兄台买装备的商品地址
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-26 08:32
11
0
淘宝
小的外接模块比如面包板,排线,蜂鸣器 等等都是在
深圳 育松电子店铺 购买的。和树莓派是分开两家来买的。一般卖树莓派的也会有基本的元器件,但是不如专门卖元器件的东西多。
面包板 ,公母  公公 母母杜邦线可以多买一些,一包电阻,LED灯,蜂鸣器,人体感应器。不一定一次都买全,第一次可以买一些基础的玩一玩,这些东西都是几毛,或者三四块的,对得起邮费就行。后续可以接着买。

树莓派板子本身买的特别早,几年前买的,地址现在找不到,找一家销量高的就行。
主要要买
1 树莓派板子3代以后 (到手就一块裸板子,什么都没有)
2 U1的SD卡最好大于8G。建议16G或者32g。(注意是不是要买卡套。我的B型是TF卡插卡套再接上去的),以及USB读卡器,烧系统什么的要用。
3 USB转TTL串口调试线
4 对应的GPIO外接T型版和排线。主要是把GPIO引出来。免得每次要插到板子身上,如果板子放到盒子里面操作起来很不方便。

建议买的
1免驱的无线网卡
2散热贴片
3树莓派保护壳,免得摔坏了

总价大约300-400.板子要230左右。其他都是几块十几块的
雪    币: 5083
活跃值: (3213)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vigiles 2016-9-26 22:14
12
0
非常感谢!希望你的系列帖子持续更新下去,更多的针对新手,感谢!
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-9-26 22:17
13
0
刚更新了6 人体感应检测。一边学习,一边记录,谈不上教程把,这是自己的一些实践结果,共同学习。
雪    币: 313
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
奮鬥 2016-10-10 00:40
14
0
树莓派和51、STM系列又有什么区别呢?
雪    币: 1412
活跃值: (4469)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 4 2016-10-10 09:25
15
0
主要是性能上的区别,单片机基本上CPU频率低,内存和FLASH都非常小,主要是用CPU跑单一的一个程序,一般不装载操作系统。树莓派性能足够支撑一个完整的操作系统。然后在操作系统上做应用开发。
游客
登录 | 注册 方可回帖
返回