通过Raspberry Pi(树莓派)的GPIO接口控制发光二极管_第1页
通过Raspberry Pi(树莓派)的GPIO接口控制发光二极管_第2页
通过Raspberry Pi(树莓派)的GPIO接口控制发光二极管_第3页
通过Raspberry Pi(树莓派)的GPIO接口控制发光二极管_第4页
通过Raspberry Pi(树莓派)的GPIO接口控制发光二极管_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通过RaspberryPi(树莓派)的GPIO接口控制发光二极管简单地说,它就是一个基于ARMCPU的、信用卡那么大的迷你计算机。

Inshort,PiisanARM-basedminicomputerwhichhasacreditcardsize.在阅读本文之前,请确保你已经阅读过我的另外几篇关于Pi的文章,因为本文与它们有或多或少的关系。

Beforereadingthisarticle,pleasemakesurethatyou'veread

someotherarticles

ofmineonPi,becausethisarticleismoreorlessbasedonthem.通过RaspberryPi的GPIO口来控制发光二极管已经不是什么新鲜事了,网上有大量的教程和资源可查。为了测试一下控制GPIO输出的功能,我也实践了一次。

首先声明,我对硬件并不了解,所以下文可能有错误,如果你发现了,请留言告诉我,非常感谢。

It'snothingnewtocontrolLEDsthroughPi'sGPIO,alotoftutorials&resourcesareavailableontheInternetnow.ButItriedtodoitmyselftooforthesakeoftestingtheGPIoutputfunctionality.

FirstIwanttoremindthereadersthatI'mnotahardwareguysothisarticlemaycontainssomemistakes,andifyoufindthat,pleaseleavecommentstotellme,thanksinadvance.

文章来源:/

【1】实验目的

/

Experimentpurpose

写一个简单的程序,控制RaspberryPi的GPIO口输出高、低电平,从而让接在GPIO口上的发光二极管闪烁。

WriteasimpleprogramtocontroltheGPIOonPitooutputhighorlowleveltomaketheLEDwhichconnectedtoGPIOblink.

【2】材料准备

/

Materialpreparing

首先,你当然要购买一些发光二极管,电阻,导线,面包板之类的必需电子元器件。看一下我接好线的实物图:

FirstofallyoushouldbuysomeessentialelectroniccomponentssuchasLEDs,resistor,wires,breadboard,etc.Let'shavealookatthestateofwiringdone:【3】关于GPIO

/

AbouttheGPIO

GPIO是通用输入输出(GeneralPurposeInputOutput)的简称,可以通过软件控制芯片上的GPIO口来定义它是输出还是输出接口。

GPIO接口没有定义特殊的功能,并且通常是不使用的。之所以有GPIO,是因为系统有时需要一些额外的控制线路以便于提供一些额外的功能。

FromWikipedia:

GeneralPurposeInput/Output(GPIO)isagenericpinonachipwhosebehavior(includingwhetheritisaninputoroutputpin)canbecontrolled(programmed)throughsoftware.

GPIOpinshavenospecialpurposedefined,andgounusedbydefault.Theideaisthatsometimesthesystemintegratorbuildingafullsystemthatusesthechipmightfinditusefultohaveahandfulofadditionaldigitalcontrollines,andhavingtheseavailablefromthechipcansavethehassleofhavingtoarrangeadditionalcircuitrytoprovidethem.RaspberryPi上的GPIO接口在哪里?它是怎么定义的?我在网上找到这样两幅图:

HowaretheGPIOpinsdefinedinRaspberryPi?IfoundtwoimagesontheInternet:

以及另外一幅稍有不同的图:特别要注意的是:尽管你在网上找到的大多数是类似上面两幅图的接口分布图,但是树莓派的GPIO口有两种不同的命名方式,最后这幅图就提供了一个对比。

YoushouldpayspecialattentiontothatalthoughmostofwhatyoufoundintheInternetarethepinoutslikethefirsttwoimages,itactuallyexiststwokindsofnamesandthelastimageprovidesacomparisontothem.

文章来源:/

然后我们再来看看Pi上的接口实物图(红框中):

ThenwechecktherealphotoofPi'sGPIO(theredbox):但是,这有一个问题:我怎么知道上面两幅图对应的方向是一致的?也就是说,我如何确定哪个针脚是1,哪个针脚是2,等等?我请教了一个做嵌入式开发的朋友,他告诉我,将Pi的电路板翻到反面,在26个针脚中,焊点为方形的那个针脚就是“1”,在它旁边同一排(两个针脚一排)的那一个就是“2”,依此类推。

But,thereisaproblemhere:howcanIknowthesequenceofthepins?Thatis,whichoneis1,andwhichoneis2,etc.Iaskaengineerfriendofmineandhetoldmeamethodtoidentifythesequenceofthepins:onthereversesideofPi'scircuitboard,checkwhichweldpointofthe26pinshasasquareshape,andtheonewhohasisjustpin"1",andtheonenexttoitinthesamerow(eachrowhas2pins)ispin"2",andsoforth.

文章来源:/

在此,我特意拍摄了一张反面焊点的图来说明:

ToillustratethatItookaphotoforthecircuitboard:文章来源:/

根据这个判断,我得到了Pi的GPIO接口顺序图:

AccordingtothejudgementIgotthesequenceoftheports:文章来源:/

同时,为了保险,还需要用万用表测量一下我们的判断对不对:在RaspberryPi的工作状态下,将万用表的“+”接到“1”口上,万用表的“-”接到“6”口上,在看看万用表的显示是不是大约为正3.3V,如果不是,那么说明我们弄错了针脚顺序,需要回头再检查!

Andforsaftyreasonweshouldusea

multimetertohaveatest:turnPi'spoweron,andconnectthe"+"ofthemultimetertothe"1"(3.3V)weconsideris,"-"tothe"6"(GROUND)weconsideris,thenthemultimetershoulddisplaya

approximate+3.3V.Ifit'snot,thenwemadeawrong

judgementonthepinsequenceandshouldgobacktocheckagain!下图是我在树莓派的工作状态下,用万用表测量的实物图:

BelowisthephotoofusingamultimetertomeasurethevoltageoftwopinswhenPiispoweron:顺便说一句,Youtube上有一个关于GPIO的视频教程,看完它你会觉得非常有帮助。

Bytheway,thereisaveryhelpful

tutorialonusingGPIO

onYoutube,youcanhavealook.在确认了接口序号无误后,我们就可以开始接线了。在这里,我随意选了一个GPIO口——GPIO23(即端口16)来接LED。电路图如下:

Afterbesurewiththesequenceoftheports,wecanstarttoconnectalltheelectroniccomponentstogether.I

chosetheGPIO23(namelyport16)toconnecttotheLEDandthecircuitdiagramisasfollows:文章来源:/

就算是这么简单的一个电路,像我一样忘了曾经学过的模拟电路知识的人也会问一句:树莓派的输出电流可以驱动得了发光二极管吗?首先,我在这个链接查到树莓派的3.3V输出口可以提供的最大电流是50mA,并且从这个链接我知道不应让树莓派的单针脚的输出电流>10mA,然后我又查到发光二极管的驱动电流一般是5~20mA。因此,驱动发光二极管是不成问题的。在电流为10mA时,可计算得电阻应为3.3V/0.01A=330Ω,考虑到工作状态下的发光二极管的正向电阻一般为几十到几百欧姆,因此我们拿发光二极管串联一个270Ω的电阻就差不多了。

Evenit's

suchasimplecircuitdiagram,peoplewhohavegiventheiranalogcircuitknowledgebacktotheirteacherlikememayaskthatwhethertheoutputcurrentofPicandrivetheLED,soImadesomeinvestigation...First,from

thislink

Iknowthatthe3.3Vpincanoutputamax50mAcurrent,andfrom

thislink

Irealizethatweshouldlimittheoutputcurrentofeachpintolessthan10mA.Second,IgettheinfothatthecurrenttodriveaLEDisabout5~20mA,sothecurrentprovidedbyPiisenoughtodriveit.Supposethecurrentis10mA,wecancalculatethattheresistanceis3.3V/0.01A=330Ω,andconsiderthattheforwardresistanceofaworkingLEDisaboutafewtensoftohundredsofohms,it'sappropriatetoconnecta270Ωresistanceinseries.

补充一句,我使用了一个非常好用的开源软件来画上面的电路图:Fritzing。感谢开源世界的开发者们!

Bytheway,Iused

Fritzing(anexcellentopen-sourcesoftware)todrawtheabovecircuitdiagramandthankforthecontributionofthedevelopers!那么按照我们的猜测,在接好线的情况下,只要我们用软件控制GPIO23输出高/低电平,就可以让发光二级管闪烁了,那么,软件如何编写呢?

Afterthe

wiringisdone,itseemsthataslongasweuseaprogramtocontrolGPIO23tooutputhigh/lowlevel,we'llmaketheLEDblink.Sohowtowritesuchaprogram?

文章来源:/

【4】编写控制GPIO的程序/WriteaprogramtocontrolGPIO

我使用C来写这个程序。在这里要非常感谢

@drogon

为树莓派的用户提供了一个非常好用的库:WiringPi。通过这个库,我们可以很容易地控制GPIO。

IdecidetouseCtowritetheprogram.Thanksto

@drogon

thatheprovideallthePiusersaverygoodlibrary:

WiringPi,andbyusingthelibwecaneasilycontroltheGPIO.WiringPi的安装方法:

FollowthesestepstoinstallWiringPi:

①首先确保你已经安装了make,如果没装,很简单:

Besuretohave[make]commandinstalledonyoursystem,ifitdoesn't,justinstallitbyusing:1pacman-Smake②下载安装包,解压,编译,安装:

Downloadtheinstallationpackage,unpack,compile&install:1234567mkdirtempcdtempwget/files/wiringPi.tgztarxfwiringPi.tgzcdwiringPi/wiringPi/makemakeinstall这样就算安装完了。

Sotheinstallationisdone.③下面写程序测试:

Thenwriteatestprogram:0102030405060708091011121314151617181920212223242526272829//led.c

#include<wiringPi.h>#include<stdio.h>#include<stdlib.h>

intmain(intargc,char*argv[]){

if(argc<2){

printf("Usageexample:./led4\n");

return1;

}

intpinNumber=atoi(argv[1]);

if(-1==wiringPiSetup()){

printf("SetupwiringPifailed!");

return1;

}

pinMode(pinNumber,OUTPUT);//setmodetooutput

while(1){

digitalWrite(pinNumber,1);//outputahighlevel

delay(800);

digitalWrite(pinNumber,0);//outputalowlevel

delay(800);

}

return0;}需要注意的是,一旦你用digitalWrite()函数置了高电平,那么只要你不把它置为低电平,它将一直维持在高电平。

NotethatonceyouusefunctiondigitalWrite()tosetapintohighlevel,aslongasyoudon'tsetittolow

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论