reTerminal 用の Electron
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
はじめに
このウィキでは、Electron を使用して独自のユーザーインターフェースを構築する方法を説明します。Electron は、HTML、CSS、JavaScript などの Web 技術を使用して、ネイティブデスクトップアプリケーション(Windows、Mac、Linux)を作成するためのオープンソースフレームワークです。つまり、ウェブサイトを構築できるなら、デスクトップアプリも構築できるということです!
以下のガイドに従うことで、LCD 上のボタンをクリックするだけで reTerminal の GPIO ピンを制御するアプリケーションを作成できるようになります。それでは始めましょう!
開発環境の準備
reTerminal 上での作業
まず、reTerminal に Node.js と npm をインストールします。npm は Node.js パッケージのパッケージマネージャです。
-
ステップ 1. こちらで説明されているように、オンボード LCD、外部ディスプレイ、または SSH を使用して reTerminal にアクセスします。
-
ステップ 2. パッケージをアップグレードします。
sudo apt update
sudo apt full-upgrade
- ステップ 3. Node.js をインストールするためのスクリプトをダウンロードします。
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
- ステップ 4. Node.js をインストールします。
sudo apt install -y nodejs
これで reTerminal に Node.js がインストールされました。インストールが成功したかどうかを確認するには、以下のコマンドを実行して Node.js と npm のバージョンを確認してください。
node -v
npm -v
ホスト PC 上での作業
次に、開発のために Microsoft Visual Studio Code をセットアップします。
- ステップ 1. Microsoft Visual Studio Code をダウンロードしてインストールします。
注意: お使いのオペレーティングシステムに適したインストーラーをダウンロードしてください。
- ステップ 2. 左側のナビゲーションメニューの 拡張機能 タブをクリックし、検索ボックスに remote development と入力します。
-
ステップ 3. Remote Development を選択し、インストール をクリックします。
-
ステップ 4. キーボードで F1 を押し、ssh と入力して Remote-SSH:Connect to Host... を選択します。
- ステップ 5. 以下を入力します。
注意: pi はユーザー名で、192.xxx.xx.xx は reTerminal の IP アドレスです。
- ステップ 6. ユーザーのパスワードを入力します。
これで、SSH を使用して reTerminal にログインし、開発環境の準備が完了しました。
スマートライト Electron アプリケーション
ここでは、reTerminal の LCD 上のボタンを押すことで GPIO を制御できる スマートライト Electron アプリケーション を構築します。その後、GPIO にリレーを接続して家電製品を制御することも可能です!
ハードウェア接続
テスト目的で、reTerminal の GPIO 24 に LED を接続します。後でリレーを追加し、GPIO を使用して家電製品を制御することができます!
注意: GPIO ピンと LED の間に抵抗を挟む必要があります。そうしないと LED が焼損する可能性があります。
アプリケーションの作成と初期化
-
ステップ 1. ホスト PC 上で VSCode を開き、以前説明した方法で SSH を使用して reTerminal にログインします。
-
ステップ 2.
File > Open Folder...
に移動し、reTerminal 上の任意のフォルダを選択します。
- ステップ 3. 新しいフォルダを作成し、名前を付けます。
- ステップ 4.
Terminal > New Terminal
に移動し、新しく作成したフォルダに移動します。
注意: ここでは cd を使用してディレクトリを変更します。
- ステップ 5. このターミナルウィンドウ内で以下を入力し、Node.js アプリ用の必要な設定を含む package.json ファイルを作成します。
npm init
注意: デフォルトの回答を使用するには ENTER を押し続けます。ただし、entry point: (index.js) を main.js に設定し、test command: を electron .(electron の後にスペースとドットを使用)に設定します。
後で設定を変更したい場合は、メインアプリフォルダ内の package.json ファイルを確認できます。
- ステップ 6. VSCode 内のターミナルで以下を入力して Electron をインストールします。
npm install --save-dev electron
Electron が正常にインストールされると、以下の出力が表示されます。
また、Electron を実行するために必要なパッケージを含む node_modules フォルダが生成されます。
onoff npm モジュールのインストール
onoff npm モジュールを使用すると、Electron アプリを使用して reTerminal の GPIO にアクセスして制御できます。
-
ステップ 1. 前述の方法で VSCode 内にターミナルウィンドウを開き、メインアプリディレクトリに移動します。
-
ステップ 2. 以下を入力して onoff npm モジュールをインストールします。
npm install onoff
electron-rebuild npm モジュールのインストールと実行
electron-rebuild npm モジュールは、Electron プロジェクトが使用している Node.js のバージョンに対してネイティブ Node.js モジュールを再構築します。これにより、システムの Node.js バージョンが正確に一致しなくても(しばしば一致しない、または不可能な場合があります)、Electron アプリでネイティブ Node.js モジュールを使用できます。
- ステップ 1. electron-rebuild npm モジュールをインストールします。
npm install --save-dev electron-rebuild
- ステップ 2. electron-rebuild を実行します。
./node_modules/.bin/electron-rebuild
注意: 新しい npm パッケージをインストールするたびに、electron-rebuild を再実行してください。
HTML の作成(基本的な UI)
HTML ファイルを使用して、スタイリングなしの基本的なユーザーインターフェースを作成します。この HTML ファイルは、画面上に UI 要素を表示する役割を果たします。
メインアプリディレクトリ内に index.html という新しいファイルを作成し、以下のコードをコピーします。
<!doctype html>
<html>
<head>
<!-- HTML ドキュメントの文字エンコーディングを指定 -->
<meta charset="UTF-8">
<!-- アプリのタイトルバー -->
<title>Test Application</title>
<!-- material icons API を読み込む -->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<!-- Google Fonts API を読み込む -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<!-- UI スタイリング用の style.css を読み込む -->
<link rel="stylesheet" href="style.css">
<!-- JavaScript コードを埋め込む -->
<script>
// ipcRenderer モジュールを読み込む
const { ipcRenderer } = require('electron');
// ボタンを押したときに GPIO を ON にする関数
function buttonclick1()
{
// "msg" というチャンネル名でメインプロセスに 1 をメッセージとして送信
ipcRenderer.send("msg1",1)
}
// ボタンを押したときに GPIO を OFF にする関数
function buttonclick2()
{
ipcRenderer.send("msg2",0)
}
// ボタンを押したときにアプリを閉じる関数
function buttonclick3()
{
ipcRenderer.send("close-me")
}
</script>
</head>
<body>
<!-- アプリケーションの閉じるボタン -->
<button class="button3" onclick="buttonclick3()">X</button>
<br>
<!-- アプリケーションの見出し -->
<h1>SMART LAMP</h1>
<!-- material icons API からの電球アイコン -->
<i class="material-icons">lightbulb</i>
<br>
<!-- 空行 -->
<br>
<!-- ON ボタン(スタイリング用の class 属性とボタンクリックイベント用の onclick 属性を含む) -->
<button class="button1" onclick="buttonclick1()">ON</button>
<br>
<button class="button2" onclick="buttonclick2()">OFF</button>
</body>
</html>
注意: ipcRenderer モジュールは EventEmitter です。このモジュールは、レンダープロセス(ウェブページ - HTML/CSS)からメインプロセス(main.js)にメッセージを送信するためのいくつかのメソッドを提供します。また、メインプロセスからの返信を受け取ることもできます。
これで HTML ファイルの作成が完了しました。
npm test を実行すると、以下の出力が表示されます。
CSS(スタイリング)の作成
CSS ファイルを使用して、HTML ファイルで作成したユーザーインターフェースにさまざまなスタイリングを追加します。
メインアプリディレクトリ内に style.css という新しいファイルを作成し、以下のコードをコピーしてください。
/* アプリのボディのスタイリング */
body {
background-color: rgb(141, 141, 141);
}
/* アプリのヘッディングのスタイリング */
h1 {
font-size: 60px;
text-align: center;
font-family: "Roboto", "Courier New", monospace;
color: rgb(255, 255, 255);
}
/* 電球のスタイリング */
.material-icons{
font-size: 250px;
color: rgb(204, 202, 71);
display: flex;
justify-content: center;
}
/* ON ボタンのスタイリング */
.button1 {
display: inline-block;
padding: 15px 25px;
font-size: 35px;
text-align: center;
outline: none;
color: rgb(255, 255, 255);
background-color:rgb(76, 175, 80);
border: none;
border-radius: 15px;
width: 20%;
margin:auto;
display:grid;
}
/* ON ボタンの押下時のエフェクト */
.button1:active {
box-shadow: 0 5px rgb(104, 99, 99);
transform: translateY(4px);
}
/* ON ボタンのホバーエフェクト */
.button1:hover {background-color: rgb(62, 142, 65)}
/* OFF ボタンのスタイリング */
.button2 {
display: inline-block;
padding: 15px 25px;
font-size: 35px;
text-align: center;
outline: none;
color: rgb(255, 255, 255);
background-color:rgb(207, 85, 85);
border: none;
border-radius: 15px;
width: 20%;
margin:auto;
display:grid;
}
/* OFF ボタンの押下時のエフェクト */
.button2:active {
box-shadow: 0 5px rgb(104, 99, 99);
transform: translateY(4px);
}
/* OFF ボタンのホバーエフェクト */
.button2:hover {background-color: rgb(179, 44, 44)}
/* Close ボタンのスタイリング */
.button3 {
padding: 8px 25px;
font-size: 20px;
text-align: center;
outline: none;
color: rgb(255, 255, 255);
background-color:rgb(179, 44, 44);
border: none;
width: 6%;
margin:auto;
display:grid;
float: right;
}
アプリの最終的な出力は以下のようになります。
Javascript の作成(アプリのロードと実行)
Javascript ファイルを使用して、アプリケーションウィンドウを作成し、HTML ファイルをロードして表示し、GPIO 機能を追加します。
メインアプリディレクトリ内に main.js という新しいファイルを作成し、以下のコードをコピーしてください。
var Gpio = require('onoff').Gpio; // onoff モジュールをインクルードして GPIO を操作
var LED = new Gpio(24, 'out'); // GPIO 24 を出力として初期化
// app, BrowserWindow, ipcMain モジュールをインクルード
const { app, BrowserWindow, ipcMain } = require('electron')
/* ipcMain モジュールを使用して ipcRenderer モジュールからのメッセージを受信し、
GPIO を ON にする */
ipcMain.on("msg1",(event,data)=>{
LED.writeSync(data);
})
/* ipcMain モジュールを使用して ipcRenderer モジュールからのメッセージを受信し、
GPIO を OFF にする */
ipcMain.on("msg2",(event,data)=>{
LED.writeSync(data);
})
/* ipcMain モジュールを使用して ipcRenderer モジュールからのメッセージを受信し、
アプリを閉じる */
ipcMain.on("close-me", (event, arg) => {
app.quit()
})
// アプリケーションウィンドウを作成
app.on('ready', function() {
var mainWindow = new BrowserWindow({
// アプリをフルスクリーンにする
"fullscreen": true,
webPreferences: {
// メインプロセスとレンダープロセス間の通信を有効化
nodeIntegration: true,
contextIsolation: false
}
});
// CSS スタイリング付きの HTML ページをロード
mainWindow.loadFile('index.html');
});
注意: ipcMain は、レンダープロセス(ウェブページ)から送信されたメッセージを受信するためのいくつかのメソッドを提供します。
アプリのテスト
前のファイルを保存すると、electron-rebuild をオンにしているため、すぐに出力が表示されます。ただし、アプリを閉じた場合は、再度 npm test を使用してアプリを開き、以下の出力を確認してください。
アプリを実行するスクリプトを準備する
- ステップ 1. 以前作成したルートフォルダを開き、そのフォルダ内に新しい .sh ファイル を作成します。
- ステップ 2. 作成したファイルを開き、以下を入力します。
#!/bin/bash
cd $HOME/Desktop/testapp
DISPLAY=:0 npm test
注意: ここで $HOME/Desktop/testapp は Electron プロジェクトの場所を指します。
- ステップ 3. VSCode 内でターミナルウィンドウを開き、アプリのルートディレクトリに移動します。
例:
cd ~/Desktop/testapp
- ステップ 4. ledstart.sh を実行可能ファイルにします。
sudo chmod +x ledstart.sh
アプリを起動するデスクトップファイルを準備する
- ステップ 1. Desktop フォルダを開き、そのフォルダ内に新しい .desktop ファイル を作成します。
- ステップ 2. 作成したファイルを開き、以下を入力します。
[Desktop Entry]
Encoding=UTF-8
Name=LED Test
Comment=IconTest Link
Exec=/home/pi/Desktop/testapp/ledStart.sh
Type=Application
Categories=Application;Development;
注意: Exec は先ほど作成したスクリプトの場所を指します。
- ステップ 3. VSCode 内でターミナルウィンドウを開き、Desktop に移動します。
例:
cd ~/Desktop
- ステップ 4. ledStart.desktop を実行可能ファイルにします。
sudo chmod +x ledStart.desktop
アプリを起動する
reTerminal LCD のデスクトップ上にある LED Test ファイルをダブルクリックします。
以下のような出力が表示されます。
これでボタンをクリックすると、LED が点灯するのが確認できます!
アプリをデバッグする
開発中にアプリをデバッグする手順を説明します。
-
ステップ 1. 以前説明したように、Microsoft Visual Studio Code を使用して SSH 経由で reTerminal にログインします。
-
ステップ 2. MobaXterm のような SSH アプリケーションを使用して reTerminal に SSH 経由でログインします。この際、X11 サーバー機能を有効にします。
注意: X11 は reTerminal のディスプレイを PC 上に転送して表示するために必要です。
- ステップ 3. Microsoft Visual Studio Code 上で reTerminal にコードを書き込んだ後、メインアプリディレクトリに移動し、以下を実行します。
npm test
最終的に、新しいウィンドウに出力が表示されます。コードにエラーがある場合は、MobaXterm のターミナルウィンドウに表示されます。
FAQ
Q: アプリを保存するたびに自動更新するにはどうすればよいですか?
これには、electron-reloader npm モジュールを使用してホットリロード機能を設定できます。
- ステップ 1. electron-reloader をインストールします。
npm install --save-dev electron-reloader
- ステップ 2. main.js ファイルの末尾に以下の行を追加します。
try {
require('electron-reloader')(module)
} catch (_) {}
これで npm test を一度実行すると、ファイルを保存するたびにアプリケーションが更新されます。プロジェクト内の内容を変更するたびに npm test を実行する必要はありません。
ボーナスデモ
Electron を使用したより興味深いデモを体験したい場合は、この GitHub リポジトリをチェックしてください。
リソース
- [GitHub] Electron_reTerminal_Smart_Lamp_UI
- [Webページ] Electron ドキュメント
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。