Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3.4 コードを読む

前提:CHIRIMEN Raspberry Pi Zero は Node.js をプログラム実行環境(インタープリタ)として使っています。 Raspberry Pi Zero 版では、プログラムの起点は自分が書いた JavaScript コードそのものになります。 ブラウザの代わりに、Node.js という JavaScript コードだけを解釈するソフト(JavaScript インタープリタ)にコードを読み込ませて実行します。

ターミナルウィンドの右側のファイルマネージャでhello.js ⇒ 表示 を選び、ソースコードを読んでみましょう

import { requestGPIOAccess } from "node-web-gpio"; // WebGPIO を使えるようにするためのライブラリをインポート
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); // sleep 関数を定義

const gpioAccess = await requestGPIOAccess(); // GPIO を操作する
const port = gpioAccess.ports.get(26); // 26 番ポートを操作する

await port.export("out"); // ポートを出力モードに設定

// 無限ループ
while (true) {
  // 1秒間隔で LED が点滅します
  await port.write(1); // LEDを点灯
  await sleep(1000); // 1000 ms (1秒) 待機
  await port.write(0); // LEDを消灯
  await sleep(1000); // 1000 ms (1秒) 待機
}

1行目:WebGPIOライブラリを読み込み (JavaScript Module仕様に従って)

import { requestGPIOAccess } from "node-web-gpio";

JavaScript module の仕組みで WebGPIO ライブラリを読み込んでいます。これで Web GPIO API が使えるようになりました。

4行目:GPIOポートの初期化処理

const gpioAccess = await requestGPIOAccess();

このファイルで最初に実行されるのが await requestGPIOAccess() です。Web GPIO API の関数で、GPIO にアクセスするためのインタフェース gpioAccess を取得しています。

関数の呼び出しに await 接頭詞が付いていることに注目してください。 requestGPIOAccess() は非同期関数で、GPIO への準備が整うまで処理を待つ必要があります。通常、await を使うコードは async 接頭詞付きの関数として定義しなければなりませんが、JavaScript module のトップレベルに限っては例外です。モジュールの最上位では async 関数で包まなくても await をそのまま書けます。これをトップレベル await と呼び、hello.js 自体がモジュールなので、ファイル冒頭からいきなり await requestGPIOAccess() と書けています。

5〜7行目:GPIOPortの出力処理

const port = gpioAccess.ports.get(26);

GPIO の出力機能を使う準備として、gpioAccess.ports.get(26) で GPIO の 26 番ポートにアクセスするためのオブジェクトを取得しています。

await port.export("out");

続いて await port.export("out") で GPIO の 26 番を「出力設定」にしています。これにより LED への電圧の切り替えが可能になります。

10行目以降:無限ループ部分

ループの中身は、電圧の切り替えとその合間の待機の繰り返しにすぎません。await port.write(1)await port.write(0) を交互に呼び出し、GPIO 26 番に加える電圧を 3.3V → 0V → 3.3V → 0V → … と切り替えています。切り替えの間隔を作っているのが await sleep(1000) で、1000 ms (1 秒) が経つまで次の書き込みを待たせています。