本文适合:掌握一定的linux常用基本命令,有C或Python编程基础的读者。

有很多入坑树莓派的新手会Python或者C语言,想玩转树莓派上的GPIO硬件资源,但是又不知道从何下手,本文就是一篇让新手入门树莓派GPIO硬件编程的文章。

通过安装WiringPi库,让树莓派的硬件编程变的和Arduino编程一样简单。


WiringPi库简介

WiringPi官网:http://wiringpi.com/

WiringPi是一个用C语言编写的、基于PIN的GPIO访问库,提供了GPIO、I2C、SPI、UART和PWM等库,对于树莓派的GPIO编程相当方便。目前可在基于BCM2835、BCM2836和BCM2837的树莓派中使用。其他详细介绍请参看wiringPi官网介绍。


开发/使用环境:

硬件:树莓派4B,内存:1GB,SD卡:16GB;

系统:树莓派官方 Raspberry Pi 32bit 系统。

以下操作若未特殊说明,则都在树莓派系统上进行。


WiringPi库-C语言版

库的获取与安装

有2种方式 获取wiringPi库:

方法1:从官方获取deb包来安装

官方地址:http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/ 目前(2020-09)官方WiringPi最新版本是V2.52。 参照官方文档,执行指令:

# 选择要保存的目录,笔者是用户根目录下的Work
cd ~/Work

# 下载deb包
wget https://project-downloads.drogon.net/wiringpi-latest.deb

# 安装deb包
sudo dpkg -i wiringpi-latest.deb

安装成功后,输入命令:gpio -v,可以查看WiringPi的版本,如下图:

树莓派python mpu6050 怎么解算_树莓派

可以看到WiringPi版本是V2.52的。

注: 树莓派4B必须使用V2.52或以上版本的WiringPi库,否则gpio编程可能会出现问题。 比如:从软件仓库安装的WiringPi是V2.50版本的,在执行gpio readall指令时,会出现如下错误:Oops - unable to determine board type... model: 17

如下图:

树莓派python mpu6050 怎么解算_树莓派_02

安装V2.52版本就可以成功执行了,如下图:

树莓派python mpu6050 怎么解算_Python_03

  • BCM BCM2835库中GPIO编号
  • wPi WiringPi库中GPIO的编号
  • Name GPIO名称、功能
  • Physical 物理引脚编号

注: 后面的编程示例,将会用到该图中的GPIO引脚编号,我们使用的是WiringPi库,主要看wPi这一栏。 比如:你要操作树莓派的GPIO0口,在编程时,对应WiringPi的API调用中,引脚编号就要填入 0 。

方法2:从GitHub获取WiringPi源码来安装

  • 官方地址:https://git.drogon.net/ 官方的源码地址好像不可用,打开提示如下:

git.drogon.net is currently unavailable.

  • 非官方地址:https://github.com/WiringPi/WiringPi 看介绍,这个仓库已经成为上一个“官方”源代码发行版的镜像,会持续更新。目前(2020-09)版本是V2.60。

目前 https://github.com/WiringPi 仓库支持的版本有:C/C++、Python、PHP、Node、Ruby、Perl。

执行以下命令,获取源码(笔者在Work目录下保存):

git clone https://github.com/WiringPi/WiringPi.git

进入刚下在完成的WiringPi目录,打开INSTALL文件,查看安装方法。

输入以下命令,开始编译、安装:

# 安装
    ./build
    # 卸载
    ./build uninstall

安装成功后如下图:

树莓派python mpu6050 怎么解算_python_04

执行命令gpio -v,查看WiringPi版本,是V2.60的。

注: 后面的C语言相关编程示例都将以V2.60来演示。

示例

点亮你的LED

1) 示例代码:

1.  
2. #include <stdio.h>
3. #include <wiringpi.h>
4.  
5. #define LED0 0 // 设置GPIO0为控制LED的引脚
6.  
7. int main()
8. {
9. printf("Hello world\n");
10.  
11. wiringPiSetup(); // 初始化gpio
12. pinMode(LED0, OUTPUT); // 设置gpio0为输出模式
13.  
14. while (1) {
15. // 设置GPIO0为高电平
16. printf("Set GPIO0 : H\n");
17. digitalWrite(LED0, HIGH);
18. delay(1000);
19.  
20. // 设置GPIO0为低电平
21. printf("Set GPIO0 : L\n");
22. digitalWrite(LED0, LOW);
23. delay(1000);
24. }
25.  
26. return 0;
27. }
保存文件名为:gpio.c
2) 编译代码
输入如下指令:
 
 
 
1. gcc gpio.c -o gpio -lwiringPi
• 
-lwiringPi 选项,链接WiringPi库。

3)运行程序

输入如下指令:

 

  1. ./gpio

树莓派和LED的接线:

树莓派GPIO

LED

GPIO0

负极

3.3V

正极

注: 使用3.3V,一般直径5mm的LED灯可以不用串联电阻,具体还是要根据自己LED灯的额定电流而定,一般是10mA~30mA。有的LED灯的电流很小,需要串电阻,以免LED灯烧毁。

终端提示图:

树莓派python mpu6050 怎么解算_树莓派_05

效果图如下(为了简便,笔者的LED没有串电阻,为保险起见,最好串一个470R左右的电阻限流):

树莓派python mpu6050 怎么解算_python_06


WiringPi库-Python版

库的获取

仓库地址:https://github.com/WiringPi/WiringPi-Python

WiringPi for Python版:

  • 实现类似Arduino接线的功能
  • 实现管理IO扩展的新功能

库的安装

有如下2种安装方式。

方法1:快速安装

根据WiringPi-Python官方文档,输入以下命令,即可安装Python版的WiringPi库。

1. # Python2.x 版本
2. pip install wiringpi
3.  
4. # Python3.x 版本
5. pip3 install wiringpi
注: 若安装失败,可尝试下面的编译安装。
方法2:编译、安装
1)输入以下命令,获取源码。
 
 
 
1. git clone --recursive https://github.com/WiringPi/WiringPi-Python.git
注: --recursive选项,可以自动拉取子模块,否则就需要手动下载。
2)编译、安装
进入刚下载的WiringPi-Python文件夹,打开README.rst文件,查看如何编译和安装。
输入以下命令,编译、安装:
 
 
 
1. # Python2.x 版本
2. sudo python setup.py install
3.  
4. # or
5. # Python3.x 版本
6. sudo python3 setup.py install
可能出现错误,如图:

树莓派python mpu6050 怎么解算_树莓派_07

缺少swig模块,按照提示,输入命令sudo apt install swig安装swig,完成后,然后再实行sudo python setup.py install编译、安装。

可能出现的错误,如图:

树莓派python mpu6050 怎么解算_树莓派_08

这是由于在git时没有加上--recursive选项,导致子模块C语言版的WiringPi源文件未下载,那就需要再下载C语言版的WiringPi库,下载地址见上面C语言版库的获取。 下载完成后,将C语言WiringPi目录下的所有文件剪切到Python版的WiringPi目录下,如下图:

树莓派python mpu6050 怎么解算_python_09

然后再次执行sudo python setup.py install编译、安装。成功后如下图:

树莓派python mpu6050 怎么解算_树莓派_10

3)测试一下Python库 打开examples文件夹,执行python delay.py,运行示例程序,该示例会先显示hello World,等待1.5秒后,再显示hi again,如下图:

树莓派python mpu6050 怎么解算_Python_11

注: 若运行出错,提示wiringpi模块未找到,就重启一下树莓派。


示例

点亮你的LED

本节介绍使用Python版的库,操作树莓派GPIO口。

看考WiringPi-Python里的README文件,里面介绍了一些库的使用方法。 也可以参考examples目录下的例子。

1)点灯示例:

1. #!/usr/bin/env python
2. # coding=utf-8
3.  
4. import wiringpi
5.  
6. # 设置LED控制引脚为GPIO0
7. LED0 = 0
8.  
9. OUTPUT = 1
10. INPUT = 0
11. HIGH = 1
12. LOW = 0
13.  
14. # gpio初始化
15. wiringpi.wiringPiSetup()
16. # 设置gpio0 为输出模式
17. wiringpi.pinMode(LED0, OUTPUT)
18.  
19. # 循环点亮和熄灭LED
20. while 1:
21. # 设置gpio0高电平
22. print 'Set GPIO0 : H'
23. wiringpi.digitalWrite(LED0, HIGH)
24. wiringpi.delay(1500) # 延时 1.5 seconds
25.  
26. # 设置gpio0低电平
27. print 'Set GPIO0 : L'
28. wiringpi.digitalWrite(LED0, LOW)
29. wiringpi.delay(1500) # 延时 1.5 seconds

2)运行程序

输入python gpio.py,即可运行程序,led会不停地闪烁,间隔1.5s。

树莓派和LED的接线:

树莓派GPIO

LED

GPIO0

负极

3.3V

正极

注: 使用3.3V,一般直径5mm的LED灯可以不用串联电阻,具体还是要根据自己LED灯的额定电流而定,一般是10mA~30mA。有的LED灯的电流很小,需要串电阻,以免LED灯烧毁。

终端提示图:

树莓派python mpu6050 怎么解算_树莓派_12

效果图如下(为了简便,笔者的LED没有串电阻,建议读者最好串一个470R左右的电阻限流,避免LED烧毁):

树莓派python mpu6050 怎么解算_python_06


本文主要是针对WiringPi库,使用C和Python基础编程的介绍,WiringPi库自带也有一些示例,有能力的可自行研究。


附录

WiringPi中文API文档、deb包等

  • WiringPi中文API文档,针对C语言的,Python也可以参考一下。
  • WiringPi离线版deb包,V2.52版
  • WiringPi库和WiringPi-Python库源码包,V2.60版