查看: 15379|回复: 0

树莓派Python控制GPIO

[复制链接]
  • TA的每日心情

    昨天 09:55
  • 签到天数: 2190 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-4-2 16:16:29 | 显示全部楼层 |阅读模式
    分享到:
    树莓派之所以这么成功,除了超高性价比和完善的生态系统外,其开放的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也是不错的选择。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 12:28 , Processed in 0.131837 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.