NanoPi Duo 安装wiringPi库 控制gpio

linux / 2018年04月27日 10时15分 / 9029人浏览

一、wiringPi库的安装

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

二、测试安装

WiringNP包括一套gpio命令,使用gpio命令可以控制NanoPi上的各种接口,通过以下指令可以测试WiringNP是否安装成功:
gpio readall
如果安装成功会显示NanoPI Duo的IO图,例如会显示如下信息:

三、点亮LED灯

在上述过程中安装好了wiringPi库,接下来就可以编写一个简单的GPIO口操作函数进行测试了,编写LED的简单程序进行测试。 在Nano Pi将使用其中一个引脚作为LED灯的阳极(gpioa11),另外一端阴极接地即可(GND,0v)。 GPIOG11在wiringPi库中的wPi编号如下,为13 简单LED测试程序编写
vim test.c
#include 
    int main(void)
    {
      wiringPiSetup() ;
      pinMode (13, OUTPUT) ;
      for(;;)
      {
        digitalWrite(13, HIGH) ;
        delay (500) ;
        digitalWrite(13,  LOW) ;
        delay (500) ;
      }
    }
编译test.c并运行:
gcc -Wall -o test test.c -lwiringPi -lpthread
sudo ./test
看到LED灯一闪一闪的,就表示成功了。 Shell示例 创建一个shell脚本:
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的正常使用。 代码如下:
vim pwmtest.c
#include 
#include 
#include 
#include 
#include 

#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呼吸效果,测试完成。
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等。