CHIRIMEN Raspberry Pi Zero W チュートリアル

概要

CHIRIMEN Raspberry Pi Zero版 を用いたIoT実習資料(ドラフト)です。

pizeronodejs.mdの内容をもとに、Web Serial RPiZero Terminalを使うことで操作を簡単化し、更にプログラム作法をECMA Script Moduleにあわせています。

準備

ステップ0 (物品準備、PCをWiFiに接続)

必要な物品リスト

以下を用意します

Parts Images

PiZero自体はディスプレイやキーボードを接続する必要はありません。

PCをWiFiに接続

ステップ1(ターミナル接続)

Note:

ステップ2 (WiFi設定)

ステップ3 (CHIRIMEN環境設定)

Hello Real World(Lチカを実行する)

配線

PiZero とパーツを使って下の図の通りに配線します。

PiZero配線図

プログラムを書く

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

以下のプログラムをJS Editorに書き写します(コピペ)

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

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

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

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

blink();

実行する

Raspberry Pi について

Raspberry Pi Zeroのピン配列

GPIO, 電源, GND, I2C信号線などのピン配列を記載します。

CHIRIMEN について

CHIRIMEN Raspberry Pi Zero版について

JavaScript の基礎

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

色々なデバイスのサンプルが用意されています。これらを用いてデバイスの制御方法を学んでいきましょう。

GPIOを試す

GPIOを理解する

GPIO出力

GPIOの出力はLチカで実験済みですね。そこで今回はモーターを動かしてみましょう。回路図は以下のようになります。 GPIO Motor

コードはLチカと全く同じです。

コードを読む

 import {requestGPIOAccess} from "./node_modules/node-web-gpio/dist/index.js";

GPIO入力

GPIO端子の入力が変化したら関数を実行という機能によってGPIOの入力を使います。

コードを読む

 import {requestGPIOAccess} from "./node_modules/node-web-gpio/dist/index.js";

GPIO入力(ポーリング)

入力ではイベントの他にポーリングというテクニックが広く使われます。(次章のI2Cデバイスからの入力では専らポーリング)

コードを読む

 import {requestGPIOAccess} from "./node_modules/node-web-gpio/dist/index.js";

I2Cデバイスを試す

I2Cを理解する

SHT30編

SHT30は温度に加えて湿度も測定できるI2C接続の多機能センサーです。SHT31もほぼ同等に使えます。(SHT31のほうが精度が高い)

I2Cセンサー(SHT30)が認識さていることを確認する

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                       

実行する

コードを読む

 import {requestI2CAccess} from "./node_modules/node-web-i2c/index.js"; import SHT30 from "@chirimen/sht30";

ADT7410編

まずは、その中からI2CセンサーのADT7410を試しましょう。(SHT30(orSHT31)は次章を参照)

PiZero温度センサー図

I2Cセンサーが認識さていることを確認する

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                       

実行する

IoTを試す

遠隔LEDコントロール

system configuration IoTは、制御されるデバイス(上図ではCHIRIMEN PiZeroW)と、利用者端末(上図ではWebApp PC-side)に加えて、これらの間でデータを中継するサーバ(クラウド)が必要になります。 今回はWeb標準技術であるWebSocketプロトコルを中継するサーバを用いてLEDを備えたCHIRIMENデバイスとスマホやPCのWebAppを繋いだIoTシステムを作ります。

IoT

WebSoeketとRelayServer

配線する

配線は最初のLチカそのままです。 PiZero配線図

CHIRIMENデバイス側にコードを入れ、実行する

PC側のコードを準備し、実行する

Code Sandbox Image

コードを読む

Raspberry Pi Zero側コード

import nodeWebSocketLib from "websocket";
import {RelayServer} from "./RelayServer.js";

PC側コード

import {RelayServer} from "https://chirimen.org/remote-connection/js/beta/RelayServer.js";

他のいろいろなデバイスを試してみる

また、こちらには、Web GPIO や Web I2C によって扱うことのできる外部デバイスの写真や様々なCHIRIMEN環境のサンプルコードの一覧があります。こちらも参考になるかもしれません。(CHIRIMENはRaspberry Pi ZeroW以外に、Raspberry Pi 3,4や、micro:bit等でも使用できます)

CHIRIMEN ブラウザー版との差異

CHIRIMEN ブラウザー版 Node.js
ライブラリ、ドライバーはhtmlで読み込む jsの中で直接読み込む
<script src="polyfill.js"></script >
import {requestGPIOAccess} from "./node_modules/node-web-gpio/dist/index.js";

import {requestI2CAccess} from "./node_modules/node-web-i2c/index.js";
<script src="..../adt7410.js"></script >
import ADT7410 from "@chirimen/adt7410";
Sleep関数を宣言する
const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));

CHIRIMEN環境の任意のディレクトリへのセットアップ

以下のコマンド手順で~/myAppディレクトリ以外にも設定できます。