一、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等。