NanoPi NEO的Matrix库硬件编程
生活随笔
收集整理的這篇文章主要介紹了
NanoPi NEO的Matrix库硬件编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NanoPi NEO的Matrix庫硬件編程
1、準備工作
(1)安裝Matrix函數庫,類似于樹莓派的wiringPi函數庫,用來對Nano Pi的硬件進行操作;
先安裝git;
$ sudo apt-get install git
安裝好后看一下版本:
$ git --version
然后去github上拿到官方的庫:
$ git clone https://github.com/friendlyarm/matrix.git
安裝,編譯,需要添加權限,或者在root賬號下運行:
# make && make install
進入一個demo下看結果,可以看到Matrix已經下載安裝好:
(2)下載Nano Pi NEO原理圖
http://wiki.friendlyarm.com/wiki/images/a/aa/NanoPi-NEO-1606-Schematic.pdf
2、在C程序中操作GPIO
先看一個GPIO的例子:
功能是每隔1秒,相應的引腳上(如GPIOG11)電平發生高低變化。Wiki手冊上推薦用一個LED模塊進行試驗,而我手里沒有該模塊,恰好手里有塊Arduino,于是想到用Arduino進行檢測,依然可以達到很好的效果:高電平LED燈亮,低電平LED燈滅。而且更加靈活。先看一下連線圖:
下面說一下怎么找到對應引腳,GPIOG11編號為7,GPIO_PIN(7);
1號引腳在開發板上的位置是這樣的:
進入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;
}
程序的流程比較簡單,初始化開發板 -> 導出GPIO引腳 -> 設定GPIO方向(輸入還是輸出)-> 然后進行5次循環,間隔1秒高低電平切換。
下面再貼出Arduino的代碼(其功能是檢測對應引腳的電平變化,然后用LED燈進行指示):
// 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操作接口
上一小節是利用官方提供的庫文件進行操作硬件,其實也可以用另一種方式進行。
科普一下,Linux下用文件IO的方式操作GPIO(/sys/class/gpio),通過sysfs方式控制GPIO,先訪問/sys/class/gpio目錄,向export文件寫入GPIO編號,使得該GPIO的操作接口從內核空間暴露到用戶空間,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO輸出或獲得GPIO輸入。文件IO方式操作GPIO,使用到了4個函數open、close、read、write。
ARM Linux開發板GPIO輸入輸出接口操作,對于大部分的 ARM Linux 開發板來說,其實都已經把所有的GPIO驅動做好了,我們要做的就是去使用它。
(1)、GPIO目錄
在ARM Linux中,GPIO驅動的目錄是:/sys/class/gpio/,所以,要首先進入這個目錄,命令:
$ cd /sys/class/gpio/
(2)、目錄解析
使用ls命令查看目錄詳情:
$ ls?
export ?gpiochip0 ?unexport
如上列出了1個gpio目錄、export、unexport文件。gpio目錄對應基地址,比如芯片的IO定義為GPIO0_0~GPIO0_31、GPIO1_0~GPIO1_31等等,那么GPIO0對應的base就是gpiochip0,GPIO1對應的base就是gpiochip32,以此類推。大家有興趣可以可以進入其中一個目錄看看,
$cd gpiochip0
$ls
base ? ? ? label ? ? ?ngpio ? ? ?power ? ? ?subsystem ?uevent
具體內容就不一一介紹了,如果有需要,我可以再寫個介紹。
(3)、控制實例
比如要實現控制 GPIOG_11(6*32+11=203) 口,先將其引腳進行導出,在/sys/class/gpio目錄下生成一個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 ? #設置為輸出
$ cat value ? ? ? ? ? #獲取值
0
$ echo 1 > value ? ? ? #設置為1,高電平
$ echo 0 > value ? ? ? #設置為0,低電平
這時可以實現相同的控制效果。
4 小結
本來想多體驗幾個example,發現手里缺乏很多必要配件,如ADC部分,官方需要PCF8591模數轉換器,而我手里也沒有。等下次手里有了更多配件再嘗試其他的例程。
下一期,我準備嘗試連接攝像頭模塊進行測試。敬請期待。
1、準備工作
(1)安裝Matrix函數庫,類似于樹莓派的wiringPi函數庫,用來對Nano Pi的硬件進行操作;
先安裝git;
$ sudo apt-get install git
安裝好后看一下版本:
$ git --version
然后去github上拿到官方的庫:
$ git clone https://github.com/friendlyarm/matrix.git
安裝,編譯,需要添加權限,或者在root賬號下運行:
# make && make install
進入一個demo下看結果,可以看到Matrix已經下載安裝好:
(2)下載Nano Pi NEO原理圖
http://wiki.friendlyarm.com/wiki/images/a/aa/NanoPi-NEO-1606-Schematic.pdf
2、在C程序中操作GPIO
先看一個GPIO的例子:
功能是每隔1秒,相應的引腳上(如GPIOG11)電平發生高低變化。Wiki手冊上推薦用一個LED模塊進行試驗,而我手里沒有該模塊,恰好手里有塊Arduino,于是想到用Arduino進行檢測,依然可以達到很好的效果:高電平LED燈亮,低電平LED燈滅。而且更加靈活。先看一下連線圖:
下面說一下怎么找到對應引腳,GPIOG11編號為7,GPIO_PIN(7);
1號引腳在開發板上的位置是這樣的:
進入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;
}
程序的流程比較簡單,初始化開發板 -> 導出GPIO引腳 -> 設定GPIO方向(輸入還是輸出)-> 然后進行5次循環,間隔1秒高低電平切換。
下面再貼出Arduino的代碼(其功能是檢測對應引腳的電平變化,然后用LED燈進行指示):
// 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操作接口
上一小節是利用官方提供的庫文件進行操作硬件,其實也可以用另一種方式進行。
科普一下,Linux下用文件IO的方式操作GPIO(/sys/class/gpio),通過sysfs方式控制GPIO,先訪問/sys/class/gpio目錄,向export文件寫入GPIO編號,使得該GPIO的操作接口從內核空間暴露到用戶空間,GPIO的操作接口包括direction和value等,direction控制GPIO方向,而value可控制GPIO輸出或獲得GPIO輸入。文件IO方式操作GPIO,使用到了4個函數open、close、read、write。
ARM Linux開發板GPIO輸入輸出接口操作,對于大部分的 ARM Linux 開發板來說,其實都已經把所有的GPIO驅動做好了,我們要做的就是去使用它。
(1)、GPIO目錄
在ARM Linux中,GPIO驅動的目錄是:/sys/class/gpio/,所以,要首先進入這個目錄,命令:
$ cd /sys/class/gpio/
(2)、目錄解析
使用ls命令查看目錄詳情:
$ ls?
export ?gpiochip0 ?unexport
如上列出了1個gpio目錄、export、unexport文件。gpio目錄對應基地址,比如芯片的IO定義為GPIO0_0~GPIO0_31、GPIO1_0~GPIO1_31等等,那么GPIO0對應的base就是gpiochip0,GPIO1對應的base就是gpiochip32,以此類推。大家有興趣可以可以進入其中一個目錄看看,
$cd gpiochip0
$ls
base ? ? ? label ? ? ?ngpio ? ? ?power ? ? ?subsystem ?uevent
具體內容就不一一介紹了,如果有需要,我可以再寫個介紹。
(3)、控制實例
比如要實現控制 GPIOG_11(6*32+11=203) 口,先將其引腳進行導出,在/sys/class/gpio目錄下生成一個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 ? #設置為輸出
$ cat value ? ? ? ? ? #獲取值
0
$ echo 1 > value ? ? ? #設置為1,高電平
$ echo 0 > value ? ? ? #設置為0,低電平
這時可以實現相同的控制效果。
4 小結
本來想多體驗幾個example,發現手里缺乏很多必要配件,如ADC部分,官方需要PCF8591模數轉換器,而我手里也沒有。等下次手里有了更多配件再嘗試其他的例程。
下一期,我準備嘗試連接攝像頭模塊進行測試。敬請期待。
總結
以上是生活随笔為你收集整理的NanoPi NEO的Matrix库硬件编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SIM卡初始化
- 下一篇: 关于Zigbee的常识