just do it

NanoPi Duo 安装wiringPi库 控制gpio

一、wiringPi库的安装

在友善之臂的官方资料中介绍了Nano Pi Duo开发板上移植了wiringPi库,wiringPi库除了提供wiringPi类库及其头文件外,还提供了一个命令行工具gpio:可以用来设置和读写GPIO管脚,以方便在Shell脚本中控制GPIO管脚,下面介绍如何在Nano Pi Duo开发板中安装wiringPi库。
安装的主要过程主要是进行wiringNP的源码下载并且编译安装

1
2
3
4
git clone https://github.com/friendlyarm/WiringNP
cd WiringNP/
chmod 755 build
./build

二、测试安装

WiringNP包括一套gpio命令,使用gpio命令可以控制NanoPi上的各种接口,通过以下指令可以测试WiringNP是否安装成功:

1
gpio readall

如果安装成功会显示NanoPI Duo的IO图,例如会显示如下信息:

三、点亮LED灯

在上述过程中安装好了wiringPi库,接下来就可以编写一个简单的GPIO口操作函数进行测试了,编写LED的简单程序进行测试。
在Nano Pi将使用其中一个引脚作为LED灯的阳极(gpioa11),另外一端阴极接地即可(GND,0v)。

GPIOG11在wiringPi库中的wPi编号如下,为13

简单LED测试程序编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim test.c
#include <wiringPi.h>
    int main(void)
    {
      wiringPiSetup() ;
      pinMode (13, OUTPUT) ;
      for(;;)
      {
        digitalWrite(13, HIGH) ;
        delay (500) ;
        digitalWrite(13,  LOW) ;
        delay (500) ;
      }
    }

编译test.c并运行:

1
2
gcc -Wall -o test test.c -lwiringPi -lpthread
sudo ./test

看到LED灯一闪一闪的,就表示成功了。

Shell示例
创建一个shell脚本:

1
2
3
4
5
6
7
8
9
vim test.sh
LED=13
gpio mode $LED out
while true; do
  gpio write $LED 1
  sleep 0.5
  gpio write $LED 0
  sleep 0.5
done

四、软PWM波测试

wiringPi里面包含了软件PWM的库,包含软件PWM的头文件即可使用软PWM波,下面的程序测试软PWM的使用,使用上面的IO口的LED进行测试,程序的主要作用是改变PWM的占空比,使其LED灯达到渐暗渐亮的效果,从而可以验证软件PWM的正常使用。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
vim pwmtest.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <wiringPi.h>
#include <softPwm.h>
 
#define LED 13   
 
int main(void)
{
    int i = 0;
    if (wiringPiSetup() == -1)  
    {
        printf("Setup GPIO error!\n");
        return -1;
    }
    softPwmCreate(LED, 0, 100);  
    while (1)
    {
        for (i = 0; i < 100; i++)
        {
            softPwmWrite(LED, i);
            delay(10);
        }
        for (i = 99; i > 0; i--)
        {
            softPwmWrite(LED, i);
            delay(10);
        }
    }
    return 0;
}

程序保存为pwmtest.c,编写完成后,对程序进行编译执行,执行后LED达到渐暗渐亮的效果,也就是常见的LED呼吸效果,测试完成。

1
2
sudo gcc pwmtest.c -o  softpwm -lwiringPi -lpthread
sudo ./softpwm

wiringPi库中具有软件PWM的库使用,非常方便,但是软件模拟的PWM有一些限制。因为PWM的频率越高,所需要的CPU资源越多,所以在这之间有一些平衡。

五、WiringNP 常用API速查

初始化函数
wiringPiSetup (void)
该函数初始化wiringPi,并假定程序将使用wiringPi的管脚定义图。具体管脚映射,可以通过gpio readall命令来查看。
该函数需要root权限。

int wiringPiSetupGpio(void)
该函数和wiringPiSetup函数类似,区别在于假定程序使用的是CPU的GPIO管脚定义,而没有重新映射。
该函数需要root权限。

int wiringPiSetupPhys (void)
该函数和wiringPiSetup函数类似,区别在于不允许程序使用物理管脚定义,仅支持P1接口。
该函数需要root权限。

int wiringPiSetupSys (void)
该函数初始化wiringPi,使用/sys/class/gpio接口,而不是直接通过操作硬件来实现。
该函数可以使用非root权限用户,在此种模式下的管脚号是CPU的GPIO管脚号,和wiringPiSetupGpio函数类似。
在此种模式下,在运行程序前,您需要通过/sys/class/gpio接口导出要使用的管脚。
你可以在一个独立的shell脚本中来导出将要使用的管脚,或者使用系统的system()函数来调用GPIO命令。

核心函数
void pinMode (int pin, int mode)
使用该函数可以将某个引脚配置为INPUT(输入) OUTPUT(输出)PWM_OUTPUT(脉冲输出)或者GPIO_CLOCK(时钟)。
在Sys模式下,这个函数没有影响。
你可以通过调用GPIO命令在shell脚本中来设置管脚的模式。

void pullUpDnControl (int pin, int pud)
使用该函数可以设置指定管脚使用上拉或者下拉电阻模式,通常当需要管脚作为输入引脚时,需要设定此项。
不同于Arduino,CPU有内部上拉和下拉电阻这两种模式。
参数pud可以为PUD_OFF(无上拉或下拉电阻)、PUD_DOWN(内部下拉至地线)或者PUD_UP(内部上拉至3.3V)。
在NanoPi M1上,内部上拉和下拉电阻有接近100KΩ。
该函数在Sys模式下无作用。
如果你需要激活上拉或下拉电阻的话,在启动程序前,可以通过在脚本中调用GPIO命令来实现。

void digitalWrite (int pin, int value)
使用该函数可以向指定的管脚写入HIGH(高)或者LOW(低),写入前,需要将管脚设置为输出模式。
wiringPi将任何的非0值作为HIGH(高)来对待,因此,0是唯一能够代表LOW(低)的数值。

void pwmWrite (int pin, int value)
使用该函数可以将值写入指定管脚的PWM寄存器中,可设置的值为0~1024,其他PWM讴备可能有不同的PWM范围。
当在Sys模式时,该函数不可用来控制板上PWM。
digitalRead(int pin);
使用该函数可以读取指定管脚的值,读取到的值为HIGH(1)或者LOW(0),该值取决于该管脚的逻辑电平的高低。
analogRead (int pin) ;
该函数返回所指定的模拟输入管脚的值。你需要添加额外的模拟模块来使用该函数,比如Gertboard,quick2Wire模拟板等。
analogWrite (int pin, int value) ;
该函数将指定的值写入到指定的管脚。你需要添加额外的模拟模块来使用该函数,比如Gertboard等。

点赞