TA的每日心情 | 怒 5 小时前 |
---|
签到天数: 2207 天 连续签到: 3 天 [LV.Master]伴坛终老
|
树莓派之所以这么成功,除了超高性价比和完善的生态系统外,其开放的40Pin对外接口功不可没,这40Pin管脚中,除了12个电源类外,其余28个都是可编程的GPIO,其中部分GPIO可以复用为IIC,SPI,UART,PWM等等,可以用来驱动各种外设。但是这些GPIO的编号有些混乱,不同的API对于GPIO的编号不一样,而不同的API对于开发语言的支持也不同。其中比较主流的API库有以下几种:
1、wiringPi C,有Perl, PHP, Ruby, Node.JS和Golang的扩展,支持wiringPi Pin和BCM GPIO两种编号
2、RPi.GPIO Python,支持Board Pin和BCM GPIO两种编号
3、WiringPi-Go, Go语言,支持wiringPi Pin、BCM GPIO和Board Pin三种编号
看起来还是有些混乱,但是只要选择好自己需要的开发语言就可以了,比如选择Python语言,选择RPi.GPIO就好,其他语言选择wiringPi就好。
编写程序之前,先来连接硬件。
如图连接树莓派管脚和led灯,注意led的长管脚为正极,连接GPIO,短管脚连接GND。
作为我最熟悉的语言,看看C语言如何控制GPIO。
使用Putty远程登录到树莓派后,执行命令:gpio -v,可以看到默认情况下树莓派是已经安装了wirpingPi了。
我们可以使用命令行gpio readall查看树莓派的管脚定义。接下来使用C语言控制LED灯的亮灭。
vi led.c使用vi工具创建一个led.c。
输入如下代码:
#include <wiringPi.h>int main(void){ wiringPiSetup(); pinMode (1, OUTPUT); for(;;) { digitalWrite(1, HIGH); delay (500); digitalWrite(1, LOW); delay (500); }}
代码很简单,不用做过多的解释,这里需要注意的是,数字1是wPi管脚编号,通过查表可以知道,这个是板子上的物理编号12号。我们已经在这个GPIO上接了一个LED灯,接下来就可以控制这个灯了。
保存文件并退出vi后,编译并运行。
gcc -Wall -o led led.c -lwiringPisudo ./led
可以看到外接的LED灯已经开始闪烁,C语言控制GPIO成功了。
本人虽然从事C语言开发十几年了,但是Python最近是在是太火了,藉此机会正好学习一下Python语言开发,所以接下来所有代码均用Python实现。
执行pyton命令后可以看到树莓派也已经默认安装好了python开发环境了,版本是2.7.13。此时我们看到提示符变成了三个大于号,说明已经进入pyton的交互环境了,退出可以使用quit()。
vi led.py创建并编辑一个python文件。输入代码如下:
# -*- coding: utf-8 -*-import RPi.GPIO as GPIOimport time# BOARD编号方式,基于插座引脚编号GPIO.setmode(GPIO.BOARD)# 输出模式GPIO.setup(12, GPIO.OUT)while True: GPIO.output(12, GPIO.HIGH) time.sleep(1) GPIO.output(12, GPIO.LOW) time.sleep(1)保存为led.py,然后运行这个Python程序。
sudu python led.py此时外接的LED灯开始闪烁,说明Python控制LED灯成功。
有时候在执行上面的命令时,会遇到警告:
这个原因是我上次使用C语言控制了12号引脚的GPIO,系统认为被使用了,会有警告,但是程序还是会正常执行的。如果想去掉这个警告,一是重启系统,二是换一个GPIO去控制就好了。
作为我的第一个Python程序,一定要理解每一行代码的含义,接下来一起学习一下。
# -*- coding: utf-8 -*-这一行是注释,Python中单行注释以井号"#"开头,本行说明了编码格式为utf-8
import RPi.GPIO as GPIO这一行是导入RPi.GPIO模块,其中as GPIO 指的是:用 GPIO 来表示 RPi.GPIO。
import time这一行是导入time模块,也就是时间相关模块,我们会用到延时函数,所以需要导入time模块。
GPIO.setmode(GPIO.BOARD)这一行是设置GPIO的表示方式,这里可以是GPIO.BOARD(板子上的实际标号),也可以是GPIO.BCM(gpio readall列表中的BCM编号)。
GPIO.setup(12, GPIO.OUT)设置编号为12的GPIO为输出(GPIO.OUT)方式。
while Treu:表示一个死循环。
GPIO.output(12, GPIO.HIGH)表示12号GPIO输出高电平(GPIO.HIGH)
time.sleep(1)时间库中的延时函数,这里的单位是秒。
GPIO.output(12, GPIO.LOW)表示12号GPIO输出低电平(GPIO.LOW)。
通过分析代码,发现整个Python代码还是很简洁的,适合于那些没有C语言基础的朋友学习,Python 不仅上手简单,而且其解释语言的特性使得程序不用编译,对代码做了任何修改之后就能直接运行,极大方便了调试。当然对于本人这种有多年C语言开发习惯的人,想学习一下新东西,Python也是不错的选择。 |
|