Web GPIO API/Web I2C APIをRaspberry PiのNode.jsから使う

4 min read読了の目安(約4300字

この記事は CHIRIMEN Open Hardware Advent Calendar 2020 2 日目の記事です。
CHIRIMEN チュートリアルの中の記事を一部加筆修正しました。

概要

Raspberry Pi の Node.js[1]から Web GPIO API と Web I2C API を扱う方法を説明します。

Web GPIO API/Web I2C API とは W3C の Browsers and Robotics コミュニティグループで標準化に向けての検討されている、JavaScript で Web アプリから電子パーツを直接制御できる低レベルハードウェア制御 API です。

準備

プログラムを実行するには Raspberry Pi に Node.js をインストールします。CHIRIMEN を利用する場合はあらかじめ Node.js がインストールされているので不要です。
もし CHIRIMEN の microSD カードを作成する方法を知りたい場合は CHIRIMEN の SD カードイメージの作成方法を参照してください。

CHIRIMEN は、Web ブラウザからハードウェアを制御するプロトタイピング環境です。

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

作業用のディレクトリの中に npm パッケージ node-web-gpionode-web-i2c をインストールします。

npm install node-web-gpio node-web-i2c

これで Node.js から Web GPIO API と Web I2C API を使う準備は完了です。

Hello Real World

Raspberry Pi に接続した LED を点滅させるプログラムを書きます。

次の図のとおりに配線します。

LEDの点滅回路の配線図

空のテキストファイル main.js を作成し、Node.js のための JavaScript のプログラムを書きます。

editor main.js

テキストエディターで main.js を次のように書きます。

const { requestGPIOAccess } = require("node-web-gpio");
const sleep = require("util").promisify(setTimeout);

async function blink() {
  const gpioAccess = await requestGPIOAccess();
  const port = gpioAccess.ports.get(26);

  await port.export("out");

  for (;;) {
    await port.write(1);
    await sleep(1000);
    await port.write(0);
    await sleep(1000);
  }
}

blink();

書き終えたら保存します。

Node.js で main.js を実行するには、次のコマンドを実行します。

node main.js

LED が点滅すれば完成です 🎉

いろいろなデバイスを試す

CHIRIMEN ブラウザーから利用できるいろいろなデバイスはすべて同じように Node.js から扱うことができます。

たとえば、次のコードは温度センサー ADT7410を利用して温度を表示するプログラムです。

const { requestI2CAccess } = require("node-web-i2c");
const ADT7410 = require("@chirimen/adt7410");

async function measure() {
  const i2cAccess = await requestI2CAccess();
  const i2c1 = i2cAccess.ports.get(1);
  const adt7410 = new ADT7410(i2c1, 0x48);
  await adt7410.init();
  const temperature = await adt7410.read();
  console.log(`Temperature: ${temperature}`);
}

measure();

コマンド npm i @chirimen/adt7410 を実行すると、温度センサー ADT7410 を利用するための @chirimen/adt7410 パッケージをインストールできます。

デバイスを扱うためのドライバーのパッケージの一覧は CHIRIMEN Drivers にありますのでご覧ください。

また、CHIRIMEN チュートリアルのなかには、Web GPIO や Web I2C によって扱うことのできる外部デバイスとサンプルコードの一覧があります。こちらも参考になるかもしれません。

まとめ

CHIRIMEN ブラウザー版での API の差異をまとめると下記とのおりです。

CHIRIMEN ブラウザー版 Node.js
navigator.requestGPIOAccess const { requestGPIOAccess } = require("node-web-gpio"); requestGPIOAccess
navigator.requestI2CAccess const { requestI2CAccess } = require("node-web-i2c"); requestI2CAccess
sleep const sleep = require("util").promisify(setTimeout); sleep

以上です。
この記事では、Raspberry Pi の Node.js から Web GPIO API と Web I2C API を扱う方法を説明しました。


GitHub で編集する

脚注
  1. Node.js は、オープンソース・クロスプラットフォームな JavaScript 実行環境です。
    パッケージマネージャー npm を利用して膨大なパッケージにアクセスでき、IoT プロトタイピングだけでなく幅広いアプリケーションを作るために使われています。 ↩︎