一. GPIO库介绍
对于树莓派,现在有wiringPi,BCM2835,python三种库可以使用。
python
- 开发语言:python
- 简单介绍:树莓派官方资料中推荐且容易上手,毫无疑问的说python非常适合树莓派,树莓派也非常适合python。
wiringPI
- 开发语言:C、C++
- 简单介绍:功能很强大,适合那些具有C语言基础,在接触树莓派之前已经接触过单片机或者嵌入式开发的人群。wiringPi的API函数和arduino非常相似,且作者也给出了很多示例代码,这也使得它广受欢迎。
BCM2835
- 开发语言:C、C++
- 简单介绍:BCM2835库是树莓派CPU芯片的库函数,相当于STM32的固件库一样,底层是直接操作寄存器。
二. 引脚编号方式
GPIO的编号有三种不同的方式:
【1】插座引脚编号方式
编号侧重P1插座侧,从上到下,从左到右。正如上图的Header一栏。
【2】BCM2835编号方式
编号侧重CPU寄存器,根据BCM2835的GPIO寄存器编号。正如上图BCM GPIO一栏。
【3】wiringPi编号方式
编号侧重实现逻辑,把扩展GPIO端口从0开始编号,这种编号方便编程。正如上图WiringPi一栏。
三. 来个GPIO操作吧
下面我们尝试通过编程使GPIO0(11号引脚)输出一个指定电平吧。
1. python库
先执行以下指令,安装一下库:
pip install RPi.GPIO
pip install spidev
安装完后,打开IDE,输入以下代码后运行:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD) # BOARD编号方式,基于插座引脚编号
GPIO.setup(11, GPIO.OUT) # 输出模式
# GPIO.setmode(GPIO.BCM) # 若使用BCM编号方式,上两行代码应这样写
# GPIO.setup(17, GPIO.OUT) # 对应为17号脚
while True:
GPIO.output(11, GPIO.HIGH)
time.sleep(1)
GPIO.output(11, GPIO.LOW)
time.sleep(1)
通过万用表测量电平,可以看到11号脚每一秒置换一次电平。
2. wiringPI库
wiringPI库的常用函数介绍请看这里。
依次输入以下指令,安装一下库(仅适用于Raspbian):
sudo apt-get install wiringpi
mkdir WiringPI #创建WiringPI文件夹
cd WiringPI #
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
如下图所示:
然后,执行gpio -v
,如果能看到GPIO版本信息,则安装成功。
然后执行gpio readall
,可以查询到管脚信息。
(1)可视化编程方法
这种方法较为直接,在桌面新建c_test.c
文件,双击打开,输入下面代码后保存。
#include <stdio.h>
#include <wiringPi.h>
int main(void)
{
int LED = 0;
wiringPiSetup();
pinMode(LED, OUTPUT); // 在wiringPi编号格式中,GPIO0编号为0
printf("LED is blinking...\r\n");
while(1)
{
printf("LED:%d is on \r\n", LED);
digitalWrite(LED, HIGH);delay(1000);
printf("LED:%d is off \r\n", LED);
digitalWrite(LED, LOW);delay(1000);
}
return 0;
}
回到终端,依次输入:
gcc -o c_test c_test.c -lwiringPi # 编译并生成可执行文件
./c_test # 运行可执行文件
通过万用表测量电平,可以看到11号脚每秒置换一次电平。
-lwiringPi参数表示动态加载wiringPi共享库,丢失这个参数的话会报错。
终端中Ctrl + Z可以停止运行。
(2)命令行方法:
在终端依次输入:
touch c_test1.c
sudo nano c_test1.c
复制上面的C代码进去后保存。
格式会有点乱,但是不影响效果
然后继续输入:
gcc -o c_test c_test.c -lwiringPi
./c_test
通过万用表测量电平,可以看到11号脚每秒置换一次电平。