NanoPi NEO2 Black の OLED HAT を Node.js で制御する

投稿者: | 2021年3月25日

Raspberry Piよりも小さくミニマルながらGbE搭載のシングルボードコンピュータ、 NanoPi NEO2 に専用 OLED HATがセットのモデルを購入し、I2C接続の液晶表示やボタンGPIO制御に Node.js を初めて触ってみました。

今でこそARM系マイコン基板はRaspberry Piばかり使っていますが、黎明期には、SheevaPlugに始まり、BeagleBoardPandaBoardに手を染めて、かなり痛い目に遭ってきました。そのような過去から、Raspberry Pi以外には手を出さない傾向にありましたが、今回その禁を破ることになります。

ハードウェアレビュー

Raspberry Pi 4はギガビットイーサ搭載していますが、お値段もそれなり。逆に現在構想中のプロジェクトにWiFiは不要なので、リーズナブルなNanoPi NEO2を採用した次第。結局、OLEDと金属ケースとのセットになった、NanoPi  NEO2 Blackを計RMB299+送料で購入(汎用OLEDは安いので、ケースどうでも良ければさらにお求め易いお値段になることでしょう)。

商品開封時はもう、基板はケースにOLED共々組まれた完成状態、さらにOS入りのmicroSDまで付属しているので、これ挿してLAN繋いで電源入れればもうそれで動くし、IPアドレスなんかもOLEDに表示されちゃいます。出来上がっています!

図1.NanoPi NEO2 Black 初回起動

図1.NanoPi NEO2 Black 初回起動

ひとまず電源を落とし、金属ケースを開けて気になる中身を確認。付属の六角レンチでケースを開け、NanoPi NEO2 Black基板の上に乗っかったOLED HATを外します。アルミケースはヒートシンクも兼ねていて、3連プッシュボタンはそのトップも金属製です。公式サイトを見ると付属されるmicro SDはSandisk製ですが、今回同梱されていたのは東芝製でした。

図2.NanoPi NEO2 Black 全景

図2.NanoPi NEO2 Black 全景

NanoPi NEO2 BlackはNanoPi NEO2の単純なRAM増強版程度にしか認識していませんでしたが、基板からデザインし直しているのだそうです。CPUは裏面に実装され、熱伝導シートを介してケース底面に接する仕様になっています。実際、アイドリング運転時も底面がほんのり熱を持つ感じです。

図3.NanoPi NEO2 Black 本体基板

図3.NanoPi NEO2 Black 本体基板

OLED HATは0.96インチ、解像度128×64ピクセルの液晶に加え、本体からのオーディオ出力ジャックとUSBポートも側面に備えています。

図4.NanoPi NEO2 Black OLED HAT

図4.NanoPi NEO2 Black OLED HAT

謹製スクリプトを無効化

まず付属SDカードに入っているOSの基本情報を確認してみます。

このOLED HATが予め有効化されたOSイメージは、公式wikiページの「4 Run pre-enabled NanoHat-OLED ROM」項のリンクよりダウンロードすることが可能で、今回使っているXenialベースのROM以外に、OpenWRTベースのROMも用意されていました。

図5.OLED HAT Enabed ROM for NanoPi NEO2

図5.OLED HAT Enabed ROM for NanoPi NEO2

購入当時はこのプレインストールされている仕組みをカスタマイズしようと思ったのですが、これが複雑な構成でディスプレイの表示を含め商品として完成されていて、カスタマイズには不向きな印象を受けました。自動起動スクリプトからその動作を追ってみると、

下端にある「oled-start」は何をしているのかと言うと、

この「NanoHatOLED」と言うバイナリのソースはGitHubに公開されていて、プログラムは常駐してGPIOボタンを監視し、その状態を別のPythonスクリプトのプロセスに渡していることが読み取れます。

渡し先であるPythonスクリプト「bakebit_nanohat_oled.py」は、Bakebit Starter Kitのライブラリの一部で、これもGitHubで公開されています。

こうして、複数の言語に跨って成立しているシステムであることは分かったので、これをカスタマイズすることは諦め、rc.localが起動しないようにコメントアウトしました。尚、とにかく数が少ないカスタマイズ例の中、本項ではこちらの記事がとても参考になりました(感謝)。


Node.jsインストール

あまりにも複雑で難易度の高い、謹製スクリプトによるOLED制御システムに代わる手法として、良さそうだったのがNode.jsでした。実際にmpd機器のディスプレイとして高い完成度に仕上げている方の例を見つけ、Web開発で自分にとっても馴染み深い、JavaScriptの実行環境であるNode.jsを初めて触ってみることにします。

インストールの手順は、Raspberry Piの例ですが、こちらの記事を参考にさせて頂きました。


curlが入っていないのでaptよりインストールします。

curlを使い、公式サイトよりレポジトリをセットアップする為のスクリプトを取得し、そのまま管理者権限で実行します。尚、Node.js ver.14系をインストールすることにしました。

レポジトリの準備が整ったので、aptでNode.jsをインストールします。

ここからいくつか、基本的な命題についてNode.jsでの実現方法を考えてみます。

 

Node.js: IPアドレスを取得

標準のosモジュールに用意されているos.networkInterfaces()メソッドを使うと、ネットワークインターフェイスに関する情報を得ることが出来ます。

ここからLANのIPアドレスを得るには、eth0の中の0番目(IPv4)にあるaddress項の値を指定すれば良いことになります。

 

Node.js: 任意のシェルコマンドを実行

任意のシェルコマンドを実行したいという場面は多いはずです。これには標準モジュールの一つであるchild_processモジュールのexecメソッド、execSyncメソッドが用意されていて、前者は非同期、後者は同期動作します。

execSyncの戻り値はバッファなので、結果の戻り値が必要な場合は、toString()で処理する必要があります。

 

Node.js: GPIOボタン状態監視

ここからNode.jsっぽい命題です。NanoPi NEO2 Black OLED HATには、3つの物理ボタンが実装されていて、

とあるように各GPIOへ割り当てられています。これらのボタンの状態、押し下げイベントを取得するには、外部ライブラリのonoffを導入して使うのが便利です。外部ライブラリのインストールは、Node.jsのパッケージマネージャであるnpmを使えば良いのでとても簡単。

onoffライブラリではGPIOの入出力どちらもサポートされていますが、ボタン機能で必要なのは入力情報です。基本的な構成は以下の通りで、オブジェクトを作り、ウォッチします。そしてプログラム終了時にGPIOを開放する処理を最後に必ず記述するのは、どの言語でも一緒ですね。

ボタン3つある場合はどうするのか、単純に3つ並べてみます。

これで難なく動いてしまいました。

GPIOを扱うので、root権限で実行する必要があります。

 

Node.js: OLEDの制御

簡単な命題で肩慣らしも済んだので、ようやく今回の本題に取り掛かりましょう。今回のOLED HATのように、I2C接続されたSSD1306互換液晶の操作には、oled-i2c-bus外部ライブラリを活用します。導入はnpmで簡単なのですが、執筆中にnpm自身のメジャーアップデートがあったようで、その通知が出てしまいました。併せてアップデートします。

続いてOLED HATのI2C接続情報を確認します。OLED HATはI2Cバス番号0にアドレス0x3cで見付けることが出来ました。

oled-i2c-busライブラリをインストールすると、そのサブディレクトリ内に簡単なサンプルプログラムがあるので、それらを触りながら使い方を習得することが出来ます。

文字を表示させるには、フォントライブラリのインストールが必要です。インストールしたライブラリが増えてきましたが、「npm ls」でツリー状に一覧表示させて確認することが出来ます。

基本的には次のような流れでコーディングすれば良さそうです。終了処理をシビアにコントロールしなくても良さそう(!?)。

図6.Node.js oled-i2c-bus表示テスト

図6.Node.js oled-i2c-bus表示テスト

最後に集大成として、IPアドレスを取得しOLED HATに表示させたり、ボタン押すとシャットダウンするプログラムを組んでみました。IPアドレスを定期的に取得してOLEDへ出力するのですが、ディスプレイの一部分を消去する類の操作が見当たらなかったので、一行分を空白上書きしてから、新しい文字列を上書きするようにしています。

図7.Node.js IPアドレス表示

図7.Node.js IPアドレス表示

尚、Node.jsらしいasync functionを活かした実際のアプリの組み方は、こちらの記事を参考にさせて頂きました(Great Tnx!!)。

次回は本プロジェクトの最終目標である、NanoPi NEO2 Black + OLED HATとNode.jsを使ったインターネットスピードテスタの実現へ向け、Node.jsプログラムの自動起動を実装したいと思います。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA