NanoPi-NEOを使ってみる

WiringNPライブラリ


NanoPi用に公開されているWiringNPライブラリには、以下の2つのライブラリがあることを確認しています。

@ https://github.com/friendlyarm/WiringNP
A https://github.com/wertyzp/WiringNP

@のライブラリは様々なNanoPiボードをサポートしていますが、実行時にボードの自動判定を行います。
Armbianではボードの自動判定に失敗します。


ボードの自動判定は「/sys/class/sunxi_info/sys_info」の内容を参照して行います。
Armbianにはこのファイルが無いので自動判定できません。
$ cat /sys/class/sunxi_info/sys_info
cat: /sys/class/sunxi_info/sys_info: No such file or directory

friendlyELECには以下の内容になっていて、board_nameでボード名を判定しています。
friendlyELECは、こちらから ダウンロードできます。
ボードを選ぶとBaidu NetdiskかOneDriveからダウンロード元を選びますが、OneDriveからダウンロードするためにはMicrosoftアカウントが必要に なります。
このあたり、改善してほしい所です。
$ cat /sys/class/sunxi_info/sys_info
sunxi_platform    : sun8iw7p1
sunxi_secure      : normal
sunxi_chipid      : unsupported
sunxi_chiptype    : unsupported
sunxi_batchno     : unsupported
sunxi_board_id    : 1(0)
board_manufacturer: FriendlyElec
board_name        : FriendlyElec NanoPi-NEO

friendlyELECではきちんとボードの自動判定が動き、USB/AudioポートのGPIOA17も使えます。


Armbianは様々なメーカーのボードをサポートしています。
昔のArmbianはボードの自動判定を行っていた時期が有りますが、正しく動かないので自動判定をやめました。
Armbianでも「/sys/class/sunxi_info/sys_info」を上記の内容で作ってやれば、このライブラリが動きます。



AのライブラリはもともとNanoPi-M1用のライブラリです。
インストールは以下の手順です。
$ git clone https://github.com/wertyzp/WiringNP
$ cd WiringNP/
$ sudo ./build

NanoPi-NEOのGPIOのマッピングはこちらに ありますが、NanoPi-M1のサブセットとなっていますので
NanoPi-NEOでも、このライブラリを使うことができます。
ボードの自動判定機能がないのでArmbianでも動きます。
readallコマンドでは、NanoPi-M1と表示されますが、問題なく使えます。


こちらでOrangePi-PCのピン番号を紹 介していますが、NanoPi-NEOもOrangePi-PCと同様に4つのピン番号が有ります。
@WiringNPライブラリのwiringPiSetupPhys()で物理的なピン番号を使う場合
AWiringNPライブラリのwiringPiSetup()でwPi番号を使う場合
BWiringNPライブラリのwiringPiSetupGpio()でGPIO番号を使う場合
C/sys/class/gpioのデバイスファイルを使って操作するときの番号

WiringNP付属のgpioコマンドで操作するときの番号は@ABの何れかの番号になります。
 gpio -1 mode/write pin# (このときの番号は@の番号)
 gpio mode/write pin# (このときの番号はAの番号)
 gpio -g mode/write  pin# (このときの番号はBの番号)

Aの番号 Bの番号 Cの番号 @の番号 Aの番号 Bの番号 Cの番号



1 2


8 2 12 3 4


9 3 11 5 6


7 4 203
7 8 15 14 198



9 10 16 15 199
0 17 0
11 12 1 18 6
2 27 2
13 14


3 22 3 15 16 4 23 200



17 18 5 24 201
12 10 64 19 20


13 9 65 21 22 6 25 1
14 11 66 23 24 10 8 67



OrangePi用のライブラリではできませんが、このライブラリではデバッグポートもGPIOとして使えます。
以下のコードでデバッグポートのTx(#32)/Rx(#33)に接続したLEDがLチカします。
#include <stdio.h>
#include <signal.h>
#include <wiringPi.h>

int running = 1;

void sigcatch(int sig) {
  printf("catch signal %dn", sig);
  running = 0;
}

int main (int argc, char **argv) {
  int pin1 = 32; // OnBoard TX
  int pin2 = 33; // OnBoard RX

  if (wiringPiSetup() == -1) {
    printf("wiringPiSetup Fail\n");
    return 1;
  }

  signal(SIGINT, sigcatch);
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);

  while (running) {
    digitalWrite(pin1, 1);
    digitalWrite(pin2, 0);
    delay(1000);
    digitalWrite(pin1, 0);
    digitalWrite(pin2, 1);
    delay(1000);
  }

  digitalWrite(pin1, 0);
  digitalWrite(pin2, 0);
  return 0;
}



RaspberryPiでは以下のコードでPin#12に接続したSG90のサーボモータが動きます。
NanoPi-NEOではオンボードのRXポートでハードウェアPWMが使えますが、
Pin#だけを33に変え、SG90のシグナルラインをオンボードのRXポートに繋ぎましたが、SG90は動きませんでした。
#include <stdio.h>
#include <wiringPi.h>

int main()
{
  if (wiringPiSetup() == -1) {
    printf("wiringPiSetup Fail\n");
    return 1;
  }

  int pin = 1;
  pinMode(pin, PWM_OUTPUT);
  pwmSetMode(PWM_MODE_MS);
  pwmSetClock(400);
  pwmSetRange(1024);

  pwmWrite(pin, 75);
  int num;
  for(num=75;num<130;num++) {
    pwmWrite(pin, num);
    delay(50);
  }
  for(num=130;num>35;num--) {
    pwmWrite(pin, num);
    delay(50);
  }
  pwmWrite(pin, 75);

  return 0;
}



以下のコマンドでオンボードのLEDをLチカすることができます。
両方のオンボードLEDをheartbeatモードに変更すると、交互にLチカすることが分かります。
$ echo "緑のLEDを通常モードに変更"
$ sudo sh -c "echo none > /sys/class/leds/nanopi:green:pwr/trigger"
$ echo "緑のLEDを点灯"
$ sudo sh -c "echo 1 > /sys/class/leds/nanopi:green:pwr/brightness"
$ echo "緑のLEDを消灯"
$ sudo sh -c "echo 0 > /sys/class/leds/nanopi:green:pwr/brightness"
$ echo "緑のLEDをheartbeatモードに変更"
$ sudo sh -c "echo heartbeat > /sys/class/leds/nanopi:green:pwr/trigger"
$ echo "緑のLEDのheartbeatモードを終了
$ sudo sh -c "echo none > /sys/class/leds/nanopi:green:pwr/trigger"

$ echo "青のLEDを通常モードに変更"
$ sudo sh -c "echo none > /sys/class/leds/nanopi:blue:status/trigger"
$ echo "青のLEDを点灯"
$ sudo sh -c "echo 1 > /sys/class/leds/nanopi:blue:status/brightness"
$ echo "青のLEDを消灯"
$ sudo sh -c "echo 0 > /sys/class/leds/nanopi:blue:statusd/brightness"
$ echo "青のLEDをheartbeatモードに変更"
$ sudo sh -c "echo heartbeat > /sys/class/leds/nanopi:blue:status/trigger"
$ echo "青のLEDのheartbeatモードを終了
$ sudo sh -c "echo none > /sys/class/leds/nanopi:blue:status/trigger"



全体としてOPi-ZEROからオンボードWiFiを取り除いた感じのボードです。
後発のOPi-ZEROがこのボードを意識して開発されたのかもしれません。
オンボードWiFiが無いので技適のことを考えずに使うことができます。
こちらにパフォーマンスを公開していますが、H2+の OPi-ZEROよりも少しだけパフォーマンスがいいです。