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

11.4.1 GPIOポートの初期化と出力処理

GPIOポートの初期化

このコードで最初に呼び出されるのが await navigator.requestGPIOAccess() です。 先に触れた Web GPIO API の関数で、GPIO にアクセスするためのインタフェース gpioAccess を取得しています。

const gpioAccess = await navigator.requestGPIOAccess(); // GPIO を操作する

呼び出しに await が付いているのは、requestGPIOAccess() が非同期関数であり、GPIO へのアクセス許可が下りるまで処理を待つ必要があるからです。await を使うコードを含む関数は、この後の main() のように async 接頭詞付きの非同期関数として定義しなければなりません。

GPIOPort の出力処理

GPIO の出力機能を使うには、まず操作対象のポートを取得します。

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

gpioAccess.ports.get(26) は、GPIO の 26 番ポートにアクセスするためのオブジェクトを返します。ただしこの時点では、まだポートは入力にも出力にも使える状態になっていません。

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

await port.export("out") で 26 番ポートを「出力設定」にすると、LED にかける電圧を切り替えられるようになります。

// 無限ループ
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秒) 待機
}

あとは電圧の切り替えを繰り返すだけです。await port.write(1)await port.write(0) を交互に呼び出し、GPIO 26 番に加える電圧を 3.3V → 0V → 3.3V → 0V → … と切り替えています。合間に挟んだ await sleep(1000) が 1000 ms (1 秒) の待ち時間を作り、切り替えの間隔を 1 秒に保っています。

LED は、一定以上の電圧を加えて電流を流すと点灯する部品です。3.3 V を加えれば点灯し、0 V に落とせば消灯します。このループがしているのは、その点灯と消灯をひたすら繰り返すことだけです。

サンプルコードを編集してみよう

  • 点滅周期を速くしたり遅くしたりしてみる(sleep()の引数を変更)
  • 点灯する時間と消灯する時間を変えてみる(同上)
  • GPIO ポートを別のポートに変え、配線もあわせて変えてみる(gpioAccess.ports.getの引数を変更)