はじめに
この記事は新人プログラマによる奮闘記です。記事もOpenBlocksも初めて触ります。よって不慣れなところがありますが、暖かい目で見てください。
だらだらと長い文章になっています。手順を1から10まで書いているので適宜読み飛ばして下さい。
この記事は3ページ構成となっております。
今回はシリアル通信によりセンサデータを取得し、取得したセンサデータをOpenBlocks IoTを通してAWSに接続し、可視化をしていきます。
前回より少し高度な内容するため、プログラミングを行いますが、同じ構成の使いまわし(主にAWS)が多数あるためそちらも合わせてご覧いただけると幸いです。
使用する言語はArduinoで使用される、所謂「Arduino言語」と、Node-Redの言語である「Javascript」を少しづつ扱っていきます。因みに新人はどちらも扱ったことのない言語です。
作成するシステム概略図はこちら
ではまずはシリアル通信から始めてみます。
センサ⇒(シリアル通信)⇒ESP-WRoom-02
今回は2つのCO2センサを比較してみようと思います。使用するセンサはこちら
SenseAir K-30 CO2センサ
フィガロ技研 CDM7160 CO2センサ
どちらも高精度CO2センサとして販売されているのですが、メーカーによる違いがどこまで出るか楽しみです。見た目は大きく異なるのですが果たして…
これらの値をシリアル通信で取得するのですが、直接OpenBlocksに渡すのではなくOpenBlocksからリクエストを投げてセンサから値を返してもらう形式にしようと思います。
直接OpenBlocksとセンサをシリアル通信すると、シリアルポートに限りがあるため多数のセンサのIoTゲートウェイとしての役割が薄れてしまいます。
しかし、OpenBlocksがリクエストを投げる方式にすることで、多くのセンサのゲートウェイとして存分に機能してくれると期待しています。
さて、OpenBlocksがリクエストを投げるといっても、センサのみだと値を渡せないので一つモジュールを追加します。
それがこちら、スイッチサイエンス ESP-WROOM-02 Wi-Fiモジュールです。
このモジュール、名前の通りWiFiモジュールなのですがArduinoマイコンしても使える優れもので、Wi-FiもAPモード(親機モード)STAモード(子機モード)として使えます。
WRoom-02とセンサをシリアル通信で接続し、WRoom-02を子機モードでWebサーバとして待機させ、OpenBlocksからhttpリクエストをWebサーバに送り、Webサーバがシリアル通信で取得したセンサ値をレスポンスを返す、という仕組みです。
CO2センサとWRoom-02を繋ぐシリアル通信は調歩同期式のUART通信、通信プロトコルにはModbusを使用します。
今回の比較ではUART通信よりもI2C通信の方が適していますが、CO2センサK-30がI2Cに対応させるのにひと手間かかりそうだったため、UART通信で実装しました。
UART通信の優位性としては配線が少ない分省スペースでできますし、WRoom-02とセンサを1対1で扱うのでセンサごとの配置の自由度が高くなります。
シリアル通信で気を付けることは、センサによって信号の電圧が異なるため、場合に応じてレベル変換を行います。
各センサの配線図を下記に示します。(ドキュメント)
上記のように接続したら、次はセンサから値を取得するプログラムをWRoom-02に書き込んでいきます。
今回シリアル通信のプログラムを一から作成するにはとんでもない労力(学習コスト)が発生するのでいい感じのプログラムが落っこちてないか探したところ…ありました。それもK-30公式のプログラムを発掘しました。
それがこちらのサイトのドキュメント一覧にある「Arduino UART Sample Code (Zip)」です。
その名の通り、K-30がArduinoでUART通信するためのサンプルコードです。これが欲しかった。
しかもこのコード、Modbusの規格が同じなためか、CDM-7160でもそのまま使えます。
こちらのコード、ほぼそのままで使えるのですが、以下2点だけ修正を加えます。
SoftwareSerial K_30_Serial(12,13); //Sets up a virtual serial port
//Using pin 12 for Rx and pin 13 for Tx
// ↓↓
SoftwareSerial K_30_Serial(4,5); //4,5は任意のポートだが、上記配線をした場合はこの設定(GPIOピン4,5)
void setup(){
Serial.begin(9600); //Opens the main serial port to communicate with the computer
K_30_Serial.begin(9600); //Opens the virtual serial port with a baud of 9600
}
// ↓↓
void setup(){
Serial.begin(115200); // WRoom-02の伝達速度は115200bps
K_30_Serial.begin(9600);
}
この二点を修正したらこのコードをWRoom-02に転送します。
コードの転送に必要なものはArduino IDEとシリアル変換ケーブル3.3Vです。
Arduino IDEはArduinoの開発環境で、フリーでコンパイル、ダウンロード、実行の一連の動作ができるソフトウェアです。こちらをダウンロードし、コードのコンパイルと送信を行います。
ただし、WRoom-02ではESP8266というモジュールをベースにしており、そのライブラリに則って実行することで機能を発揮するのでArduino IDEに初期設定としてライブラリのインストールをする必要があります。
Arduino IDEのダウンロード先はこちら(Windows)
ダウンロードしたZipファイルを展開し、arduino.exeを起動します。
[ファイル]の[環境設定]を選択
[追加のボードマネージャのURL]に下記URLをコピペします。
http://arduino.esp8266.com/stable/package_esp8266com_index.json
okを押したら[ツール]の[ボード][ボードマネージャ]を選択し、検索欄に「esp8266」と入力
検索結果でesp8266 by ESP8266 Communityが表示されたら、バージョンを2.4.1にしてインストールをクリック(2.4.1では動作確認済みです。その他は未確認)
インストール終了後[ツール]の[ボード]でGeneric ESP8266 Moduleを選択。
[ツール]の各項目を以下のように変更(参考)
マイコンボード | Generic ESP8266 Module |
Flash Mode | QIO |
Flash Frequency | 80MHz |
Upload Using | Serial |
CPU Frequency | 80MHz |
Flash Size | 4M (1M SPIFFS) |
Debug port | Disabled |
Debug Level | None |
Reset Method | nodemcu |
Upload Speed | 115200 |
以上で初期設定完了です。
設定が完了したので[ファイル]の[開く]から先ほど手を加えたコードを選択し、開きます。
左上チェックマークの検証をクリックし、エラーがでなければ書き込み準備完了です。
WRoom-02のピン配置に従ってシリアル変換ケーブルを配線します。
今回使用したシリアル通信ケーブルはこちら。3.3V電圧のシリアルケーブルです。
配線については、入力ピン、GNDピン、TxD、RxD、IO0の5つを配線します。ファームウェア書き込み時はIO0をGNDに落とします。気を付けるのはシリアルケーブル側のTxDはWRoom-02側のRxDに、シリアルケーブル側のRxDはWRoom-02側のTxDにクロスさせるように配線することです。UART通信の特徴ですね。(1敗)
配線が完了したらArduino IDEから書き込みをします。うまくいかない場合は配線を見直してみてください。
書き込み完了後、右上のシリアルモニタをクリックし、右下の転送速度を115200にするとCO2センサの値が以下のように出力されるはずです。
これでセンサ、WRoom-02間のシリアル通信は完了です。
次はWRoom-02によるWebサーバ化です。