第31回で紹介したESP32を使うと、WiFiによる通信を簡単に行うことができます。ESP32は上海のEspressifという会社が開発したマイコンであり、1つのチップ上にプロセッサの他、WiFiやBluetooth機能を加えたSoP(System on Chip)として実装されたものです。ESP32と呼ばれているものにはいくつかバージョンがあり、ESP-WROOM-02が主なものです。これはESP8266というものの後継機にあたり、700円くらいで買うことができます。ESP-WROOM-02単体を動かすのは、電源周りやピンアウトなどなかなか手間がかかるので、抵抗やコンデンサが載った開発ボードを使うのが手軽です。第31回で紹介した通り、NodeMCU-32SとESP32-DevKitCの二種類(二規格)が主流になっています。後者のほうが改良版といえるようです。後述の通り、スケッチの書き込みが少し楽になっています。いずれも1000円くらいから買えます。

 ESP32(ESP-WROOM-02)の性能諸元については第31回で示していますが、WiFi・Bluetoothを除いても、処理能力・メモリともにArduino UNOを大きく上回っており(アナログ入力も、Arduino UNOの10ビットに対し、12ビットと4倍も分解能が高いです)、価格も安いことから、いろいろなプロジェクトに役に立ちます。

 

 

左がNodeMCU-32S、右がESP32-DevKitC。後者が若干大きい。

 

 

裏面。左はESP32 DEKITV1と書かれています。

 

ESP32開発ボードの利用:Arduino IDEによるスケッチの書き込み

 まず、これらのESP32開発ボードにArduino IDEからスケッチを書き込む方法を説明します。ESP32はArduinoとある程度互換性があり、Arduino IDEからArduino言語(C++とほぼ同じ)により動かすことができ、多くのライブラリも互換性があります。例えば過去の回で説明したRTC、ADS1115、SDカードシールド、その他ほぼ全て同じように使うことができます。一方、プロセッサの種類が異なるため、プロセッサそのものに直接関わる部分、例えばスリープ関係などは互換性がありません(これはArduinoシリーズの中でも、AVR系のUno・Mega・Pro MiniなどとARM系のDueで互換性がないのと同じです)。

 

 まずはArduino IDEの設定方法です。いろいろなウェブサイトにやり方が書いてあるのですが、いくかのサイトでは古い情報が載っており、うまくいきません。ここに書くやり方も古くなる可能性はあるのですが、2020/10/1現在動いていることを確認しています(Arduino IDE 1.8.13)。まず、「ファイル」→「環境設定」より「追加のボードマネージャのURL」のテキストボックスに以下のURLを書き込みます(多くのウェブサイトでコピー&ペーストせよ、と書いてありますが、私の持っているどのPCでもこのテキストボックスではペースト機能が動作しませんでした:手で打ち込む必要があります)。

https://dl.espressif.com/dl/package_esp32_index.json

この後、「ツール」→「ボード」→「ボードマネージャ」で現れるウィンドウの検索フォームに「ESP32」と入力すると現れるものを「インストール」します。これで、「ボード」から「ESP32 Dev Module」を選べるようになります。これとは別に「NodeMCU-32S」も選べるのですが、ここまで試したところ、どちらを選んでも同じスケッチが同じように動きました。ここでは「ESP32 Dev Module」を選ぶものとします。

 

 ESP32開発ボードはmicro USB Type-BでPCにつなぎます。PCにつなぎ、ボードとして上記の通り「ESP32 Dev Module」を選び、シリアルポートを選択してやると、後はArduinoと同じように使えます。つまり、スケッチをコンパイルして書き込みます。この際、注意が必要なのですが、ESP32-DevKitCはArduinoと同じようにArduino IDE上の書き込みアイコンをクリックするだけでこのままスケッチが書き込まれるのですが、NodeMCU-S32については以下の手順が必要になります。

① ボード上のIO0ボタンを押し続け(まだ離さない)、後からENボタンを押し、ENボタンを離す

② スケッチの転送を始める。Arduino IDEの下部のメッセージ欄で書き込みが始まったらすぐにIO0ボタンを離す

③ 書き込みが始まったらENボタンを押してリセットする(押さなくてもリセットされる場合もある)

これを行わないと書き込みエラーになります。

 

 ここまでの回で紹介してきたことはスリープ関係を除いてほぼEPS32でもできるので、試してみてください。ESP32のスリープについては第31回にサンプルスケッチがあります。ちなみにArduinoシリーズにはボードにリセットボタンが1つ付いていることが多いですが、ESP32開発ボードでは上記2つのボタンのうちENがリセットボタンです。

 

WiFiを使ってデータを転送:Ambientの利用

 Ambientというのはクラウドでのデータ保存・図化サービスで、アカウントを無料で作って利用することができます。他にも同様のサービスがいくつかありますが、Ambientが最も有名なようです。その使い方自体は、Ambientのウェブサイトそのものが最も明瞭に説明しています。

https://ambidata.io/docs/gettingstarted/

 Ambientに値を渡すのにライブラリが必要になります。いくつか異なるものがあるようですが、ここではこれを使います。ESP8266とありますが、ESP32で使えます。

https://github.com/AmbientDataInc/Ambient_ESP8266_lib

Arduinoを使う場合、第7回で説明したように、GitHubからライブラリをZIPファイルとしてダウンロードし、解答してArduinoのlibrariesフォルダに入れるという作業をしました。ここではESP32用ライブラリとして別の場所に保存するため、以下のようにします。Arduino IDEの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」として現れるウィンドウの検索欄で、「Ambient」とすると上記のものが現れ、「インストール」とすれば使えるようになります。

 上記のライブラリのフォルダ中(場所は、Windows内で「Ambient.h」を検索して見つけて下さい)には例えば第22回で紹介したセンサーBME280で取得した温度・気圧・湿度をクラウドに送り図化するスケッチ例があります。ほぼ同じスケッチになりますが、BMP280(湿度が計れない)のほうを使って30分に一度、温度と気圧をAmbientに送るもの接続図・写真とともに下に示します。

 

 

#include <WiFi.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP280.h>

#include "Ambient.h"

 

WiFiClient client;

Ambient ambient;

 

Adafruit_BMP280 bmp;

 

const char* ssid = "XXXXXXXXXXXXXX"; // ここにはWiFiルーターのSSIDを書き込む

const char* password = "YYYYYYYYYYYYYY"; // ここにはWiFiルーターの接続パスワードを書き込む

 

unsigned int channelId = 2XXX8; // AmbientのチャネルID

const char* writeKey = "aaaaaaaaaaaaaa"; // Ambientのアカウントから得られるライトキー

 

void setup()

{

    Serial.begin(115200);

    delay(10);

    Serial.println("Start");

    WiFi.begin(ssid, password);  //  Wi-Fi APに接続

    while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち

        delay(100);

    }

 

    Serial.print("WiFi connected\r\nIP address: ");

    Serial.println(WiFi.localIP());

 

    ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化

 

    /* ----- Starting up BME280 ----- */

    if (!bmp.begin()) { 

      Serial.println(F("Could not find BMP280!"));

      while (1);

    }

}

 

void loop()

{

    Serial.println("Writing");

    ambient.set(1, bmp.readTemperature()); // 温度をデータ1にセット

    ambient.set(2, bmp.readPressure()); // 湿度をデータ2にセット

    ambient.send(); // データをAmbientに送信

    delay(1800 * 1000);

}

 

 

 

 

接続について数点:

・ESP32はGPIO(ピン)のうち22番がI2CのSCL、21番がSDAです。

・上の模式図のボードと写真のボードでピン配置が異なることに気が付くと思いますが、製品によってピンアウトが微妙に異なるので注意してください。

・ESP32 DevKitCはボードが大きく、通常のブレッドボードに挿すとジャンパーワイヤーを指す穴が残りません。上の写真ではブレッドボードを2つ並べて片側ずつ使っています

・BMP280(BME280)の説明については第22回参照。SDOをVCC(3.3V)につなぐかGNDにつなぐかでI2Cアドレスを変えられます。VCCのほうに繋いでおけばAdafruitのライブラリがそのまま使えます。

 

 このようにしてスケッチを走らせると(スケッチ書き込み後、なぜか1回立ち上げても、プログラムは走るのですがWiFiにつながらないことがありました。ENボタンでリセットするとつながりました。うまく行かないときはリセットしてみてください)、下図のようにAmbientのデータ系列1に温度、データ系列2に圧力が転送され、グラフを設定することで図化できます。データはCSVとしてダウンロードもできます。ウェブブラウザ上でのグラフの表示の仕方は非常に直感的なので、ここでは説明しません。

 

 

 

BMP280(BME280)はデモとしてはベタな例ですが、土質試験室ではひずみゲージセンサーの値を読んで転送したいことのほうが多い(例えば長期圧密試験の変位など)かと思います。そのような例を応用編で紹介していきたいと思います。