NanoPi-M1を使ってみる

NanoPi専用WiringNPライブラリ


NPiのGPIOのマッピングはこちらに ありますが、RPiともOPiとも微妙に違っています。
WiringPiライブラリも NPi専用のものをインストールする必要が有ります。
現在、以下の2つのライブラリがあることを確認しています。

https://github.com/friendlyarm/WiringNP

https://github.com/wertyzp/WiringNP

以前は、どちらのライブラリにも同じバグが有り、Pin#13 35 36のIOが正しく動きませんでしたが、
wertyzpのリポジトリは不具合が修正されています。

friendlyarmのライブラリは最近、更新されましたが、まだ2つの問題が残っています。

その1
最新版ではボードの自動判定ロジックが追加されましたが、Armbianではこの部分が動きません。
wiringPiの初期化で以下のエラーとなります。
$ sudo ./test1 8 5
[  629.600274] get board_vendor used failed!
piBoardRev: Unable to determine board revision from /proc/cpuinfo
 -> Is not NanoPi based board.
 ->  You may want to check:
 ->  http://www.lemaker.org/

これは$HOME/WiringNP/wiringPi/boardtype_friendlyelec.cを以下のように変更することで(とり あえず)動くようになります。
       //allwinner h3
        // kernel 3.x
//      {"sun8i", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
        {"sun8i", 0, NanoPi_M1, "NanoPi-M1", "-1(-1)"},
        {"sun8i", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"},
        {"sun8i", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"},
        {"sun8i", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"},
    {"sun8i", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"},
    {"sun8i", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"},

ただ、この直し方でいいのかどうかは微妙です。
というのも、このボードの自動判定ロジックは「/sys/class/sunxi_info/sys_info」の 「sunxi_board_id」を判定して
ボードを決めていますが、Armbianはどのボードも必ず-1(-1)が設定されています。

orangepi@orangepizero:~$ cat /sys/class/sunxi_info/sys_info
sunxi_platform    : Sun8iw7p1
sunxi_secure      : normal
sunxi_chipid      : 2c21020e786746240000540000000000
sunxi_chiptype    : 00000042
sunxi_batchno     : 1
sunxi_board_id    : -1(-1)

orangepi@orangepipc:~$ cat /sys/class/sunxi_info/sys_info
sunxi_platform    : Sun8iw7p1
sunxi_secure      : normal
sunxi_chipid      : 4c22058e503542040000740000000000
sunxi_chiptype    : 00000081
sunxi_batchno     : 1
sunxi_board_id    : -1(-1)

nanopi@nanopim1:~$ cat /sys/class/sunxi_info/sys_info
sunxi_platform    : Sun8iw7p1
sunxi_secure      : normal
sunxi_chipid      : 043301ce5035480c0000340000000000
sunxi_chiptype    : 00000081
sunxi_batchno     : 1
sunxi_board_id    : -1(-1)

つまり、直し方としては以下でも動きますが、gpio readallした時の見出しのボードタイプが変わります。
        //allwinner h3
        // kernel 3.x
//      {"sun8i", 0, NanoPi_M1, "NanoPi-M1", "0(0)"},
//      {"sun8i", 0, NanoPi_M1, "NanoPi-M1", "-1(-1)"},
//      {"sun8i", 0, NanoPi_NEO, "NanoPi-NEO", "1(0)"},
        {"sun8i", 0, NanoPi_NEO, "NanoPi-NEO", "-1(-1)"},
        {"sun8i", 0, NanoPi_NEO_Air, "NanoPi-NEO-Air", "2(0)"},
        {"sun8i", 0, NanoPi_M1_Plus, "NanoPi-M1-Plus", "3(0)"},
    {"sun8i", 0, NanoPi_Duo, "NanoPi-Duo", "4(0)"},
    {"sun8i", 0, NanoPi_NEO_Core, "NanoPi-NEO-Core", "5(0)"},



以前はArmbianもボードの自動判定ロジックを内蔵していて、1つのイメージで複数のボードをサポートしていた時期が有りましたが
自動判定がうまく行かないのでボードごとのイメージに分割になりました。
ボードの自動判定は危険です。

その2
Pin#35 36のIOが正しく動きません。
これは$HOME/WiringNP/wiringPi/wiringPi.cを以下のように変更することで動くようになります。
static int pinToGpio_m1 [64] ={
    0, 6, // 0, 1
    2, 3, // 2, 3
    200, 201, // 4  5
    1, 203, // 6, 7
    12, 11, // 8, 9
    67, 17, //10,11
    64, 65, //12,13
    66, 198, //14,15
    199, -1, //16,17
    -1, -1, //18,19
    -1, 20, //20,21
    21, 8, //22,23
//    13, 9, //24,25 /nopnop2002
    16, 9, //24,25
//    7, 16, //26,27 /nopnop2002
    7, 13, //26,27
    15, 14, //28,29
    19, 18, //30,31

Pin#18に接続したLEDをLチカする場合はこのようになります。
デバイスファイルを使ってGPIOを制御するとき、NPiはRPiともOPiとも互換性がありません。

RaspberryPiの場合

$ sudo sh -c "echo 24 > /sys/class/gpio/export"
$ sudo sh -c "echo out > /sys/class/gpio/gpio24/direction"
$ sudo sh -c "echo 1 > /sys/class/gpio/gpio24/value"
$ sudo sh -c "echo 0 > /sys/class/gpio/gpio24/value"
$ sudo sh -c "echo 24 > /sys/class/gpio/unexport"

$ gpio -g mode 24 out
$ gpio -g write 24 on
$ gpio -g write 24 off

$ gpio mode 5 out
$ gpio write 5 on
$ gpio write 5 off

$ gpio -1 mode 18 out
$ gpio -1 write 18 on
$ gpio -1 write 18 off

OrangePiの場合

$ sudo sh -c "echo 71 >/sys/class/gpio/export"
$ sudo sh -c "echo out >/sys/class/gpio/gpio71/direction"
$ sudo sh -c "echo 1 > /sys/class/gpio/gpio71/value"
$ sudo sh -c "echo 0 > /sys/class/gpio/gpio71/value"
$ sudo sh -c "echo 71 > /sys/class/gpio/unexport"

$ gpio -g mode 24 out
$ gpio -g write 24 on
$ gpio -g write 24 off

$ gpio mode 5 out
$ gpio write 5 on
$ gpio write 5 off

$ gpio -1 mode 18 out
$ gpio -1 write 18 on
$ gpio -1 write 18 off

NanoPiの場合

$ sudo sh -c "echo 201 >/sys/class/gpio/export"
$ sudo sh -c "echo out >/sys/class/gpio/gpio201/direction"
$ sudo sh -c "echo 1 > /sys/class/gpio/gpio201/value"
$ sudo sh -c "echo 0 > /sys/class/gpio/gpio201/value"
$ sudo sh -c "echo 201 > /sys/class/gpio/unexport"

$ gpio -g mode 24 out
$ gpio -g write 24 on
$ gpio -g write 24 off

$ gpio mode 5 out
$ gpio write 5 on
$ gpio write 5 off

$ gpio -1 mode 18 out
$ gpio -1 write 18 on
$ gpio -1 write 18 off

gpio readall は以下のように表示されます


上の表示をよく見てみると、「NanoPI M1 Debug UART(オンボードのUARTポート)」が下の方に表示されていて、
BCM番号、wPi番号がアサインされています。
このライブラリの特徴は、オンボードUARTポートもプログラムから制御することができます。
以下のコマンドでオンボードUARTポート(Tx/Rx)につないだLEDをLチカすることができます。
$ gpio mode 32 output
$ gpio write 32 on
$ gpio write 32 off

$ gpio -1 mode 43 output
$ gpio -1 write 43 on
$ gpio -1 write 43 off

$ gpio mode 33 output
$ gpio write 33 on
$ gpio write 33 off

$ gpio -1 mode 44 output
$ gpio -1 write 44 on
$ gpio -1 write 44 off


次回は、NanoPiで使えるGPIO Pythonライブラリを紹介します。