NanpPiとNetBSDとピカピカと
https://i.gyazo.com/4fc0db51aa873a9395d317be96180510.png
はじめに
近年、ゲーミングパソコンなどを中心に、ピカピカ光るステキなパソコンが色々と出ています。
我らがマイコンでも、やっぱりピカピカしたいですよね?
NanoPiなら、それができます!!
では、実際にやってみましょう!!
NanoPi NEO2
https://wiki.friendlyelec.com/wiki/images/2/25/NanoPi-NEO2-layout.jpg
from FriendlyARM Wiki
NanoPi NEO2には、以下のような特徴があります。赤字は、特にオススメの機能です。
SoC: Allwinner’s 64-bit H5 quad-core (Cortex-A53)
GPU: Mail450
RAM: 512M DDR3
I/O: microSD, Ethernet 10/100/1000M, USB, Serial, GPIO, Audio
Size: 40 x 40mm, 13g
OS: UbuntuCore 16.04, Debian, NetBSD
NanoPi NEO2のピン配置は、以下の図のようになります。
たくさんのGPIOやシリアルなどがあることがわかります。
左側の24ピンのコネクタは、5V, 3.3V, GNDなどの配列がRaspberry Piの40ピンの上24ピンと同じになっています。
https://wiki.friendlyelec.com/wiki/images/2/27/NEO2_pinout-02.jpg
from FriendlyARM Wiki
OSとしては、公式が提供しているUbuntuCore以外にも、Armbianをはじめとして様々なOSで動作可能です。
普通はLinux系のOSで動かすことがほとんどだと思いますが、"Of course it runs NetBSD."の精神で知られているNetBSDでももちろん動きます。今回は、OSとして、NetBSDを使うことにします。 NetBSDでGPIOを使う
NetBSDでは、GPIOデバイスは以下のように認識されます。GPIO用のデバイスファイルは、/dev/gpio*です。
code:dmesg
$ grep gpio /var/run/dmesg.boot
sunxigpio0 at simplebus1: PIO
gpio0 at sunxigpio0: 94 pins
sunxigpio0: interrupting on GIC irq 43
sunxigpio1 at simplebus1: PIO
gpio1 at sunxigpio1: 12 pins
sunxigpio1: interrupting on GIC irq 77
gpioleds0 at simplebus0: nanopi:green:pwr nanopi:blue:status
NetBSDでGPIOを使うためには、初期設定を行う必要があります。
はじめに、/etc/rc.confにgpio=YESを追加します。
更に、以下のように/etc/gpio.confで、GPIOのモードを設定します(gpio.conf(5))。
この設定は、セキュリティー上の理由で、起動時にしか変更できないことに注意してください。
OPTION insecureを指定したカーネルを作成することで、この制限は無くなります。
code:/etc/gpio.conf
gpio0 0 set out PA0
gpio0 1 set out PA1
gpio0 2 set out PA2
gpio0 3 set out PA3
gpio0 6 set out PA6
gpio0 11 set out PA11
gpio0 12 set out PA12
gpio0 86 set out PG6
gpio0 87 set out PG7
gpio0 88 set out dat
gpio0 89 set out clk
# gpio0 88 set out PG8
# gpio0 89 set out PG9
# gpio0 0 set in b1
# gpio0 2 set in b2
# gpio0 3 set in b3
gpioleds0は。内蔵の緑LED(nanopi:green:pwr)と青色LED(nanopi:blue:status)になります。後述(Case 1)のように、システム関連変数を変更するsysctl(8)コマンドで、LEDの点灯/消灯を制御できます。
その他のGPIOに関しては、gpioctl(8)コマンドから利用することができます。
C言語のライブラリも用意されており、openとioctlを使って操作することができます(gpio(4))。
NetBSDで、Blinkt!を使う場合のシステム階層は、以下のようになります。
https://gyazo.com/f796568ced7bea775ae53c834299cdb8
Case 1:青色LEDによるロードアベレージの表示
では、はじめに、内蔵のLEDを使って、ロードアベレージを表示してみましょう。
sysctlでLEDの状態を書き込んであげることで、簡単に点滅することができます。
code:loadavg.sh
while true
do
INTERVAL=uptime|awk '{print $(NF-2)}'|sed -e 's/,//'|sed -e 's/^/e(-/' -e 's/$/)/'|bc -l
echo ${INTERVAL}
sysctl -qw hw.led.nanopi_blue_status=1
sleep ${INTERVAL}
sysctl -qw hw.led.nanopi_blue_status=0
sleep ${INTERVAL}
done
動作の様子は、以下の動画のようになります。NanoPi NEO2は画面の右下にあります。
https://youtu.be/C2xbhGp5R9c
Case 2:Knight2000に挑戦!!
GPIOにつながったLEDがたくさんある場合、最初に作るのはKnight2000のアレです。
今回接続したピンの配列は、以下のとおりです。
table:pin assign
Pin# Name gpio0 dev# LEDの場所
3 PA12 12 左から1番目
5 PA11 11 左から2番目
12 PA6 6 左から3番目
15 PA3 3 左から4番目
22 PA1 1 左から5番目
以下のようなシェルスクリプトで、5つの青色LEDが一定方向に点滅を繰り返します。
code:knight_rider.sh
PINS="12 11 6 3 1"
while true
do
for l in $PINS
do
sudo gpioctl gpio0 $l 1
done
for l in $PINS
do
sudo gpioctl gpio0 $l 0
done
done
動作の様子は、以下の動画のようになります。
https://youtu.be/YL3kHWc577A
フルカラー8連LED: Blinkt!
Blinkt!は、Raspberry Piの40ピンGPIOに刺してつかえる、8連のフルカラーLEDです。2つのGPIOだけを使って、8連のフルカラーLEDの操作が可能です。
https://gyazo.com/c2d0b9273f0977a33beba637edcd7370
Blinkt!:ラズベリーパイ40pin GPIO用8連フルカラーLED(APA102)
Blinkt!で使われる2つのGPIOは、DATA(16pin)とCLOCK(18pin)で、それぞれLEDに送るデータと、データを送るタイミングを指定するクロックになります。
クロック(青)の立ち下がりのデータ(オレンジ)の値を送ることになっています。
以下の順で1つのLEDあたり8bit x 4のデータを送信します。
blightness(有効5bit/8bit)
b
g
r
https://gyazo.com/ebb3b30d0bd5eedaa1cda52c04421fc0
Case 3:Blinkt!でピカピカ
ここには、gpioctlを使って書かれたGPIO.pyと、C言語で書かれたpythonモジュール版のGPIO.cがあります。
前者は毎回ユーザランドコマンドを実行するため、動作速度がとても遅くなります。
ということで、後者を使ってピカピカします。
NanoPi NEO2で使うGPIOポートは、任意の二つを選ぶことができます。
今回は、以下のようにピンを割り当てました。この割り当てを使うと、Blynkt!を24ピンGPIO端子に直挿しして動くようになります。
table:pin assign
Pin# Name gpio0 dev#
DAT 16 PG8 88
CLK 18 PG9 89
実際に動作させるためには、blinkt.pyの中でDATとCLKとしてGPIOポート番号をハードコーディングで指定しているため、このポート番号をBlinkt!を接続したポート番号に変更することが必要です。
今回の場合、具体的には以下のようなパッチを使います。このパッチでは、NanoPi NEO2のGPIOポートのPG8をDATに、PG9をCLKに割り当てています。
code:blinkt.py.diff
% diff -u library/blinkt.py{.org,}
--- library/blinkt.py.org 2021-09-04 19:02:16.000000000 +0900
+++ library/blinkt.py 2021-09-04 19:02:30.000000000 +0900
@@ -7,8 +7,8 @@
__version__ = '0.1.2'
-DAT = 23
-CLK = 24
+DAT = 88
+CLK = 89
NUM_PIXELS = 8
BRIGHTNESS = 7
動作の様子は、以下の動画のようになります。
https://youtu.be/c4HuA0kCc2I
さらに、複数のBlynkt!を他のGPIOポートに接続して、blinkt.pyを各GPIOポートに変更したものに変えることで、複数のBlynkt!を動かすこともできます。
おわりに
いかがでしたか?
これで、あなたのNanoPiが、
ナウでヤングなピカピカパソコン
として利用できるようになりました。
本当は、I2Cを使って、もっと色々なデバイスで遊びたかったのですが、残念ながら現在のNanoPi NEO2用のNetBSDはI2Cを認識しないため、GPIOで遊ぶだけになってしまいました。
また機会があれば、I2Cでピカピカしたいと思います。
参考文献
むとうの以前の発表など
Nano Pi公式
受賞
https://gyazo.com/ab412746069515fc60e2657b4f787d75