Difference between revisions of "WiringNP: NanoPi NEO/NEO2/Air GPIO Programming with C/zh"
(→WiringNP示例) |
(→WiringNP 常用API速查) |
||
Line 141: | Line 141: | ||
=== 初始化函数 === | === 初始化函数 === | ||
==== wiringPiSetup (void) ==== | ==== wiringPiSetup (void) ==== | ||
− | + | 该函数初始化wiringPi,并假定程序将使用wiringPi的管脚定义图。具体管脚映射,可以通过gpio readall命令来查看。<br /> | |
该函数需要root权限。 | 该函数需要root权限。 | ||
==== int wiringPiSetupGpio(void) ==== | ==== int wiringPiSetupGpio(void) ==== | ||
− | + | 该函数和wiringPiSetup函数类似,区别在于假定程序使用的是CPU的GPIO管脚定义,而没有重新映射。<br /> | |
− | + | 该函数需要root权限。 | |
==== int wiringPiSetupPhys (void) ==== | ==== int wiringPiSetupPhys (void) ==== | ||
− | + | 该函数和wiringPiSetup函数类似,区别在于不允许程序使用物理管脚定义,仅支持P1接口。<br /> | |
该函数需要root权限。 | 该函数需要root权限。 | ||
==== int wiringPiSetupSys (void) ==== | ==== int wiringPiSetupSys (void) ==== | ||
− | 该函数初始化wiringPi,使用/sys/class/ | + | 该函数初始化wiringPi,使用/sys/class/gpio接口,而不是直接通过操作硬件来实现。<br /> |
− | 在此种模式下,在运行程序前,您需要通过/sys/class/ | + | 该函数可以使用非root权限用户,在此种模式下的管脚号是CPU的GPIO管脚号,和wiringPiSetupGpio函数类似。<br /> |
+ | 在此种模式下,在运行程序前,您需要通过/sys/class/gpio接口导出要使用的管脚。<br /> | ||
+ | 你可以在一个独立的shell脚本中来导出将要使用的管脚,或者使用系统的system()函数来调用GPIO命令。 | ||
=== 核心函数 === | === 核心函数 === | ||
+ | ==== void pinMode (int pin, int mode) ==== | ||
+ | 使用该函数可以将某个引脚配置为INPUT(输入) OUTPUT(输出)PWM_OUTPUT(脉冲输出)或者GPIO_CLOCK(时钟)。<br /> | ||
+ | 在Sys模式下,这个函数没有影响。<br /> | ||
+ | 你可以通过调用GPIO命令在shell脚本中来设置管脚的模式。 | ||
+ | |||
+ | ==== void pullUpDnControl (int pin, int pud) ==== | ||
+ | 使用该函数可以设置指定管脚使用上拉或者下拉电阻模式,通常当需要管脚作为输入引脚时,需要设定此项。<br /> | ||
+ | 不同于Arduino,CPU有内部上拉和下拉电阻这两种模式。<br /> | ||
+ | 参数pud可以为PUD_OFF(无上拉或下拉电阻)、PUD_DOWN(内部下拉至地线)或者PUD_UP(内部上拉至3.3V)。<br /> | ||
+ | 在NanoPi M1上,内部上拉和下拉电阻有接近100KΩ。<br /> | ||
+ | 该函数在Sys模式下无作用。<br /> | ||
+ | 如果你需要激活上拉或下拉电阻的话,在启动程序前,可以通过在脚本中调用GPIO命令来实现。 | ||
+ | |||
+ | ==== void digitalWrite (int pin, int value) ==== | ||
+ | 使用该函数可以向指定的管脚写入HIGH(高)或者LOW(低),写入前,需要将管脚设置为输出模式。<br /> | ||
+ | wiringPi将任何的非0值作为HIGH(高)来对待,因此,0是唯一能够代表LOW(低)的数值。 | ||
+ | |||
+ | ==== void pwmWrite (int pin, int value) ==== | ||
+ | 使用该函数可以将值写入指定管脚的PWM寄存器中,可设置的值为0~1024,其他PWM讴备可能有不同的PWM范围。<br /> | ||
+ | 当在Sys模式时,该函数不可用来控制板上PWM。<br /> | ||
+ | |||
+ | ==== digitalRead(int pin); ==== | ||
+ | 使用该函数可以读取指定管脚的值,读取到的值为HIGH(1)或者LOW(0),该值取决于该管脚的逻辑电平的高低。<br /> | ||
+ | |||
+ | ==== analogRead (int pin) ; ==== | ||
+ | 该函数返回所指定的模拟输入管脚的值。你需要添加额外的模拟模块来使用该函数,比如Gertboard,quick2Wire模拟板等。<br /> | ||
+ | |||
+ | ==== analogWrite (int pin, int value) ; ==== | ||
+ | 该函数将指定的值写入到指定的管脚。你需要添加额外的模拟模块来使用该函数,比如Gertboard等。<br /> |
Revision as of 06:26, 2 December 2016
Contents
1 WiringPi简介
wiringPi库最早是由Gordon Henderson所编写并维护的一个用C语言写成的类库,除了GPIO库,还包括了I2C库、SPI库、UART库和软件PWM库等,由于wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。
wiringPi库除了提供wiringPi类库及其头文件外,还提供了一个命令行工具gpio:可以用来设置和读写GPIO管脚,以方便在Shell脚本中控制GPIO管脚。
2 WiringNP简介
wiringPi库最初是为BCM2835芯片编写的,后被爱好者移植到Allwinner H3平台,针对NanoPi的wiringPi衍生版本其项目命名为WiringNP,目前支持NanoPi M1和NanoPi NEO开发板, 最初版本是由网友wertyzp提供的版本。
WiringNP项目主页: https://github.com/friendlyarm/WiringNP
3 WiringNP的安装
通过ssh,或者串口终端进入开发板的命令行,从 github 上下载WiringNP代码并编译安装:
git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./build
3.1 测试安装
WiringNP包括一套gpio命令,使用gpio命令可以控制NanoPi上的各种接口,通过以下指令可以测试WiringNP是否安装成功:
gpio readall
如果安装成功会显示NanoPI的IO图,例如NanoPI M1会显示如下信息:
root@FriendlyARM:~# gpio readall +-----+-----+----------+------+---+-NanoPI M1+---+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 12 | 8 | SDA.0 | ALT5 | 0 | 3 || 4 | | | 5V | | | | 11 | 9 | SCL.0 | ALT5 | 0 | 5 || 6 | | | 0v | | | | 203 | 7 | GPIO.7 | OUT | 0 | 7 || 8 | 0 | ALT5 | TxD3 | 15 | 198 | | | | 0v | | | 9 || 10 | 0 | ALT5 | RxD3 | 16 | 199 | | 0 | 0 | RxD2 | ALT5 | 0 | 11 || 12 | 0 | OFF | GPIO.1 | 1 | 6 | | 2 | 2 | TxD2 | OFF | 0 | 13 || 14 | | | 0v | | | | 3 | 3 | CTS2 | OFF | 0 | 15 || 16 | 0 | OFF | GPIO.4 | 4 | 200 | | | | 3.3v | | | 17 || 18 | 0 | OFF | GPIO.5 | 5 | 201 | | 64 | 12 | MOSI | ALT4 | 0 | 19 || 20 | | | 0v | | | | 65 | 13 | MISO | ALT4 | 0 | 21 || 22 | 0 | ALT5 | RTS2 | 6 | 1 | | 66 | 14 | SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0 | 10 | 67 | | | | 0v | | | 25 || 26 | 0 | OFF | GPIO.11 | 11 | 17 | | 19 | 30 | SDA.1 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.1 | 31 | 18 | | 20 | 21 | GPIO.21 | OFF | 0 | 29 || 30 | | | 0v | | | | 21 | 22 | GPIO.22 | OFF | 0 | 31 || 32 | 0 | OFF | RTS1 | 26 | 7 | | 8 | 23 | GPIO.23 | OFF | 0 | 33 || 34 | | | 0v | | | | 16 | 24 | GPIO.24 | ALT4 | 0 | 35 || 36 | 0 | OFF | CTS1 | 27 | 13 | | 9 | 25 | GPIO.25 | OFF | 0 | 37 || 38 | 0 | OFF | TxD1 | 28 | 15 | | | | 0v | | | 39 || 40 | 0 | ALT4 | RxD1 | 29 | 14 | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+-NanoPI M1+---+------+----------+-----+-----+ +-----+----NanoPI M1 Debug UART---+----+ | BCM | wPi | Name | Mode | V | Ph | +-----+-----+----------+------+---+----+ | | | 0v | | | 41 | | | | 5v | | | 42 | | 4 | 32 | GPIO.4 | ALT5 | 0 | 43 | | 5 | 33 | GPIO.5 | ALT5 | 0 | 44 | +-----+-----+----------+------+---+----+
4 NanoPi M1的GPIO在WiringNP上编码方式
在上一章节gpio readall命令得到的列表中,Physical这一列显示的NanoPI M1的物量引脚编号,从1~40,
而 wPi 这一列代表的是 WiringNP 操作这个引脚时需要使用的编号,这种编号方式非常方便编程,下图是NanoPi M1的所有引脚编码:
5 WiringNP示例
将一个Matrix - LED通过连接至NanoPi M1,像下图这样:
其中,引脚的连接对应如下:
Matrix-LED | NanoPi M1 |
S | Pin7 |
V | Pin4 |
G | Pin6 |
接下来我们用WiringNP实现一个LED闪烁的例子,
首先通过命令gpio readall可以看到物理引脚Pin7所对应的wPi编号是7,所以接下来在代码中使用数字7就可以操作这个引脚。
5.1 C语言示例
创建一个C源文件:
vi test.c
然后键入如下代码:
#include <wiringPi.h> int main(void) { wiringPiSetup() ; pinMode (7, OUTPUT) ; for(;;) { digitalWrite(7, HIGH) ; delay (500) ; digitalWrite(7, LOW) ; delay (500) ; } }
编译test.c并运行:
gcc -Wall -o test test.c -lwiringPi -lpthread ./test
看到LED灯一闪一闪的,就表示成功了。
5.2 Shell示例
创建一个shell脚本:
vi test.sh
然后键入如下代码:
LED=7 gpio mode $LED out while true; do gpio write $LED 1 sleep 0.5 gpio write $LED 0 sleep 0.5 done
运行脚本:
source test.sh
会看到LED闪烁了。
6 WiringNP 常用API速查
6.1 初始化函数
6.1.1 wiringPiSetup (void)
该函数初始化wiringPi,并假定程序将使用wiringPi的管脚定义图。具体管脚映射,可以通过gpio readall命令来查看。
该函数需要root权限。
6.1.2 int wiringPiSetupGpio(void)
该函数和wiringPiSetup函数类似,区别在于假定程序使用的是CPU的GPIO管脚定义,而没有重新映射。
该函数需要root权限。
6.1.3 int wiringPiSetupPhys (void)
该函数和wiringPiSetup函数类似,区别在于不允许程序使用物理管脚定义,仅支持P1接口。
该函数需要root权限。
6.1.4 int wiringPiSetupSys (void)
该函数初始化wiringPi,使用/sys/class/gpio接口,而不是直接通过操作硬件来实现。
该函数可以使用非root权限用户,在此种模式下的管脚号是CPU的GPIO管脚号,和wiringPiSetupGpio函数类似。
在此种模式下,在运行程序前,您需要通过/sys/class/gpio接口导出要使用的管脚。
你可以在一个独立的shell脚本中来导出将要使用的管脚,或者使用系统的system()函数来调用GPIO命令。
6.2 核心函数
6.2.1 void pinMode (int pin, int mode)
使用该函数可以将某个引脚配置为INPUT(输入) OUTPUT(输出)PWM_OUTPUT(脉冲输出)或者GPIO_CLOCK(时钟)。
在Sys模式下,这个函数没有影响。
你可以通过调用GPIO命令在shell脚本中来设置管脚的模式。
6.2.2 void pullUpDnControl (int pin, int pud)
使用该函数可以设置指定管脚使用上拉或者下拉电阻模式,通常当需要管脚作为输入引脚时,需要设定此项。
不同于Arduino,CPU有内部上拉和下拉电阻这两种模式。
参数pud可以为PUD_OFF(无上拉或下拉电阻)、PUD_DOWN(内部下拉至地线)或者PUD_UP(内部上拉至3.3V)。
在NanoPi M1上,内部上拉和下拉电阻有接近100KΩ。
该函数在Sys模式下无作用。
如果你需要激活上拉或下拉电阻的话,在启动程序前,可以通过在脚本中调用GPIO命令来实现。
6.2.3 void digitalWrite (int pin, int value)
使用该函数可以向指定的管脚写入HIGH(高)或者LOW(低),写入前,需要将管脚设置为输出模式。
wiringPi将任何的非0值作为HIGH(高)来对待,因此,0是唯一能够代表LOW(低)的数值。
6.2.4 void pwmWrite (int pin, int value)
使用该函数可以将值写入指定管脚的PWM寄存器中,可设置的值为0~1024,其他PWM讴备可能有不同的PWM范围。
当在Sys模式时,该函数不可用来控制板上PWM。
6.2.5 digitalRead(int pin);
使用该函数可以读取指定管脚的值,读取到的值为HIGH(1)或者LOW(0),该值取决于该管脚的逻辑电平的高低。
6.2.6 analogRead (int pin) ;
该函数返回所指定的模拟输入管脚的值。你需要添加额外的模拟模块来使用该函数,比如Gertboard,quick2Wire模拟板等。
6.2.7 analogWrite (int pin, int value) ;
该函数将指定的值写入到指定的管脚。你需要添加额外的模拟模块来使用该函数,比如Gertboard等。