技術コラム Vol.1

組込みシステムでJavaScriptを動かそう!

公開日:2022/02/18

JavaScriptは、Webシステムでは広く普及しているインタープリター型のスクリプト言語です。

主にクライアント側のブラウザの実行環境で動作しますが、ハードウェアに依存しないため、実行環境さえあれば、組込みシステムのマイコン上でも動作させることができます。

今回ご紹介するNode.jsは、主にWebシステムのサーバーサイドで利用されるJavaScript実行環境の1つですが、マイコンに組込むことで、JavaScriptで組込みシステムを制御することもできます。

今回は、

  1. Node.jsの概要
  2. 組込みシステムでのJavaScriptのメリット
  3. JavaScriptNode.jsのインストールからLチカまで

をご紹介いたします。

1. Node.jsの概要

組込み系の開発をしているエンジニアにはNode.jsはあまり馴染みがないと思われるかもしれませんが、実はプログラムの開発環境などにおいてもNode.jsは使われています。

Node.jsは、Chromeブラウザと同じ、Googleが開発したオープンソースのV8 JavaScriptエンジンを使用しており、ウェブブラウザ以外でJavaScriptを動作させることができる実行環境です。

Node.jsでは、ウェブブラウザ上で動作するJavaScriptと異なり、デバイスの入出力(ioctl)を制御することができ、ネットワーク処理からハードウェア制御まで、幅広いアプリケーションに対応することができます。

また、JavaScriptだけでなく、WebAssemblyにも対応しており、高速処理が可能です。

2. 組込みシステムでのJavaScriptのメリット

組込みシステムにおいてJavaScriptを利用するメリットとしては以下が考えられます。

(1)従来の組込みプログラムの代替言語として

C言語やアセンブリ言語の代替言語として使用することで、ハードウェアの専門知識がないエンジニアでもプログラミングを可能とする。

(2)IoTなどのサーバー/クライアント

HTTPサーバー、MQTTブローカー/パブリッシャーをはじめとする各種モジュールを使用した高度なネットワーク処理を実現する。

(3)GUIアプリケーション

ウェブブラウザと組わせて使用することにより、リッチなGUIを実現する。

なお、JavaScriptは、インタープリター方式で実行されるため、リアルタイム制御には対応していません。
そのため、モーター制御など厳密なリアルタイム性が求められるアプリケーションには不向きです。

3. JavaScriptNode.jsのインストールからLチカまで

それでは、Node.jsのインストールからLチカ(LED点滅)の動作までを説明します。

組込みシステムでNode.jsを利用する場合、Linux上で動作させます。
今回は、RZ/G2Eシステムオンモジュール「αSMARC-RZ/G2E」を使用します。

以下のイメージ図のようにNode.jsを利用して、LED(ハードウェア)制御を行うサンプルプログラムを実際にαSMARC-RZ/G2Eにて動かしてみます。

「αSMARC-RZ/G2E」+「αSMARC-EVB1」

αSMARC-RZ/G2E取り付け

ハードウェア制御イメージ

JavaScriptプログラム~ハードウェア

(1)Node.jsのインストール

αSMARC-RZ/G2Eでは、パッケージのビルド負担を大幅に軽減するため、ビルド済みパッケージを弊社サーバーにて用意しております。開発段階において各種パッケージを簡単に追加インストールすることができます。

以下のコマンドにより、弊社サーバーのNode.jsをインストールします。

# dnf install -y nodejs

Node.jsのインストールは、以下のコマンドにて確認できます。
バージョンが表示されれば正常にインストールされています。

# node --version

(2)サンプルスクリプトの実行

インストールしたNode.jsを使用して、以下のコマンドにてハードウェア(LED)制御するサンプルスクリプトを動かします。
1秒ごとにLD1が点滅し、2秒ごとにLD2が点滅します。

# node nodejs-led.js

nodejs-led.jsの内容


// aSMARC-RZ/G2E
//   nodejs-led.js
//

// ファイルシステムモジュールのリクエスト
var fs = require( 'fs' );

// LED消灯(初期化)
fs.writeFileSync( '/sys/class/leds/evb1_ld1/brightness', '0' );
fs.writeFileSync( '/sys/class/leds/evb1_ld2/brightness', '0' );

// 1000 ミリ秒ごとに実行する処理
var n = 0
setInterval(
 () => {
    // LEDの点灯/消灯
    fs.writeFileSync( '/sys/class/leds/evb1_ld1/brightness',
                        String.fromCharCode(48 + n % 2) );
    fs.writeFileSync( '/sys/class/leds/evb1_ld2/brightness',
                        String.fromCharCode(48 + (n >> 1) % 2) );
    n++;
    },
    1000
);

// 終了処理
process.on("exit", () => {
    fs.writeFileSync( '/sys/class/leds/evb1_ld1/brightness', '0' );
    fs.writeFileSync( '/sys/class/leds/evb1_ld2/brightness', '0' );
});

// シグナル処理(Ctrl+C)
process.on("SIGINT",() => {
    process.exit(0);
});

製品のご案内

本コラムのより詳細な内容については、下記の製品のアプリケーションノートとして、公開しております。
アプリケーションノートでは開発にお役立ていただける技術情報を多数公開しておりますので、興味のある方はぜひ製品をご利用ください。

  • ※ArmおよびCortexは、米国および/またはその他の地域におけるArm Limited(またはその子会社)の登録商標です。
  • ※記載されている会社名、製品名は、各社の登録商標または商標です。
  • ※記載の内容は改良のため、予告なく変更する場合がございます。