NanoPi NEO的Matrix库硬件编程
生活随笔
收集整理的這篇文章主要介紹了
NanoPi NEO的Matrix库硬件编程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
NanoPi NEO的Matrix庫(kù)硬件編程
1、準(zhǔn)備工作
(1)安裝Matrix函數(shù)庫(kù),類似于樹(shù)莓派的wiringPi函數(shù)庫(kù),用來(lái)對(duì)Nano Pi的硬件進(jìn)行操作;
先安裝git;
$ sudo apt-get install git
安裝好后看一下版本:
$ git --version
然后去github上拿到官方的庫(kù):
$ git clone https://github.com/friendlyarm/matrix.git
安裝,編譯,需要添加權(quán)限,或者在root賬號(hào)下運(yùn)行:
# make && make install
進(jìn)入一個(gè)demo下看結(jié)果,可以看到Matrix已經(jīng)下載安裝好:
(2)下載Nano Pi NEO原理圖
http://wiki.friendlyarm.com/wiki/images/a/aa/NanoPi-NEO-1606-Schematic.pdf
2、在C程序中操作GPIO
先看一個(gè)GPIO的例子:
功能是每隔1秒,相應(yīng)的引腳上(如GPIOG11)電平發(fā)生高低變化。Wiki手冊(cè)上推薦用一個(gè)LED模塊進(jìn)行試驗(yàn),而我手里沒(méi)有該模塊,恰好手里有塊Arduino,于是想到用Arduino進(jìn)行檢測(cè),依然可以達(dá)到很好的效果:高電平LED燈亮,低電平LED燈滅。而且更加靈活。先看一下連線圖:
下面說(shuō)一下怎么找到對(duì)應(yīng)引腳,GPIOG11編號(hào)為7,GPIO_PIN(7);
1號(hào)引腳在開(kāi)發(fā)板上的位置是這樣的:
進(jìn)入GPIO的工程下,查看源代碼:
$ cd ?code/C_demo/matrix/demo/matrix-gpio_out/
$ vim Matrix-gpio_out.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "libfahw.h"
#define STATUS_CHANGE_TIMES ? ? (5)
int main(int argc, char ** argv)
{
? ? int pin = GPIO_PIN(7);
? ? int i, value, board;
? ? int ret = -1;
? ? if ((board = boardInit()) < 0) {
? ? ? ? printf("Fail to init board\n");
? ? ? ? return -1;
? ? }
? ? if (board == BOARD_NANOPI_T2)
? ? ? ? pin = GPIO_PIN(15);
? ? if (argc == 2)
? ? ? ? pin = GPIO_PIN(atoi(argv[1]));
? ? if ((ret = exportGPIOPin(pin)) == -1) {
? ? ? ? printf("exportGPIOPin(%d) failed\n", pin);
? ? }
? ? if ((ret = setGPIODirection(pin, GPIO_OUT)) == -1) {
? ? ? ? printf("setGPIODirection(%d) failed\n", pin);
? ? }
? ? for (i = 0; i < STATUS_CHANGE_TIMES; i++) {
? ? ? ? if (i % 2) {
? ? ? ? ? ? value = GPIO_HIGH;
? ? ? ? } else {
? ? ? ? ? ? value = GPIO_LOW;
? ? ? ? }
? ? ? ? if ((ret = setGPIOValue(pin, value)) > 0) {
? ? ? ? ? ? printf("%d: GPIO_PIN(%d) value is %d\n", i+1, pin, value);
? ? ? ? } else {
? ? ? ? ? ? printf("setGPIOValue(%d) failed\n", pin);
? ? ? ? }
? ? ? ? sleep(1);
? ? }
? ? unexportGPIOPin(pin);
? ? return 0;
}
程序的流程比較簡(jiǎn)單,初始化開(kāi)發(fā)板 -> 導(dǎo)出GPIO引腳 -> 設(shè)定GPIO方向(輸入還是輸出)-> 然后進(jìn)行5次循環(huán),間隔1秒高低電平切換。
下面再貼出Arduino的代碼(其功能是檢測(cè)對(duì)應(yīng)引腳的電平變化,然后用LED燈進(jìn)行指示):
// set pin numbers:
const int buttonPin = 2; ? ? // the number of the pushbutton pin
const int ledPin = ?13; ? ? ?// the number of the LED pin
// variables will change:
int buttonState = 0; ? ? ? ? // variable for reading the pushbutton status
void setup() {
? // initialize the LED pin as an output:
? pinMode(ledPin, OUTPUT);
? // initialize the pushbutton pin as an input:
? pinMode(buttonPin, INPUT);
}
void loop() {
? // read the state of the pushbutton value:
? buttonState = digitalRead(buttonPin);
? // check if the pushbutton is pressed.
? // if it is, the buttonState is HIGH:
? if (buttonState == HIGH) {
? ? // turn LED on:
? ? digitalWrite(ledPin, HIGH);
? } else {
? ? // turn LED off:
? ? digitalWrite(ledPin, LOW);
? }
}
3 GPIO和sysfs操作接口
上一小節(jié)是利用官方提供的庫(kù)文件進(jìn)行操作硬件,其實(shí)也可以用另一種方式進(jìn)行。
科普一下,Linux下用文件IO的方式操作GPIO(/sys/class/gpio),通過(guò)sysfs方式控制GPIO,先訪問(wèn)/sys/class/gpio目錄,向export文件寫(xiě)入GPIO編號(hào),使得該GPIO的操作接口從內(nèi)核空間暴露到用戶空間,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO輸出或獲得GPIO輸入。文件IO方式操作GPIO,使用到了4個(gè)函數(shù)open、close、read、write。
ARM Linux開(kāi)發(fā)板GPIO輸入輸出接口操作,對(duì)于大部分的 ARM Linux 開(kāi)發(fā)板來(lái)說(shuō),其實(shí)都已經(jīng)把所有的GPIO驅(qū)動(dòng)做好了,我們要做的就是去使用它。
(1)、GPIO目錄
在ARM Linux中,GPIO驅(qū)動(dòng)的目錄是:/sys/class/gpio/,所以,要首先進(jìn)入這個(gè)目錄,命令:
$ cd /sys/class/gpio/
(2)、目錄解析
使用ls命令查看目錄詳情:
$ ls?
export ?gpiochip0 ?unexport
如上列出了1個(gè)gpio目錄、export、unexport文件。gpio目錄對(duì)應(yīng)基地址,比如芯片的IO定義為GPIO0_0~GPIO0_31、GPIO1_0~GPIO1_31等等,那么GPIO0對(duì)應(yīng)的base就是gpiochip0,GPIO1對(duì)應(yīng)的base就是gpiochip32,以此類推。大家有興趣可以可以進(jìn)入其中一個(gè)目錄看看,
$cd gpiochip0
$ls
base ? ? ? label ? ? ?ngpio ? ? ?power ? ? ?subsystem ?uevent
具體內(nèi)容就不一一介紹了,如果有需要,我可以再寫(xiě)個(gè)介紹。
(3)、控制實(shí)例
比如要實(shí)現(xiàn)控制 GPIOG_11(6*32+11=203) 口,先將其引腳進(jìn)行導(dǎo)出,在/sys/class/gpio目錄下生成一個(gè)gpio203 目錄:
$ echo 203 > export
$ ls
export ?gpio203 ?gpiochip0 ?unexport
$ cd gpio203
$ ls
active_low ?direction ? edge ? ? ? ?power ? ? ? subsystem ? uevent
(4)、控制
$ cat direction ? ? ? ?#查看方向
in
$ echo out > direction ? #設(shè)置為輸出
$ cat value ? ? ? ? ? #獲取值
0
$ echo 1 > value ? ? ? #設(shè)置為1,高電平
$ echo 0 > value ? ? ? #設(shè)置為0,低電平
這時(shí)可以實(shí)現(xiàn)相同的控制效果。
4 小結(jié)
本來(lái)想多體驗(yàn)幾個(gè)example,發(fā)現(xiàn)手里缺乏很多必要配件,如ADC部分,官方需要PCF8591模數(shù)轉(zhuǎn)換器,而我手里也沒(méi)有。等下次手里有了更多配件再嘗試其他的例程。
下一期,我準(zhǔn)備嘗試連接攝像頭模塊進(jìn)行測(cè)試。敬請(qǐng)期待。
1、準(zhǔn)備工作
(1)安裝Matrix函數(shù)庫(kù),類似于樹(shù)莓派的wiringPi函數(shù)庫(kù),用來(lái)對(duì)Nano Pi的硬件進(jìn)行操作;
先安裝git;
$ sudo apt-get install git
安裝好后看一下版本:
$ git --version
然后去github上拿到官方的庫(kù):
$ git clone https://github.com/friendlyarm/matrix.git
安裝,編譯,需要添加權(quán)限,或者在root賬號(hào)下運(yùn)行:
# make && make install
進(jìn)入一個(gè)demo下看結(jié)果,可以看到Matrix已經(jīng)下載安裝好:
(2)下載Nano Pi NEO原理圖
http://wiki.friendlyarm.com/wiki/images/a/aa/NanoPi-NEO-1606-Schematic.pdf
2、在C程序中操作GPIO
先看一個(gè)GPIO的例子:
功能是每隔1秒,相應(yīng)的引腳上(如GPIOG11)電平發(fā)生高低變化。Wiki手冊(cè)上推薦用一個(gè)LED模塊進(jìn)行試驗(yàn),而我手里沒(méi)有該模塊,恰好手里有塊Arduino,于是想到用Arduino進(jìn)行檢測(cè),依然可以達(dá)到很好的效果:高電平LED燈亮,低電平LED燈滅。而且更加靈活。先看一下連線圖:
下面說(shuō)一下怎么找到對(duì)應(yīng)引腳,GPIOG11編號(hào)為7,GPIO_PIN(7);
1號(hào)引腳在開(kāi)發(fā)板上的位置是這樣的:
進(jìn)入GPIO的工程下,查看源代碼:
$ cd ?code/C_demo/matrix/demo/matrix-gpio_out/
$ vim Matrix-gpio_out.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "libfahw.h"
#define STATUS_CHANGE_TIMES ? ? (5)
int main(int argc, char ** argv)
{
? ? int pin = GPIO_PIN(7);
? ? int i, value, board;
? ? int ret = -1;
? ? if ((board = boardInit()) < 0) {
? ? ? ? printf("Fail to init board\n");
? ? ? ? return -1;
? ? }
? ? if (board == BOARD_NANOPI_T2)
? ? ? ? pin = GPIO_PIN(15);
? ? if (argc == 2)
? ? ? ? pin = GPIO_PIN(atoi(argv[1]));
? ? if ((ret = exportGPIOPin(pin)) == -1) {
? ? ? ? printf("exportGPIOPin(%d) failed\n", pin);
? ? }
? ? if ((ret = setGPIODirection(pin, GPIO_OUT)) == -1) {
? ? ? ? printf("setGPIODirection(%d) failed\n", pin);
? ? }
? ? for (i = 0; i < STATUS_CHANGE_TIMES; i++) {
? ? ? ? if (i % 2) {
? ? ? ? ? ? value = GPIO_HIGH;
? ? ? ? } else {
? ? ? ? ? ? value = GPIO_LOW;
? ? ? ? }
? ? ? ? if ((ret = setGPIOValue(pin, value)) > 0) {
? ? ? ? ? ? printf("%d: GPIO_PIN(%d) value is %d\n", i+1, pin, value);
? ? ? ? } else {
? ? ? ? ? ? printf("setGPIOValue(%d) failed\n", pin);
? ? ? ? }
? ? ? ? sleep(1);
? ? }
? ? unexportGPIOPin(pin);
? ? return 0;
}
程序的流程比較簡(jiǎn)單,初始化開(kāi)發(fā)板 -> 導(dǎo)出GPIO引腳 -> 設(shè)定GPIO方向(輸入還是輸出)-> 然后進(jìn)行5次循環(huán),間隔1秒高低電平切換。
下面再貼出Arduino的代碼(其功能是檢測(cè)對(duì)應(yīng)引腳的電平變化,然后用LED燈進(jìn)行指示):
// set pin numbers:
const int buttonPin = 2; ? ? // the number of the pushbutton pin
const int ledPin = ?13; ? ? ?// the number of the LED pin
// variables will change:
int buttonState = 0; ? ? ? ? // variable for reading the pushbutton status
void setup() {
? // initialize the LED pin as an output:
? pinMode(ledPin, OUTPUT);
? // initialize the pushbutton pin as an input:
? pinMode(buttonPin, INPUT);
}
void loop() {
? // read the state of the pushbutton value:
? buttonState = digitalRead(buttonPin);
? // check if the pushbutton is pressed.
? // if it is, the buttonState is HIGH:
? if (buttonState == HIGH) {
? ? // turn LED on:
? ? digitalWrite(ledPin, HIGH);
? } else {
? ? // turn LED off:
? ? digitalWrite(ledPin, LOW);
? }
}
3 GPIO和sysfs操作接口
上一小節(jié)是利用官方提供的庫(kù)文件進(jìn)行操作硬件,其實(shí)也可以用另一種方式進(jìn)行。
科普一下,Linux下用文件IO的方式操作GPIO(/sys/class/gpio),通過(guò)sysfs方式控制GPIO,先訪問(wèn)/sys/class/gpio目錄,向export文件寫(xiě)入GPIO編號(hào),使得該GPIO的操作接口從內(nèi)核空間暴露到用戶空間,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO輸出或獲得GPIO輸入。文件IO方式操作GPIO,使用到了4個(gè)函數(shù)open、close、read、write。
ARM Linux開(kāi)發(fā)板GPIO輸入輸出接口操作,對(duì)于大部分的 ARM Linux 開(kāi)發(fā)板來(lái)說(shuō),其實(shí)都已經(jīng)把所有的GPIO驅(qū)動(dòng)做好了,我們要做的就是去使用它。
(1)、GPIO目錄
在ARM Linux中,GPIO驅(qū)動(dòng)的目錄是:/sys/class/gpio/,所以,要首先進(jìn)入這個(gè)目錄,命令:
$ cd /sys/class/gpio/
(2)、目錄解析
使用ls命令查看目錄詳情:
$ ls?
export ?gpiochip0 ?unexport
如上列出了1個(gè)gpio目錄、export、unexport文件。gpio目錄對(duì)應(yīng)基地址,比如芯片的IO定義為GPIO0_0~GPIO0_31、GPIO1_0~GPIO1_31等等,那么GPIO0對(duì)應(yīng)的base就是gpiochip0,GPIO1對(duì)應(yīng)的base就是gpiochip32,以此類推。大家有興趣可以可以進(jìn)入其中一個(gè)目錄看看,
$cd gpiochip0
$ls
base ? ? ? label ? ? ?ngpio ? ? ?power ? ? ?subsystem ?uevent
具體內(nèi)容就不一一介紹了,如果有需要,我可以再寫(xiě)個(gè)介紹。
(3)、控制實(shí)例
比如要實(shí)現(xiàn)控制 GPIOG_11(6*32+11=203) 口,先將其引腳進(jìn)行導(dǎo)出,在/sys/class/gpio目錄下生成一個(gè)gpio203 目錄:
$ echo 203 > export
$ ls
export ?gpio203 ?gpiochip0 ?unexport
$ cd gpio203
$ ls
active_low ?direction ? edge ? ? ? ?power ? ? ? subsystem ? uevent
(4)、控制
$ cat direction ? ? ? ?#查看方向
in
$ echo out > direction ? #設(shè)置為輸出
$ cat value ? ? ? ? ? #獲取值
0
$ echo 1 > value ? ? ? #設(shè)置為1,高電平
$ echo 0 > value ? ? ? #設(shè)置為0,低電平
這時(shí)可以實(shí)現(xiàn)相同的控制效果。
4 小結(jié)
本來(lái)想多體驗(yàn)幾個(gè)example,發(fā)現(xiàn)手里缺乏很多必要配件,如ADC部分,官方需要PCF8591模數(shù)轉(zhuǎn)換器,而我手里也沒(méi)有。等下次手里有了更多配件再嘗試其他的例程。
下一期,我準(zhǔn)備嘗試連接攝像頭模塊進(jìn)行測(cè)試。敬請(qǐng)期待。
總結(jié)
以上是生活随笔為你收集整理的NanoPi NEO的Matrix库硬件编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SIM卡初始化
- 下一篇: 关于Zigbee的常识