Raspberry Pi板实验教程实验一、点亮LED在Raspberry Pi板的边上有2列排针,1列13脚一共26脚。
这2列排针叫GPIO口,在Raspberry Pi板搭载的系统下,用户可以使用C语言或Python语言对这2列GPIO口进行控制,以此来控制外接的外部设备。
在这里,我们选用C语言来进行编程控制。
首先,在使用C语言编程之前,要先将Raspberry Pi板连接上网,下载一个GPIO的wirngpi函数库。
wirngpi 函数库是由一个外国人编写的,在使用C语言的时候可以通过对这个函数库的函数调用来对操作GPIO口。
点击LXTerminal进入root用户权限的命令行模式,依次键入以下命令:sudo apt-get update(需要一定等待时间,与网速有关)sudo apt-get upgrade(需要一定等待时间,与网速有关)sudo apt-get install git-coregit clone git:///wiringPicd wiringPigit pull origincd wiringPi./build下载并安装好wiringPi之后,再来看看GPIO口的排列。
将Raspberry Pi 板放置为两列GPIO口在右上角的方式,这两列GPIO口的引脚位如下图所示。
图1图1右边的这张图,就是GPIO的实际引脚位。
而左边的图则是wirngpi 库定义的引脚位图。
编程的时候,只需要以左图为标准就可以了,不需要理会右图。
现在,我们要使用GPIO口来控制LED的亮灭。
LED就是发光二极管,这里需要一块外接的电路板。
如下图:图2这块板的电路图如下:图3这块板是用来驱动步进电机转动的,板子上有4个发光二极管分别接在ULN2003的四个输出上。
将这板连接到Raspberry Pi板上就可以通过操作Raspberry Pi板的GPIO来控制电机板上的发光二级管。
用杜邦线将Raspberry Pi板和电机板连接起来,如果只是简单的控制上面的1个发光二极管,那么只需要连接三条线:电源线(VCC)、地线(GND)和一条IO线。
以图4为例:图4Raspberry Pi板上有3.3V(1脚)和5V(2脚)2种电源,名称为DNC 的引脚则为地线(9,14,17,20,25图中标为26有误,图来源于网络),名称为GPIOx的则是普通的IO口(GPIO0,GPIO1,GPIO2,GPIO3,GPIO4,GPIO5,GPIO6)。
剩下的接口则为有特殊功能的一些接口(暂时先不管)。
这块电机板需要5V的电源,那么就需要把Raspberry Pi板的2号脚接到电机板的VCC脚上,再在DNC中选一个脚(那个都行,此处选25脚)接到电机板的GND脚上。
在GPIO0-GPIO7里挑选1个脚接到电机板的IN1-IN4脚中的任意一个脚上,此处选取GPIO0接到电机板的IN1上,连接完毕如图5所示:图5白色线为电源,黄色线为地线,黑色线为IO线。
连接完成后,就可以开始编程控制了。
在X-Windows环境下,按照之前的介绍点击FileManager进入到路径/home/pi下,在此路径下建立一个文件夹,命名为diy(鼠标右键建立),鼠标双击进入,在里面再建立一个文件夹,命名为01_led_on文件夹,以此文件夹作为此次实验的C语言源程序的存放地方。
另外说一句,在X-Windows下,文件的操作相对来说简单不少,但Linux本身是个命令行系统,X-Windows环境下有一些文件操作是进行不了的,一些文件连简单的复制粘贴都弄不了,一定要到命令行模式下进行才可以,具体这里不赘述。
01_led_on文件夹下建立一个C语言的源文件,名称为led_on.c,然后右键用leafpad打开它,leafpad是系统里自带的一个类似于记事本的简单程序,可以用来做简单的文本输入。
Linux下,有nano,vim等一些c语言的文本编辑器,支持语法高亮,但此处程序不长,简单起见使用leafpad来输入源程序就可以了。
在led_on.c里输入图6中的代码图6程序不长,除掉留白和注释只有16行。
下面简单解释一下这几句程序。
6-9行是4个头文件的包含7,8,9是三个linux系统下的头文件,stdio.h是标准输入输出接口头文件,这个头文件在windows下用VC编程也有;unistd.h 是统定义符号常量的头文件,里面包含了一些系统服务类的函数原型,这个头文件有点类似于windows系统下的windows.h文件;stdlib.h是C语言的标准函数库文件,这个windows系统下也有。
基本上在linux下编程,这三个头文件都会包含进去。
再来看第6行里的wiringPi.h,这个头文件是一开始下载的wiringPi 库提供的。
之前说过,wiringPi库里面提供一些函数,给编程用户操作GPIO口。
11行是个宏,13行是个延时函数的声明,这个延时函数在这没使用,等下有用,25-27行是这个延时函数的原型,原型里调用了usleep( x)函数,这个函数就在unistd.h头文件里,作用是将进程挂起x微秒。
主函数从14-21行,16-17两行调用wiringPi.h里一个函数wiringPiSetup( ),用来检测wiringPi库是否正常,不正常会返回-1,检测到不正常程序直接退出主函数并返回1。
假如认定wiringPi库一定正常,这2句代码不写也没问题。
18行的也是调用wiringPi.h里的函数pinMode(x,y),这个函数是用来设置GPIO口的模式的,参数有2个,第一个参数x指定是哪个GPIO口,y表示哪个模式。
在此处将括号的宏展开,可以得知第一个参数为0,第二个参数为OUTPUT,意思就是把GPIO0设置为输出模式,第一个参数之所以为0,道理很简单,之前在连线时,就是把GPIO0和电机板的输入连接在一块的。
而这个GPIO口是作为电机板的输入,那么对GPIO口来说就是输出。
19行的函数digitalwrite(x,y)也是wiringPi.h里的函数,用来设置GPIO 口的电平值。
在这里第一个参数同样是指向GPIO0,第二个参数有2个值:0或1。
0则GPIO口的电平为低电平,在这例子里低电平为0V。
1则GPIO口的电平为高,在这例子里高电平为5V。
在这里,是将GPIO0这个IO口的电平设置为5V。
20行是个死循环,表示程序等待,这个做法会导致系统CPU占用率飙升到100%,一般在有操作系统的环境下编程是不能这么用的。
但这里为了让程序停住便于观察实验现象,先这么写着。
解释了半天,这段代码的目的就是让GPIO0输出一个5V的电压,那么为什么GPIO0输出一个5V,就会让电机板上的LED亮起?再看一下图4的电机板电路图,GPIO0是接在ULN2003芯片的1号脚,ULN2003是一块反相驱动器,内部有8路达林顿管反相器,1号脚和16脚为其中1路的输入和输出,当GPIO0为高电平5V的时候,因为反相的作用,16脚就会输出低电平0V。
而16号脚跟VCC之间串联着1个发光二极管和1个电阻(电阻起到限流作用)当16号脚为0V,将有电流从VCC经过电阻再经过发光二级管流入到16脚,有电流经过发光二极管,发光二极管当然就亮起来了。
好了,接下来编译一下这个C源程序,看看运行的结果对不对。
Linux下编译C源程序比较麻烦,要用命令行模式,这里先简单说明一下编译的命令。
在开始或桌面点击LXTerminal进入普通用户权限的命令行模式(进入root用户权限的命令行模式也行),依次输入图7所示命令:图7ls命令是查看当前目录下的文件。
打入每句命令后,按回车就能执行。
cd命令是进入一个文件夹cd diy 当然就是进入diy这个文件夹里。
在diy文件夹里用ls查看,有若干个文件夹,这里只看01_led_on文件夹,其余不管。
再次用cd命令进入01_led_on文件夹,使用ls查看,文件夹由于是已经写好编译好,所以一共有4个文件,其中2个后缀为.c的c语言源文件,文件名分别是led_on.c和led_blink.c。
另外2个绿色的文件则分别是编译后对应产生的可执行文件,分别为led_on和led_blink。
这是已经做出来的成品。
如果是自己第一次编写的程序当然只有1个文件,那就是led_on.c。
那么使用图7中倒数第2行那句命令:gcc –o led_on led_on.c –L/usr/local/lib –lwiringPi然后回车,就能够编译led_on.c这个源文件,同时产生一个名称为led_on的可执行文件。
可执行目标文件的名称是可以变的,也就是命名为1也行,2也行,这里命名为跟源文件同名。
Linux下c语言的编译如果要说清楚得不少篇幅,这里先记住这个命令就可以了,编译不同的源文件只需要把源文件名换了就行。
编译后,自然就产生了目标可执行文件(没编译前没有的),也就是图7中上方图标像个齿轮的那个文件。
还得运行这个可执行文件,才能看到实验效果。
运行的方法是继续打入命令:sudo ./led_on回车后,就可以看到电机板上对应的led亮了。
效果如图8。
图8现在Raspberry Pi板是在运行led_on,如果想要结束运行,则在命令行模式下按键盘的ctrl+z就可以了。
另外,如果是自己编写程序,免不了程序会出错,需要修改-编译-再修改-再编译如此反复多次。
那么由于是命令行编译,修改后再编译是需要打入一整条命令进行再次编译的,这效率会极其低。
这时可以使用键盘上方向键↑,可以把之前的编译命令调用出来,这样就只需要自己手打1次就可以了。
接下来,可以再建立一个led_blink.c的源文件,然后把led_on.c的内容复制进去,再进行简单修改,如图9所示图9按照刚才的方法编译led_blink.c,生成led_blink可执行文件,再运行,会发现发光二级管闪烁了。
闪烁的原因并不复杂,读一下led_blink.c就能弄明白。
到此,实验一就结束了,接下来的实验也是这个形式,以后有不明白的地方就回头来看实验一的教程。
(教程中一些图片和资历来自互联网,感谢所有分享者,感谢wiringPi库的提供者)wiringPi库官网:/download-and-install/。