Web GPIO API/Web I2C APIをRaspberry PiのNode.jsから使う
この記事は CHIRIMEN Open Hardware Advent Calendar 2020 2 日目の記事です。
CHIRIMEN チュートリアルの中の記事を一部加筆修正しました。
概要
Raspberry Pi の Node.js[1]から Web GPIO API と Web I2C API を扱う方法を説明します。
準備
プログラムを実行するには Raspberry Pi に Node.js をインストールします。CHIRIMEN を利用する場合はあらかじめ Node.js がインストールされているので不要です。
もし CHIRIMEN の microSD カードを作成する方法を知りたい場合は CHIRIMEN の SD カードイメージの作成方法を参照してください。
Raspberry Pi に Node.js をインストールする方法
いくつか方法はありますが、ここでは NodeSource を使ったインストール方法 を紹介します。
ターミナルを起動して以下のコマンドを実行します。
curl -sL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
これで Node.js のインストールは完了です。
新しいディレクトリの作成
続いて、実際にアプリケーションを作る前にプログラムを実行するための環境を整えます。作業用のディレクトリを作り、そのディレクトリの中でプログラムを実行します。
ターミナルを起動して以下のコマンドを実行します。
mkdir hello-real-world
cd hello-real-world
npm のためのファイル package.json を作成します。
npm init -y
ECMAScript モジュール(ESM)を有効にするため、package.json に "type": "module" を追加します。
npm pkg set type=module
作業用のディレクトリの中に npm パッケージ node-web-gpio と node-web-i2c をインストールします。
npm install node-web-gpio node-web-i2c
これで Node.js から Web GPIO API と Web I2C API を使う準備は完了です。
Hello Real World
Raspberry Pi に接続した LED を点滅させるプログラムを書きます。
次の図のとおりに配線します。

空のテキストファイル main.js を作成し、Node.js のための JavaScript のプログラムを書きます。
editor main.js
テキストエディターで main.js を次のように書きます。
import { requestGPIOAccess } from "node-web-gpio";
import { setTimeout as sleep } from "node:timers/promises";
const gpioAccess = await requestGPIOAccess();
const gpioPort = gpioAccess.ports.get(26);
await gpioPort.export("out");
while (true) {
await gpioPort.write(1);
await sleep(1000);
await gpioPort.write(0);
await sleep(1000);
}
書き終えたら保存します。
Node.js で main.js を実行するには、次のコマンドを実行します。
node main.js
LED が点滅すれば完成です 🎉
いろいろなデバイスを試す
CHIRIMEN ブラウザーから利用できるいろいろなデバイスはすべて同じように Node.js から扱うことができます。
たとえば、次のコードは温度センサー ADT7410を利用して温度を表示するプログラムです。
import { requestI2CAccess } from "node-web-i2c";
import ADT7410 from "@chirimen/adt7410";
const i2cAccess = await requestI2CAccess();
const adt7410 = new ADT7410(i2cAccess.ports.get(1), 0x48);
await adt7410.init();
const temperature = await adt7410.read();
console.log(`Temperature: ${temperature} ℃`);
コマンド npm i @chirimen/adt7410 を実行すると、温度センサー ADT7410 を利用するための @chirimen/adt7410 パッケージをインストールできます。
デバイスを扱うためのドライバーのパッケージの一覧は CHIRIMEN Drivers にありますのでご覧ください。
また、CHIRIMEN チュートリアルのなかには、Web GPIO や Web I2C によって扱うことのできる外部デバイスとサンプルコードの一覧があります。こちらも参考になるかもしれません。
まとめ
CHIRIMEN ブラウザー版での API の差異をまとめると下記とのおりです。
| CHIRIMEN ブラウザー版 | Node.js |
|---|---|
navigator.requestGPIOAccess |
import { requestGPIOAccess } from "node-web-gpio"; |
navigator.requestI2CAccess |
import { requestI2CAccess } from "node-web-i2c"; |
sleep |
export { setTimeout as sleep } from "node:timers/promises"; |
以上です。
この記事では、Raspberry Pi の Node.js から Web GPIO API と Web I2C API を扱う方法を説明しました。
-
Node.js は、オープンソース・クロスプラットフォームな JavaScript 実行環境です。
パッケージマネージャー npm を利用して膨大なパッケージにアクセスでき、IoT プロトタイピングだけでなく幅広いアプリケーションを作るために使われています。 ↩︎
Discussion