
NanoPi NEO って?
ちょっと今更感はある。(2025年11月)
性能的にはAIの推論もほぼほぼできないし、WiFi も Bluetooth もない。
だが、そこがいい。
小さいのにGPIO豊富だし、UARTも複数持ってるので。
そして、Arduinoのようなマイコンではなく、Linuxが動く。
Ubuntu にしようかと思ったけど、Armbian を試してみる
下記サイトから Armbian をダウンロードする。

で、ダウンロードしたイメージを SD カードに書き込むのにラズパイ用の書き込みツールを使ってる人が多いみたいだけど、これは単なるイメージファイルなので Rufus でも問題なく SD カードに書き込める。
Friendly Elec 公式の OS イメージもいくつかあるけど、最新に近いバージョンだと、RPi.GPIO_NP がコンパイルできないのでそこは要注意。
ソースを修正すればいいんだろうけど…面倒なので OPi.GPIO を使って PINマッピングを変える、という手段が楽でいい。
(OPi.GPIO を普通にインストールして、設定ファイルに少し書き足すだけでいいから)
起動:MACアドレスがローカル管理=02で始まるよ
OS イメージを書き込んだ SDカード差し込んで、microUSB つなげば起動する。
普通にSSHでつながる。(なんでみんなシリアルで繋げてんだろう…という疑問は少しあるw)
デフォルトのユーザー名とパスワードは… ID:root PW:1234
NanoPi NEO は HDMI 等がないので、デバッグ用のシリアルコンソールに接続するか、SSH するかなんだけど…
SSH で繋げる際に少し「ん?」となった。
MAC アドレスがローカル管理MACになってるから…w
別にいいんだけど、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だからね。
ただ、NanoPi NEO はメモリも少ないし CPU もそれほど早いものではないので、時間がかかる…
気長にコーヒーでも飲みながら待ちましょう。
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
OPi.GPIO を使う
以下は全て Python の仮想環境下での作業。(仮想環境下でなくてもできるけど、仮想環境の良さを実感すると、やっぱり仮想環境下でやりたくなる)
GPIO を使うにはラズパイなら RPi.GPIO なところ、NanoPi NEO は OPi.GPIO を使うと楽。
(venv) venv$ ./bin/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 が使われてしまうので、明示するようにした。
I2Cを使えるようにする
$ sudo armbian-config
System

Kernel

DT001 – Manage device tree overlays

i2c0 を有効化して Save

この後、Backで戻ると再起動を促されるので、それに従って再起動。
そうそう、I2Cでいろいろアレするツールが入ってないのでインストール。再起動後で良い。
$ sudo apt install i2c-tools
で、OLEDか何かを適当に繋げている状態で…
$ sudo i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
といった感じで接続しているデバイスのアドレスが見えればOK
このデバイスが SSD1306 をコントローラーに持ったOLEDだったとするなら、次のように luma をインストールするといろいろとディスプレイ表示の制御が楽になる。
(venv) venv$ sudo apt install python3-wheel build-essential libjpeg-dev zlib1g-dev
(venv) venv$ ./bin/python -m pip install --upgrade luma.oled
(venv) venv$ sudo apt install fonts-noto-cjk
このくらいで OLED の表示には問題ないはず。
コードは以下の通り。
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
import time
serial = i2c(port=0, address=0x3C)
device = ssd1306(serial, width=128, height=32)
with canvas(device) as draw:
draw.rectangle(device.bounding_box, outline="white", fill="black")
draw.text((10, 20), "Hello World", fill="white")
time.sleep(10)
ここまでで一通りの初期設定から GPIO が使えるようになるまでが完了!
蛇足
困ったときのWiKi
2025年11月現在、どこかで「EOLだよ」みたいな話を聞いた?見た?んだけど、そんなことない?
NEO が EOL なら、次は NEO3 にしようかと思うんじゃが…
価格が公式サイトの低下で1.5倍、Amazon 等での売価では NEO の3倍するのが気になるがw
NEO3 だと CPU が Rockchip RK3328 (Cortex-A53)だし、メモリも 1 or 2 GB なので、圧倒的に快適にはなると思う。(用途的に性能を求めてないので NEO で十分ではあるんだけど…)
サイズも NEO の40 x 40 が NEO3 で48 x 48 と、8mmだけ大きくなるけど許容範囲だし。

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