从本篇开始,将逐步学习和分享树莓派GPIO相关操作,由于本人也是这方面的小白,关于接口、跳线、面包板、电流电压之类的叙述,可能有不准确的地方,还请大家仅将本系列文章作为入门读物。
本文需要的一些元件:母对公杜邦线N条,面包板1块,暂不需要面包板外接电源,发光二极管(电压2V-3.3V),电阻约400欧1个。
必须要了解的知识:根据树莓派官方文档的描述(见https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/README.md),树莓派本身输入电压5V,电流取决于你另外还承载了哪些外围元件,推荐1.2A的电源输入(输入额定2A),能够提供比较充足的电流。B版的电流是700-1000mA,A版的是500mA没有外围设备。树莓派本身可以承载的最大电流是1A,如果你连接了一个USB设备并且电流的总需求超过了1A,你就只能通过一个带供电的USB
hub来连接你的USB设备了,USB设备都定义了供电需求,基本单位是100mA从100mA到500mA不等,树莓派的每个USB接口的设计负荷为100mA,适用于供电需求低的鼠标和键盘设备,Wifi适配器、USB硬盘等应该连接到外部供电的hub上,给树莓派插上一个500mA的设备也是有可能工作的,但是不能保证它的可靠运行。GPIO引脚可以安全引出的总电流是50mA,分布在所有的针脚上,一个单独的GPIO针脚只能安全地输出16mA。HDMI接口使用50mA,摄像头模块需要250mA,键盘和鼠标需要100mA到1000mA不等。所以,为了安全起见,最好先画好电路图,计算好需要串联多大的电阻,万万不要超过GPIO的额定安全电流值。
常见外围设备的电气特性:
- 2路光耦隔离继电器,控制端输入电压5V,最大电流10A
- LED发光二极管,在某宝买的黄色参考电压2~2.2V,其他颜色参考电压3~3.3V(一般3V才击穿发光),反向阻值接近无穷大,正向导通的阻值约几百欧,额定电流20mA,长脚一端为正
- 常用电阻,10Ω、22Ω、47Ω、100Ω、220Ω、470Ω、680Ω、1KΩ、2.2KΩ、4.7KΩ、6.8KΩ、10KΩ、22KΩ、47KΩ、68KΩ、100KΩ、220KΩ、470KΩ、680KΩ、1MΩ
- HC-sr04 超声波测距模块,输入电压5V,静态电流<2mA,探测距离2cm~450cm,精度0.3cm
- 光敏电阻,工作电压3.3V-5V,电流>15mA
- 有源蜂鸣器,工作电压3.5V-5.5V,电流<25mA
- DHT11温度湿度模块,工作电压3.3V/5V,湿度20-90%,温度0-50摄氏度
- 四驱车马达,额定电压6V,额定电流约200mA
如果由不准确的地方,还请大家指正,另外如果有补充的,欢迎回复。
本人目前测试的,在USB同时接入USB EDUP无线网卡和USB转以太网卡,可以同时正常工作;GPIO 3.3V接470欧电阻串联一个二极管,可以正常发光。
好吧,引子扯得太多了。。但毕竟是GPIO开篇,有必要交代清楚一些必须要知道的电气特性,否则轻者元件不能正常工作,重者导致元件损坏。。另外,有能力的同学,可以一次性多买几个元件,例如每样3个,以防不测。
下面进入正题,使用树莓派B+板的GPIO点亮二极管,用到的是3.3V(第1针脚)和一个GPIO(第37针脚,wPi库中编号是25)。
电路图如下:
树莓派第1针脚3.3V引出跳线接到面包板正极,然后从正极接一个470欧电阻在面包板上半区,从正到负接发光二极管连通上下半区,回路导线从下半区引到负极,最后一根跳线从负极接回树莓派的第37引脚GPIO.25(有的图GPIO序号不一样)。
其实我们可以不用控制GPIO,直接正极接3.3V,负极接第39针脚0V,看LED是不是被点亮了,从而验证我们电路的正确性,然后再改成负极接GPIO.25。
有关面包板的叙述是按照我自己的理解来的,可能用词不准。面包板通过横线分成4大块:最上一块和最下一块各有2行点阵,是接电源的部分,按照正负极连接输入电源,这一部分的每一行是导通的,也就是同一行插在哪个点都一样;中间两块比较大的区域,我叫他线路部分,用于DIY自己设计好的线路,分上半区和下半区,这两个区域中间是隔离的不导通,每个区域内,点阵是按列纵向导通的,也就是说如果一个元件的两端插在一个区域同一列的两点上是被短路的,因此我们的电阻R和二极管LED都是跨区域连接,R跨了电源区和线路上半区,LED跨了线路上半区和下半区。不用管这些东西到底怎么叫,理解就好!
接下来,就可以在树莓派端编写Python或C代码来控制这个电路了。
以python代码为例:
import RPi.GPIO as GPIO
import time
#基于板子上面引脚编号1-40
GPIO.setmode(GPIO.BOARD)
#GPIO引脚输出模式
GPIO.setup(37, GPIO.OUT)
while True:
GPIO.output(37, GPIO.LOW) #低电平,另一端是3.3V高电平,所以点亮LED
time.sleep(1)
GPIO.output(37, GPIO.HIGH) #两端都是高电平,二极管熄灭
time.sleep(1)
使用python 的好处是我们不需要反复编译、修改、编译、运行。直接在python命令行,可以一步一步输入代码执行,清楚地控制GPIO.LOW和GPIO.HIGH。
另外,采用wiringPi库的相同程序的代码如下:
include <wiringPi.h>
int main()
{
//wPi模式编号引脚
wiringPiSetup();
pinMode(25, OUTPUT);
for(;;)
{
digitalWrite(25, LOW);
delay(1000);
digitalWrite(25, HIGH);
delay(1000);
}
}
编译:
gcc -Wall -o test test.c -lwiringPi
值得注意的是,还在操作某个GPIO的过程中终端程序,会导致该引脚处于被使用的状态。另一个程序使用该引脚时会报出警告,可以在python中测试如下:
最后,贴上我自己的实物图吧:
按照我这个图的方位(左右两排针脚),3.3V和GPIO.25都是在右排,3.3V在右排最下端(0号),GPIO.25是在右排从上到下第二个。