mirror of
https://github.com/kou029w/zenn.dev.git
synced 2025-01-19 08:28:04 +00:00
168 lines
6.5 KiB
Markdown
168 lines
6.5 KiB
Markdown
---
|
|
title: Web GPIO API/Web I2C APIをRaspberry PiのNode.jsから使う
|
|
emoji: 🤖
|
|
topics: [nodejs, raspberrypi, chirimen]
|
|
type: tech
|
|
published: true
|
|
---
|
|
|
|
この記事は [CHIRIMEN Open Hardware Advent Calendar 2020](https://qiita.com/advent-calendar/2020/chirimen_oh) 2 日目の記事です。
|
|
[CHIRIMEN チュートリアルの中の記事](https://tutorial.chirimen.org/raspi/nodejs)を一部加筆修正しました。
|
|
|
|
## 概要
|
|
|
|
Raspberry Pi の Node.js から Web GPIO API と Web I2C API を扱う方法を説明します。
|
|
|
|
:::message
|
|
[Web GPIO API](http://browserobo.github.io/WebGPIO/)/[Web I2C API](http://browserobo.github.io/WebI2C/) とは [W3C の Browsers and Robotics コミュニティグループ](https://www.w3.org/community/browserobo/)で標準化に向けての検討されている、JavaScript で Web アプリから電子パーツを直接制御できる低レベルハードウェア制御 API です。
|
|
:::
|
|
|
|
:::message
|
|
[Node.js](https://nodejs.org/) は、オープンソース・クロスプラットフォームな JavaScript 実行環境です。
|
|
[パッケージマネージャー npm](https://www.npmjs.com/) を利用して膨大なパッケージにアクセスでき、IoT プロトタイピングだけでなく幅広いアプリケーションを作るために使われています。
|
|
:::
|
|
|
|
## 準備
|
|
|
|
プログラムを実行するには Raspberry Pi に Node.js をインストールします。CHIRIMEN を利用する場合はあらかじめ Node.js がインストールされているので不要です。
|
|
もし CHIRIMEN の microSD カードを作成する方法を知りたい場合は [CHIRIMEN の SD カードイメージの作成方法](https://tutorial.chirimen.org/raspi/sdcard)を参照してください。
|
|
|
|
:::message
|
|
[CHIRIMEN](https://chirimen.org/) は、Web ブラウザからハードウェアを制御するプロトタイピング環境です。
|
|
:::
|
|
|
|
## Raspberry Pi に Node.js をインストールする方法
|
|
|
|
いくつか方法はありますが、ここでは [NodeSource を使ったインストール方法](https://github.com/nodesource/distributions#installation-instructions) を紹介します。
|
|
|
|
ターミナルを起動して以下のコマンドを実行します。
|
|
|
|
```sh
|
|
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
|
|
```
|
|
|
|
```sh
|
|
sudo apt-get install -y nodejs
|
|
```
|
|
|
|
これで Node.js のインストールは完了です。
|
|
|
|
## 新しいディレクトリの作成
|
|
|
|
続いて、実際にアプリケーションを作る前にプログラムを実行するための環境を整えます。作業用のディレクトリを作り、そのディレクトリの中でプログラムを実行します。
|
|
|
|
ターミナルを起動して以下のコマンドを実行します。
|
|
|
|
```shell
|
|
mkdir hello-real-world
|
|
```
|
|
|
|
```shell
|
|
cd hello-real-world
|
|
```
|
|
|
|
npm のためのファイル package.json を作成します。
|
|
|
|
```shell
|
|
npm init -y
|
|
```
|
|
|
|
作業用のディレクトリの中に npm パッケージ [node-web-gpio](https://www.npmjs.com/package/node-web-gpio) と [node-web-i2c](https://www.npmjs.com/package/node-web-i2c) をインストールします。
|
|
|
|
```sh
|
|
npm install node-web-gpio node-web-i2c
|
|
```
|
|
|
|
これで Node.js から Web GPIO API と Web I2C API を使う準備は完了です。
|
|
|
|
## Hello Real World
|
|
|
|
Raspberry Pi に接続した LED を点滅させるプログラムを書きます。
|
|
|
|
次の図のとおりに配線します。
|
|
|
|
![LEDの点滅回路の配線図](https://i.imgur.com/419yMxN.jpg)
|
|
|
|
空のテキストファイル main.js を作成し、Node.js のための JavaScript のプログラムを書きます。
|
|
|
|
```sh
|
|
editor main.js
|
|
```
|
|
|
|
テキストエディターで main.js を次のように書きます。
|
|
|
|
```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 を実行するには、次のコマンドを実行します。
|
|
|
|
```sh
|
|
node main.js
|
|
```
|
|
|
|
LED が点滅すれば完成です 🎉
|
|
|
|
## いろいろなデバイスを試す
|
|
|
|
CHIRIMEN ブラウザーから利用できるいろいろなデバイスはすべて同じように Node.js から扱うことができます。
|
|
|
|
たとえば、次のコードは[温度センサー ADT7410](http://akizukidenshi.com/catalog/g/gM-06675/)を利用して温度を表示するプログラムです。
|
|
|
|
```js
|
|
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](https://github.com/chirimen-oh/chirimen-drivers) にありますのでご覧ください。
|
|
|
|
また、CHIRIMEN チュートリアルのなかには、Web GPIO や Web I2C によって扱うことのできる[外部デバイスとサンプルコードの一覧があります](https://tutorial.chirimen.org/raspi/partslist)。こちらも参考になるかもしれません。
|
|
|
|
## まとめ
|
|
|
|
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 で編集する](https://github.com/kou029w/zenn.dev/edit/master/articles/node-web-gpio.md)
|