obnizOS プラグイン の開発環境セットアップしてENV HAT Ⅱのデータを表示してみよう
こんにちは遠藤です。今回はobnizのobnizOSプラグイン機能をを取り上げてみました。
obnizOSは、obniz社公式の開発ボード以外のM5Stick-CなどESP32マイコンをobnizクラウドに接続させるためのマイコン用OSですが、昨年2020年の7月にマイコン側から直接プログラムを実行可能なプラグイン機能がリリースされました。
それまでは、obnizクラウドからマイコンを制御するためには主にJavascriptのクライアントライブラリを通してプログラミングする必要がありましたが、マイコン側のプログラムはArduino IEDで開発することが可能になりました。
プラグインを使うとArduino向けの豊富なライブラリを利用できるようになり、obniz.jsで対応していなかったデバイスも楽に制御することができるようになることが期待できます(BLEは使えないという制限はあります)。
さらにOTAで遠隔のマイコンにプラグインを含むobnizOSをインストールすることもできます。便利!
この記事では、obnizOS プラグインの開発環境をセットアップして、簡単な例をM5Stick-Cで動かすところまでを解説します。
この構成を使ったコピペテック マガジンの記事も準備していますので、お楽しみにしてください。
obnizOSとobnizOSプラグインとは?
そもそもobnizとはですが、obniz社が提供する IoT クラウ ドサービスで、公式デバイスとして obniz Board などを提供しています。
特徴としては、マイコンをobnizクラウドを介してインターネット越しにJavascriptで制御することができます。
obnizOSは、obniz社が提供する公式デバイス以外のマイコンを上記のシステムに参加させたい場合に、マイコンにインストールするOSです。
obnizOSをインストールしたマイコンは、公式デバイスのobniz Boardと同様にobnizクラウド越しにJavascriptで制御する必要があります。obnizOSは便利なのですが、JavascriptのSDK obniz.jsに対応していない機能やデバイスを制御したいといった場合に、なかなか面倒だったりそもそも不可能だったりすることがあったわけです。
しかし、obnizOSプラグインの登場によって、マイコンのフル機能を使ったり、obniz.jsでは対応していないパーツもArduino向けライブラリを使用して直接制御可能になります。
以下、obnizOSからプラグインの開発環境のセットアップをしたあとに、具体的にプラグインからobnizクラウドとどのようにやりとりするか簡単に見ていきます。
obnizOSのインストール
obnizOS のインストール方法は、obniz-cli を利用する方法と Espressif Systems 社の公式 ツールである esptool を利用する方法がありますが、本記事ではobniz-cli を利用したインストール方法を紹介していきます。
obniz-cliはnode.jsのパッケージとして配布されているでnode.jsが必要です。また、obniz-cliは内部でesptoolを利用するのでesptoolもインストールする必要があります。esptoolはPython のパッケージとして提供されていますのでPythonもインストールしていきます。
セットアップの流れとしては以下のようになります。
1. node.jsのインストール
2. obniz-cliのインストール
3. Pythonのインストール (Windowsのみ)
4. esptoolのインストール
5. デバイスキーとWifi設定の準備
6. obnizOSをM5Stick-Cに書き込む
1. node.jsのインストール
以下のnode.jsのダウンロードページを開きます。
14.16.0 LTSの方をクリックしてダウンロードします。
Windows 場合は、「node-v14.16.0-x64.msi」ファイルのダウンロードが完了したら起動してインストーラを開きます。
Mac の場合は「node-v14.16.0.pkg」ファイルのダウンロードが完了したら、ファイルの右ク リックメニューを開いて [このアプリケーションで開く] > [インストーラ (デフォルト)] を 選択して開きます。「“node-v12.16.1.pkg”が悪質なソフトウェアかどうかを Apple では確認 できないため、このソフトウェアは開けません。」と警告が表示されるので、[開く] を選択します。
インストーラが起動したら、ウィザードに沿ってインストールします。
インストールが完了したら、正常にインストールできたか確認してみます。コマンドプロ ンプトまたはターミナルを開いて node -v と入力して、以下のようにインストールしたバー ジョンが表示されれば OK です。
>node -v
v14.16.0
2. obliz-cliのインストール
node.jsのパッケージマネージャーnpmでobniz-cliをインストールします。
Windowsの場合はコマンドプロンプトを、Macの場合はターミナルを開きます。
Windowsの場合は、windows-build-toolsも必要になりますので、先に以下のコマンドでインストールします。windows-build-toolsのインストールのみ「管理者として実行」を選択してコマンドプロンプトを開く必要があります。
>npm install windows-build-tools -g
インストールが終わると以下のようなメッセージが表示されます。
このままコマンドプロンプトは閉じて、obniz-cliのインストールは通常モードでコマンドプロンプトを開きます。
obniz-cliを以下のコマンドでインストールします。
>npm i obniz-cli -g
obniz-cliとコマンドを叩いてヘルプが表示されれば正しくインストールできています。
>obniz-cli
Unknown Command see below help
_ _ _ _
___ | |__ _ __ (_)____ ___| (_)
/ _ \| '_ \| '_ \| |_ /____ / __| | |
| (_) | |_) | | | | |/ /_____| (__| | |
\___/|_.__/|_| |_|_/___| \___|_|_|
CLI to interact with obniz device and cloud.
VERSION
obniz-cli/0.5.5
USAGE
$ obniz-cli [COMMAND]
COMMANDS
signin Signin to obniz cloud.
signout Signout
user:info Show current Logged in user
os:flash-create Flashing and configure target device and registrate it on your account on obnizCloud.
os:flash Flashing and configure target device.
os:config Configure obnizOS flashed device.
os:config-via-wifi Configure ObnizOS network via Wi-Fi from devices.
os:erase Fully erase a flash on target device.
os:list List of available obnizOS hardwares and versions
os:ports Getting serial ports on your machine.
(node:52357) ExperimentalWarning: The fs.promises API is experimental
3. Pythonのインストール (Windowsのみ)
続いてesptool用にPythonをインストールします。
Windows にはデフォルトで Python がインストールされていませんので Python をイン ストールする必要があります。
Mac にはデフォルトでインストールされていますし、esptoolは2.7系、3系どちらにも対応していますので、スキップしてesptoolのインストールに進んでください。
Python をインストールする方法はいくつかありますが、本記事では公式のインストーラを使用してインストールします。
以下のダウンロードページを開きます。
ダウンロードされたファイル「python-3.9.2-amd64.exe」を開きます。
インストール方法は、「Customize installation」を選択します。
「Optional Features」はデフォルトのままで[Next]をクリックします。
「Advanced Options」では「Add Python to environment variables」を選択して環境変数にパスを通すようにします。[Install]をクリックしてインストールを開始します。
完了したらインストーラを閉じます。
正しくインストールされたか確認しておきましょう。コマンドプロンプトを開き「python -V」を実行して以下のようにバージョンが表示されればOKです。
>python -V
Python 3.9.2
このように「Python 3.9.2」と表示されれば OK です。
4. esptoolのインストール
pipコマンドでesptoolをインストールします。
Windowsの場合はコマンドプロンプト、Mac の場合はターミナルを開き以下のコマンドを実行します。
>pip install esptool
...
Successfully installed bitstring-3.1.7 cffi-1.14.5 cryptography-3.4.6 ecdsa-0.16.1 esptool-3.0 pycparser-2.20 pyserial-3.5 reedsolo-1.5.4 six-1.15.0
「Successfully installed...」と表示されればインストールは完了です。esptool.pyと入力して以下のように表示されれば、正常にインストールされています。
>esptool.py
esptool.py v2.8
usage: esptool [-h] [--chip {auto,esp8266,esp32}] [--port PORT] [--baud BAUD]
[--before {default_reset,no_reset,no_reset_no_sync}]
[--after {hard_reset,soft_reset,no_reset}] [--no-stub]
[--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
{load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
...
esptool.py v2.8 - ESP8266 ROM Bootloader Utility
...
obnizOS をM5Stick-Cにインストール
インストールのコマンドには以下を指定する必要があるので、予め用意しておきます。
・デバイスキー
・Wifi設定ファイル
・USBシリアルポート
以下、順を追って解説します。
デバイスキーの取得
デバイスキーは、obniz コンソールからダウンロードします。
コンソールにログイン後、左のメニューから [デバイス] を選択して、[Device Type] が「obnizOS」の行の [設定] をク リックして [Device setting] のページを開きます。[デバイスキー] の [Download] ボタンをクリックしてデバイスキーを含むテキストファイルをダウンロードします。
「devicekey-{obnizID}」のような名前のファイルがダウンロードされます。ファイルを開くと以下のようにデバイスキーを確認できます。
00000000&21a100000000000000000000000000000000000
Wifi設定ファイルの作成
続いて、Wifi設定ファイルを用意します。
ファイル名は何でも良いですが、ここでは「wifi-config-json」という名前のファイルを作成して、以下のJSONを貼り付けます。
「ssid」と「password」に、利用するWifiのSSIDとパスワードに書き換えて保存します。
{
"networks":[
{
"type": "wifi",
"settings": {
"ssid": "exampl_essid",
"password": "example_password"
}
}
]
}
USBシリアルポートの確認
M5Stick-CをPCにUSB接続して、USBシリアルポートを確認します。
Windowsの場合は、まずポート名をデバイスマネージャで確認します。
この場合は、「COM4」が使用するポート名になります。
Macの場合は、[ツール] > [シリアルポート]で「 /dev/tty.usbserial-695225E845 (Kongou Hikari) 」です。
ポートは、obniz-cliのos:postsコマンドでも確認できます。以下はMacで実行した例です。
$ obniz-cli os:ports
(node:26881) ExperimentalWarning: The fs.promises API is experimental
===Founded Serial Ports===
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.usbserial-695225E845 (Kongou Hikari)
obnizOSをM5Stick-Cに書き込む
obniz-cliからサインインします。以下のコマンドを実行します。
> obniz-cli signin
ブラウザにobnizのログインページが表示されるのでobnizのアカウントでログインします。
以下の画面で[認証済みです(WebAppへ戻る)]をクリックします。
ブラウザには、以下のメッセージが表示され、
コマンドプロンプトには以下のメッセージが表示されれば認証完了です。
> obniz-cli signin
√ Authenticated.
√ Sign in as "hrendoh@gmail.com"
以下のコマンドでobnizOSを書き込みます。プロンプトで聞かれるポートが確認したものと合っていればそのままEnterして進めます。
>obniz-cli os:flash --devicekey "00000000&000000000000000000000" --config ./wifi-config.json --hardware m5stickc
No serial port specified.
? Serial Ports available on your machine (Use arrow keys)
> COM3 (FTDI)
書き込みが成功すると以下のようなメッセージが表示されます。
>obniz-cli os:flash --devicekey "00000000&000000000000000000000" --config ./wifi-config.json --hardware m5stickc
No serial port specified.
? Serial Ports available on your machine COM3 (FTDI)
√ Serial Port: decided COM3 baundrate 1500000
√ obnizOS: [using default] hardware=esp32w version=3.4.5(Public Latest Version)
√ Flashing obnizOS: Flashed
√ Serial Port: decided COM3 baundrate 1500000
√ Configure: Opening Serial Port COM3
√ Configure: Setting Devicekey obnizID=00000000
√ Configure: Setting Network Type
√ Configure: Setting Wi-Fi
√ Configure: Success
M5Stick-Cのディスプレイにobnizのロゴが表示されています。
Arduiono IDEのインストール
以下のArduinoのダウンロードページを開き、お使いのプラットフォームのものをダウンロードしてください。
https://www.arduino.cc/en/software
Windowsの場合は「Windows Win 7 and newer」を、Macの場合は「Mac OS X 10.10 or newer」を選択します。
ダウンロードの際に寄付を求められますが、寄付をしない場合は[JUST DOWNLOAD]をクリックすればダウンロードが始まります。
ダウンロードできたら、WindowsとMacそれぞれ以下の手順でインストールしてください。
Windowsの場合
ダウンロードしたファイル「arduino-x.x.x-windows.exe」を開き、ウィザードに沿ってインストールしてください。
Arduino IDEの起動は、Windowsメニューからできます。
Macの場合
Macの場合はダウンロードしたファイルがアプリケーションのファイルなので、Finderで「アプリケーション」フォルダに移動しておきます。
Arduino IDEの起動は、Launchpadから選択するか、またはダウンロードしたファイルを直接開きます。
obnizOS プラグインをArduino IDEにセットアップ
Arudiono IDEにobnizプラグインの追加のボードマネージャをインストールします。
セットアップ手順は、以下のobnizの公式ドキュメントに載っています。
以下の手順で、Arudiono IDEにobnizプラグインのボードマネージャをインストールします。
1. Arduino IDEのメニューから[ファイル] > [環境設定] (Macの場合は[Arduino] > [Preferences...])を選択して設定画面を開きます。
2. [追加のボードマネージャのURL]にURL「https://obniz.github.io/obniz-plugin-arduino/package_obniz_index.json」を入力して[OK]をクリックします。
すでに他のボードマネージャが追加されている場合は、右側のアイコンクリックして「追加のボードマネージャのURL」ウィンドウを開き
改行して追加して「OK」をクリックして閉じます。
「OK」をクリックして「環境設定」を閉じます。
3. [ツール] > [ボード "ArduinoUno"] > [ボードマネージャ...]を開きます。
右上のフィルターに「obniz」と入力して、「obniz by Cambrianrobotics」の[インストール]ボタンをクリックしてインストールします。
インストールが完了したら「閉じる」ボタンをクリックして閉じます。
Lチカサンプルで動作を確認
開発環境の確認のため、まずは公式サンプルでLチカしてみましょう。
まず、Arduino IDEでボードを「obniz plugin」の「M5Stick-C」に切り替えます。
[ボード: "Arduino Uno"] > [obniz plugin] > [M5Stick-C]を選択します。
「ファイル」>「スケッチ例」>「obniz」>「onlin_led_on」を選択します。
スケッチ例「online_led_on」のコードを以下のように修正します。
差分はコメント箇所のみです。
#include <obniz.h>
#define LED_IO 10 // M5Stick-Cの内蔵LEDのピン
bool onlineFlg = false;
void onEvent(os_event_t event, uint8_t* data, uint16_t length) {
switch (event) {
case PLUGIN_EVENT_NETWORK_CLOUD_CONNECTED:
Serial.println("cloud Connected");
onlineFlg = true;
break;
case PLUGIN_EVENT_NETWORK_CLOUD_DISCONNECTED:
Serial.println("cloud Disconnected");
onlineFlg = false;
break;
case PLUGIN_EVENT_NETWORK_HARDWARE_CONNECTED:
case PLUGIN_EVENT_NETWORK_HARDWARE_DISCONNECTED:
case PLUGIN_EVENT_NETWORK_WIFI_SCANNING:
case PLUGIN_EVENT_NETWORK_WIFI_NOTFOUND:
case PLUGIN_EVENT_NETWORK_WIFI_CONNECTING:
case PLUGIN_EVENT_NETWORK_WIFI_SOFTAP_CONNECTED:
case PLUGIN_EVENT_NETWORK_WIFI_FAIL:
case PLUGIN_EVENT_FAIL:
case PLUGIN_EVENT_OTA_START:
case PLUGIN_EVENT_OTA_END:
case PLUGIN_EVENT_OTA_ERROR:
case PLUGIN_EVENT_INITIALIZED:
break;
}
}
void setup() {
Serial.begin(115200);
Serial.println("online led start!");
obniz.onEvent(onEvent);
obniz.start(NULL);
obniz.pinReserve(LED_IO);
pinMode(LED_IO, OUTPUT);
}
void loop() {
digitalWrite(LED_IO, !onlineFlg); // M5Stick-Cの内蔵LEDはLOWのときに点灯する
delay(500);
}
こちらは、obnizクラウドに接続するとM5Stick-Cの内蔵LEDが点灯し、切断するとLEDが消灯するというプログラムになります。
M5Stick-CをUSBケーブルで接続し、[マイコンボードに書き込む]をクリックしてプログラムを書き込みます。
シリアルモニタで「cloud Connected」が表示されると同時にM5Stick-Cの内蔵LEDが点灯します。
こちらが実際のシリアルモニタのスクリーンショットですが、「cloud Connected」が表示されてから「cloud Disconnected」が表示されるまで、LEDが点灯します。
イベントの詳細については、リファレンス - obniz DocsのonEventを参照ください。
ENV Hat Ⅱで測定した温度・湿度を送受信してみる
M5Stick-C用の環境センサーENV Hat Ⅱから読み取った温度、湿度、気圧をobnizクラウドに送信して、HTMLで表示するより実践的なサンプルを作成してみます。
ENV Hat Ⅱは、磁界センサーも使えますが、磁界センサーの値を読み取るプログラムは長くなるので今回は対象外としました。
ENV Hat Ⅱから値を取得するスケッチは以下の公式サンプルのリポジトリの例を使用します。
このリポジトリをダウンロードします。
ダウンロードは、リポジトリのトップページ「https://github.com/m5stack/M5-ProductExampleCodes」を表示して「Download ZIP」をクリックします。
ダウンロードできたら展開して、「Hat/ENVII_HAT/Arduino/ENVII_HAT/
ENVII_HAT.ino」をArduino IDEで開きます。
このサンプルは、気圧センサBMP280の制御にAdafruit_BMP280を使用しているので、ライブラリマネージャからインストールしておきます。
Arduino IDEのメニューから[ツール] > [ライブラリを管理...]を選択してライブラリマネージャを開き、右上のフィルターに「Adafruit_BMP280」を入力します。
「Adafruit BMP280 Library by Adafruit」をインストールします。
[インストール]をクリック後、依存ラインラリも含めてインストールするかどうか聞かれます。[Install all]を選択します。
以下は、ENVII_HAT.inoを以下のコードに置き換えます。こちらは、元のコードから磁界センサー読み取りの処理を削除し、obnizにデータを送信する機能を追加しています。
また、今回もobnizクラウドに接続したらLEDが点灯するコードを追加しています。
/*
note: need add library Adafruit_BMP280 from library manage
Github: https://github.com/adafruit/Adafruit_BMP280_Library
*/
#include <M5StickC.h>
#include "SHT3X.h"
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include <obniz.h>
#define LED_IO 10
SHT3X sht3x;
Adafruit_BMP280 bme;
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;
bool onlineFlg = false;
void onEvent(os_event_t event, uint8_t* data, uint16_t length) {
switch (event) {
case PLUGIN_EVENT_NETWORK_CLOUD_CONNECTED:
Serial.println("cloud Connected");
onlineFlg = true;
break;
case PLUGIN_EVENT_NETWORK_CLOUD_DISCONNECTED:
Serial.println("cloud Disconnected");
onlineFlg = false;
break;
case PLUGIN_EVENT_NETWORK_HARDWARE_CONNECTED:
case PLUGIN_EVENT_NETWORK_HARDWARE_DISCONNECTED:
case PLUGIN_EVENT_NETWORK_WIFI_SCANNING:
case PLUGIN_EVENT_NETWORK_WIFI_NOTFOUND:
case PLUGIN_EVENT_NETWORK_WIFI_CONNECTING:
case PLUGIN_EVENT_NETWORK_WIFI_SOFTAP_CONNECTED:
case PLUGIN_EVENT_NETWORK_WIFI_FAIL:
case PLUGIN_EVENT_FAIL:
case PLUGIN_EVENT_OTA_START:
case PLUGIN_EVENT_OTA_END:
case PLUGIN_EVENT_OTA_ERROR:
case PLUGIN_EVENT_INITIALIZED:
break;
}
}
void setup() {
obniz.onEvent(onEvent);
obniz.start(NULL);
// M5Stick-CはI2C通信のSDAにG0、SCLにG26を使用する
obniz.pinReserve(LED_IO);
pinMode(LED_IO, OUTPUT);
obniz.pinReserve(0);
obniz.pinReserve(26);
// put your setup code here, to run once:
M5.begin();
Wire.begin(0,26);
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 0, 2);
M5.Lcd.println("ENV TEST");
if (!bme.begin(0x76)){
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
}
void loop() {
// obniz Cloudに接続したらLEDを点灯
digitalWrite(LED_IO, !onlineFlg);
// put your main code here, to run repeatedly:
if(sht3x.get()==0){
tmp = sht3x.cTemp;
hum = sht3x.humidity;
}
M5.Lcd.setCursor(0, 20, 2);
M5.Lcd.printf("Temp: %2.1f Humi: %2.0f", tmp, hum);
float pressure = bme.readPressure();
M5.Lcd.setCursor(0, 40, 2);
M5.Lcd.printf("pressure: %2.1f", pressure);
delay(100);
// 気温、湿度、気圧をobnizクラウドに送信
char message[128];
sprintf(
message,
"{\"temperature\": %f, \"humidity\": %f, \"pressure\": %f}",
tmp, hum, pressure
);
Serial.println(message);
obniz.commandSend((uint8_t *)message, strlen(message));
if (!bme.begin(0x76)){
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
}
こちらのコードをM5Stick-Cに書き込むと以下のように、LCDに気温、湿度、気圧が表示され、obnizクラウドにつながるとLEDが点灯します。
シリアルモニタを開くと以下のように、obnizクラウドに送信する環境データを含むJSONテキストを確認できます。
HTMLのコードは以下、受け取ったJSON形式のデータを表示しています。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>obnizOS on M5StickC</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://unpkg.com/obniz/obniz.js"></script>
</head>
</head>
<body>
<div id="obniz-debug"></div>
<div>
<dl>
<dt>気温:</dt><dd id="temperature"></dd>
<dt>湿度:</dt><dd id="humidity"></dd>
<dt>気圧:</dt><dd id="pressure"></dd>
</dl>
</div>
<script>
let obniz = new Obniz('9602-7560');
obniz.onconnect = async function () {
obniz.plugin.onreceive = data => {
let str = "";
for (const dt of data) {
str += String.fromCharCode(dt);
}
console.log(str);
const envData = JSON.parse(str);
$('#temperature').text(envData.temperature);
$('#humidity').text(envData.humidity);
$('#pressure').text(envData.pressure);
}
}
</script>
</body>
</html>
obniz開発コンソールの左のメニューから[HTML プログラム]を開きます。
上記のコードを貼り付け、[実行]します。
しばらく待つとonlineとなり受け取った気温、湿度、気圧が表示されます。
まとめ
以上で、onbizOS プラグインの開発について一通り試すことができたと思います。
Arduino IDE側でobnizOSを呼び出す手順についても基本的なところは抑えられたのではないかと思います。
この記事で見てきたように、一度セットアップしてしまえば、Arduino IDEで自由に開発が可能になりパーツをより楽に制御できるようになります。
例えば、ENV HAT Ⅱに搭載されているBME280についてはobniz.jsにパーツがありますし、SHT30についてはもおそらくSHT20またはSHT31が流用できるのではないかと思いますが、このあたりはパーツの知識がないと流用できるのかどうかの判断は難しいのではないかと思います。
また、プラグインを利用する場合もobnizの良さである遠隔からのアップデートはサポートされますし、使わない理由がない気もしてきてしまいます。
プラグインを利用すると、パーツの知識やI2CやSPI通信に詳しくなくても今回のように公式サンプルでまずは確認できるので、obnizの問題かどうかの切り分けもしやすく楽なのではないかと思います。
次回、私の記事は「ESP32とobnizOSで作るIoTツールDIY集」で作成したM5StackにobnizOSを入れて作ったアラームをobnizプラグインに置き換えた例を紹介したいと思います。お楽しみに!
この記事が気に入ったらサポートをしてみませんか?