NanoPi NEO の GPIO を使う

NanoPi NEO って?

ちょっと今更感はある。(2025年11月)
性能的にはAIの推論もほぼほぼできないし、WiFi も Bluetooth もない。
だが、そこがいい。
小さいのにGPIO豊富だし、UARTも複数持ってるので。

そして、Arduinoのようなマイコンではなく、Linuxが動く。

Ubuntu にしようかと思ったけど、Armbian を試してみる

下記サイトから Armbian をダウンロードする。

Nanopi Neo and Core

で、ダウンロードしたイメージを SD カードに書き込むのにラズパイ用の書き込みツールを使ってる人が多いみたいだけど、これは単なるイメージファイルなので Rufus でも問題なく SD カードに書き込める。

Friendly Elec 公式の OS イメージもいくつかあるけど、最新に近いバージョンだと、RPi.GPIO_NP がコンパイルできないのでそこは要注意。
ソースを修正すればいいんだろうけど…面倒なので OPi.GPIO を使って PINマッピングを変える、という手段が楽でいい。

起動:MACアドレスがローカル管理=02で始まるよ

SDカード差し込んで、microUSBつなげば起動する。
普通にSSHでつながる。(なんでみんなシリアルで繋げてんだろう…という疑問は少しあるw)
デフォルトのユーザー名とパスワードは… ID:root PW:1234

NanoPi NEO は HDMI 等がないので、デバッグ用のシリアルコンソールに接続するか、SSHするかなんだけど…
MACアドレスがローカル管理MACになってる…

別にいいんだけど、OUIがベンダIDになってないのでなんか変。
軽く調べると Allwinner H3 SoC が持ってる Ethernet Controller だからFriendly Elec になってないらしい。
が、それでも、Allwinner が持つIDになっててもよさそうなもんだけど…なんでローカル管理MACのままなんだろう…(まぁ、それほど重要なポイントでもないけど…)

ということで、Netenum等のツールで02から始まるMACアドレスを探せば、IPアドレスもわかる。
※あ、もちろんDHCPサーバが存在するネットワークにつなげてた場合ね。

microUSB側がOTGでシリアルコンソールにもなるようなので、ネットワークにつなげなくてもOKらしいが、ちょっと試してない。

初期設定

まずは root のパスワード変更

デフォルトで ID:root 、PW:1234 になってる。
SSH で繋げても デバッグ用のシリアルで繋げても、最初に root のパスワードを決めよと指示される。

Create root password:
Repeat root password:

変更を促される仕様はいいね。

ユーザーの作成 & sudo権限付与 など

この辺も対話型で自動的に設定できる。

Please provide a username (eg. your first name): [USER_NAME]
Create user ([USER_NAME]) password: ************
Repeat user ([USER_NAME]) password: ************
 
Please provide your real name: [USER_NAME]
 
Dear [USER_NAME], your account [USER_NAME] has been created and is sudo enabled.
Please use this account for your daily work from now on.
 
Detected timezone: Asia/Tokyo
 
Set user language based on your location? [Y/n]

ここでなぜか sshd の再起動に失敗したっぽくてどうしようもなくなった。
UART に接続してコンソール叩けばいいんだけど、面倒なので、電源ぶっちぎりの再起動。
まぁ、問題なく再起動してくれたw

そして、あとは armbian-config で必要な部分の設定を詰めていけばOK

viのインストール

最近はみんな nano?
確かに使いやすそうではあるんだけど…viに慣れちゃってるから…

$ sudo apt install vim

として、viも入れておく。

IP アドレスの固定

さてさて、armbian-config で設定ができるとはいえ、やはり慣れているのはこっちか。
一応メモっとく。

$ cd /etc/netplan/
$ sudo vi 01-localConf.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.x.x/24]
      routes:
      - to: default
        via: 192.168.x.x
      nameservers:
        addresses: [192.168.x.x, 8.8.8.8]
$ sudo chmod 600 /etc/netplan/01-localConf.yaml

chmod 600 にしないと WARNING が出る…
こんなに厳しかったっけ?644じゃダメだっけ?と思いつつも、600でいいなら600にしといた方が安全よね。

時刻合わせ

おそらく Asia/Tokyo になってるはずだけど、念のため確認。

$ sudo timedatectl status
               Local time: Sun 2025-11-09 13:01:05 UTC
           Universal time: Sun 2025-11-09 13:01:05 UTC
                 RTC time: Sun 2025-11-09 13:01:03
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: n/a
          RTC in local TZ: no

もし、こんな感じでUTCになっていたら、

$ sudo timedatectl set-timezone Asia/Tokyo

として合わせる。

ここまで終わったら下記のようにしてリポジトリ情報の更新とパッケージの更新を実行

$ sudo apt update
$ sudo apt upgrade

とまぁ、やってることは RaspberryPi 系と同じですな。
Linuxだからね。

Python環境の構築

基本的なものは入ってる。3.13.5 になっていた。

が、仮想環境を作るためには足りないので以下を実行。
ついでに pip や git も入ってないので入れておく。

$ python3 --version
Python 3.13.5
$ sudo apt install python3.13-venv  ← Pythonのバージョンに合わせる
$ sudo apt install python3-pip
$ sudo apt install git

あとは仮想環境作って Python ガリガリ書いていけばよし。

$ python3 -m venv venvDirName
$ cd venvDirName
$ source bin/activate

Python の仮想環境下での操作

GPIO を使うには ラズパイなら RPi.GPIO なところ、NanoPi NEO は OPi.GPIO を使うと楽。

(venv) venv$ pip install OPi.GPIO

ただ、当然ながら GPIO の PINマッピングはラズパイと NanoPi NEO では全く異なるので…

(venv) venv$ vi lib/python3.13/site-packages/OPi/pin_mappings.py

として PINマッピングを修正する。
修正する箇所は CUSTOM の部分で、以下のようにする。(そもそも CUSTOM 部には何も書かれてない)

    # User defined, initialized as empty
    CUSTOM: {
        7:    203,   # GPIOG11
        8:    198,   # UART1_TX/GPIOG6
        10:   199,   # UART1_RX/GPIOG7
        11:   0,     # UART2_TX/GPIOA0
        12:   6,     # GPIOA6
        13:   2,     # UART2_RX/GPIOA2
        15:   3,     # UART2_CTS/GPIOA3
        16:   200,   # UART1_RTS/GPIOG8
        18:   201,   # UART1_CTS/GPIOG9
        19:   64,    # SPI0_MOSI/GPIOC1
        21:   65,    # SPI0_MISO/GPIOC1
        22:    1,    # UART2_RX/GPIOA1
        23:   66,    # SPI0_CLK/GPIOC2
        24:   67     # SPI0_CS/GPIOC3
    }

尚、GPIO へのアクセスには root 権限が必要なので、実行時には sudo する必要があるので注意。

(venv) venv$ sudo ./bin/python3 test.py

みたいな感じに。

./bin/python3 としているのは、仮想環境の python3 を使うようにするため。

普通は python3 test.py だけで仮想環境の python3 が使われるはずなんだけど、なぜかシステム側の python3 が使われてしまうので、明示するようにした。

この記事にコメントしてみる