从上图可以知道树莓派管脚有三种编号方式,下面以Pioneer600扩展板的LED1为例,第一种为板上编号(37),即中间两列,表示第几号插针。第二中为wiringPi编码(25),使用wiringPi库编程时是用wiringPi编号,第三种为BCM编号,这个是更加BCM管脚来编号的,使用bcm2835库或python的RPi.GPIO编程时使用BCM编号。

我们可以使用gpio命令操作树莓派GPIO,下面我们可以gpio命令控制Pioneer600扩展的LED1.

gpio -g mode 26 out

设置管脚为输出模式,-g参数表示是以BCM编号方式,如果去掉这个参数测以wiringPi编号方式,即为25。

gpio -g write 26 1

设置管脚为高电平,点亮LED.

gpio -g write 26 0

设置管脚为低电平,熄灭LED,

gpio -g read 26

读取管脚当前状态

3、wiringPi程序:

cpp代码:#include

char LED = 25;

int main(void)

{

if(wiringPiSetup() < 0)return 1;

pinMode (LED,OUTPUT) ;

while(1)

{

digitalWrite(LED, 1) ;

delay (200);

digitalWrite(LED, 0) ;

delay (200);

}

}

使用vi将代码添加到led.c文件中,运行如下命令编译并执行程序。按Ctrl+C终止程序。

gcc -Wall -o led led.c -lwiringPi

sudo ./led

注:(1)-Wall 表示编译时显示所有警告,-lwringPi表示编译时动态加载wringPi库

(2)终止程序后,LED的状态为不确定,这和python程序相比显得有点不足。

关于更多wiringPi的库函数,可参看wiringPi官网,也可参考wiringPi用户手册。

二、 bcm2835

bcm2835库是树莓派cpu芯片的库函数,相当于stm32的固件库一样,底层是直接操作寄存器。而wiringPi库和python的RPi.GPIO库其底层都是通过读写linux系统的设备文件操作设备。

1、安装bcm2835库

tar -zxvf bcm2835-1.xx.tar.gz

cd bcm2835-1.xx

./configure

make

sudo make check

sudo make install

2、示例程序

新建名为led.c的文件,添加如下程序。

cpp代码:#include 
#define PIN 26
int main(int argc, char **argv)
{
if (!bcm2835_init())return 1;
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);
while (1)
{
bcm2835_gpio_write(PIN, HIGH);
bcm2835_delay(500);
bcm2835_gpio_write(PIN, LOW);
bcm2835_delay(500);
}
bcm2835_close();
return 0;
}

编译并执行程序,按Ctrl+C可结束程序。

gcc –Wall led.c –o led –lbcm2835

sudo ./led

注:(1)-lbcm2835表示动态加载bcm2835库

(2)注意bcm2835程序管脚使用bcm编号,和wiringPi编号不一样。

(3)和wiringPi一样,程序结束时GPIO的状态不确定。

三、python

1、安装RPi.GPIO

(1)先安装python-dev,输入以下指令。

sudo apt-get install python-dev

(2)安装RPi.GPIO#下载

wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz

#解压:

tar -zxvf RPi.GPIO-0.5.11.tar.gz

#进入解压之后的目录 :

cd RPi.GPIO-0.5.3a

#启动安装 :

sudo python setup.py install

2.示例程序

新建led.py文件,添加如下代码并保存。

#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
LED = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
try:
while True:
GPIO.output(LED,GPIO.HIGH)
time.sleep(1)
GPIO.output(LED,GPIO.LOW)
time.sleep(1)
except:
print("except")
GPIO.cleanup()
执行程序,按Ctrl+C结束程序
sudo python led.py

注:(1)#!/usr/bin/env python,定义python解析脚本的绝对路径。

(2)# -*- coding: utf-8 -*-,python文件为utf-8格式,否则无法写入中文注释。

(3)  GPIO.setmode(GPIO.BCM),采用bcm编号方式。

(4) python程序使用try except语言,当按下Ctrl+C结束程序是会触发异常,程序执行gpio.cleanup()语句清楚GPIO管脚状态。