Arduinoで無線通信を行うにはWi-FiモジュールやXbeeモジュール等無線通信モジュールをつなぎます。
 これが意外と高いのですが、Espressif Systems のESP32 はとても低価格で且つ機能が豊富です。
 開発ボードを使えば、それ単体でArduinoと同等以上のことができ、Wi-FiとBluetooth 通信が可能になります。
 Espressif の開発ボードESP32-DevKitC を入手していろいろと試してみました。

Espressif Systems 社

 Espressif Systems乐鑫科技)は2008年設立の中国の企業で、2019年に上海証券取引所の新興/ハイテク企業向け市場スター・マーケット(STAR、科創板)に上場しました。
 STARマーケットは2019年7月22日開設の新市場でEspressifはその第一陣上場25社の中の一社です。
 それまで主に米国メーカーが供給していたWi-fi通信等の半導体を低価格で供給するようになりました(外部記事)。
 市場に流通している多くのWi-Fi機器にEspressifの通信チップが使われていると思われます。 
 自前の工場は持たないファブレス企業で、TMSC等で製造しているようです。

ESP32-DevKitC

 ESP32のチップ、モジュール基板の状態では素人には取り扱いが難しいので、USBでつなぐとすぐに使える状態にしてくれている開発ボードを使います。
 開発ボードも多数種類がありますが、Espressif製のESP32-DevKitCを使いました。

モジュールの種類

 ESP32-DevKitC開発ボードに搭載されているモジュールの種類によって何種類かバージョンがあります。

  • PSRAMの有無:カメラ等の大容量のデータを扱うときはあった方が良いかも。
  • アンテナの種類:PCBアンテナはモジュール組み込みのアンテナでIPEXアンテナは外付けのアンテナを別に用意する必要があります。
  • コア:シングルコアかデュアルコアか。
モジュールPSRAMアンテナコア技適
(2021.1時点)
ESP32-WROOM-32E無しPCBdual
ESP32-WROOM-32UE無しIPEXdual×
ESP32-WROOM-32D無しPCBdual
ESP32-WROOM-32U無しIPEXdual
ESP32-SOLO-1無しPCBsingle
ESP32-WROVER-E8MBPCBdual
ESP32-WROVER-IE8MBIPEXdual


脆弱性の問題

 EspressifはモジュールのうちESP32-WROOM-32U/D はクローズし後継のESP32-WROOM-32E/UE にアップグレードするよう促しています。
 これはESP32チップにハッキング可能な脆弱性が見つかり、対策を施した製品へと転換したためです。
 この脆弱性はハッカーがESP32に物理的にアクセスすることが必要で、ネットからの攻撃だけではハッキングできません。 しかし流通過程で悪意のある業者がハッキングを仕掛けたり、公共の場にあるWiFi機器にハッキングをかけられたりする危険性があります。
 とは言え、個人で遊んでいる分には問題が起きる事はないと思うので、旧タイプを使っても良いでしょう(私の手元にあるものも旧タイプ)。

技適

 日本国内でW-Fi、Bluetooth 等の無線通信を行うには技術適合証明(技適)を取得している必要があります。
 ESP32 の製品の中には技適が取られていないものもあり、これらの製品を入手して日本国内でWi-Fi、Bluetooth機能を使うことは違法になります(但し届け出をすることで短期間の実験に使用することが認められる特例制度があります)。
 Espressif製のESP32-DevKitC搭載のモジュールは2021年1月の時点で私が確認した限りESP32-WROOM-32UE以外は技適が取られていました。
 しかし製品ページの写真を見ると技適マークの入っていない製品もあります。 ESP32-WROOM-32E、ESP32-WROVER-E/IEは2020年に技適を取得していますので取得前の製品の写真が掲載されていると思われます。場合によっては購入しても刻印の無い取得前の在庫が届く可能性もあります。
 他の開発ボード(ESP-32CAM等)には技適が取られていないモジュールが搭載されているものもあるので注意が必要です。
 見分け方は製品に技適マークが刻印されているのでわかります。又は型式等が分かっていれば総務省のHPから検索することができます。

入手

 国内では秋月電子やマルツオンライン、Amazon等で¥1,300程で入手することができます。
 AliExpressではESP32-WROOM-32D/U搭載タイプであれば¥400程で、その他のタイプは2021年1月時点では¥1,200程で購入できます。

 ESP32-WROOM-32Dが搭載されたESP32-DevKitC-32DをAliExpressで購入しました。
 中国から購入した製品では良くある事ですが、ピンヘッダがぐにゃぐにゃに曲がってやってきました。

広告

開発環境の構築

 開発環境の構築方法は検索すればあちこちに情報があるので今更ですが、私の環境(desktop PC + Windows10 Home)で行った作業を記します。

 Arduino IDEを最新のバージョンにしておきます。 少なくともArduino IDE 1.8 以降が必要です。

  • Arduino IDEを起動し、『ファイル』⇒『環境設定』で環境設定のウィンドウを開きます。
  • [追加のボードマネージャのURL: ]の欄にEspressifのGitHubに記載の”Stable release link:”のURLをコピーして貼り付け『OK』をクリックします。
  • 『ツール』⇒『ボード』⇒『ボードマネージャー』でボードマネージャーのウィンドウを開きます。
  • 検索欄に ”esp32” と入力すると ”esp32 by Espressif Systems” が見つかります。ここにマウスポインタを当てると[インストール]のボタンが出ますのでクリックしてインストールします。暫くするとインストールが完了しますので[閉じる]ボタンを押します。
  • 『ツール』⇒『ボード』と選択していくと『ESP32 Arduino』の項目ができていますので、そこから『ESP32 Dev Module』を選択します。
  • 『ツール』を選択すると”ボード:”ESP32 Dev Module” ”の項目ができており、その下に各種設定が出来ています。
  • シリアルポートの番号が変わっていると思うので、USB(マイクロUSB)でPC とESP32-DevKitCを接続し、赤のLEDが点灯し電源が入ったのを確認して、Arduino IDE から『ツール』⇒『シリアルポート』⇒『COM○』(○の数字は環境によって変わります)をクリックして✓を入れます。

これでPC側の設定は完了しました

配線方法

 良く使われている5列のブレッドボードではESP32-DevKitCはそのま刺すと配線を取り出す穴が片側の1列を除いて隠れてしまい使い勝手が悪くなります。
 他のブログ等ではブレッドボードを2つつなげる方法や、6列ブレッドボードを使う方法等が紹介されていますが、私が普段使っている精度の悪い中華製ブレッドボードとピンヘッダがぐにゃぐにゃになった開発ボードでは全てのピンをきれいに刺すことは難しいです。
 ですのでメス-オスのジャンパーワイヤーを使ってブレッドボードに信号線をつなぐことにしました。

広告

ピン配置

 ピン配置はこのリンク先に記載されています。利用可能なGPIOが19個(GPIO0, 1, 3, 6~11 は利用できない)等。

Lチカ

 定番のLチカをやってみました。 手順はArduino でLチカを行うのとほぼ同じです。

配線

 ブレッドボードにLEDと電流制限抵抗(220Ω)を載せ、次図のように配線しました。
 LEDと電流制限抵抗をGPIOとGNDの間に直列に接続するだけです。GPIOは0, 1, 3, 6~11以外はどれを使っても構いません。

スケッチ

 スケッチはArduino でLチカをするのと同じです。 GPIO の番号(一行目の”int led = 4;”の数字)だけ接続したGPIOの番号に合わせてスケッチします。

int led = 4;
void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);
  delay(1000);
  digitalWrite(led, LOW);
  delay(1000);
}

書き込み

 PCとESP32-DevKitCを接続し、 をクリックして書き込みます。LEDがチカチカ点滅しました。

Wi-Fi

 せっかくWi-Fi機能があるのでWi-Fiを試してみました。
 Wi-Fi環境があって、アクセスポイントのSSIDとパスワードが分かっている必要があります。
 対応する規格は2.4GHz帯のIEEE 802.11b/g/nです。

スケッチ

 サンプルスケッチを使って試してみました。

 Arduino IDEから『ファイル』⇒『スケッチ例』⇒『WiFi』(”ESP32 Dev Module 用のスケッチ例”の下の方にあります)⇒『SimpleWiFiServer』を開きます。

 30行目”yourssid”にアクセスポイントのSSIDを、31行目 “yourpasswd” をパスワードをに書き換えます。

 38行目、105行目、108行目の”5”を使用するGPIOの番号に書き換えます。

実行

 『ツール』⇒『シリアルモニタ』(Ctrl+Shift+M)でシリアルモニタを起動しておきます。

 配線は上で作成したLED用の配線をそのまま使いました。

 PCとESP32-DevKitCを接続し、をクリックして書き込みます。
 上手くいくとシリアルモニタにアクセスポイントの名前とIPアドレスが表示されます。

 同じアクセスポイントにつながっているPC(スマホでもタブレットでも)のブラウザーから表示されたIPアドレス(192.168.xxx.yyy : xxx , yyy は環境によって変わる)にアクセスします。
  http://192.168.xxx.yyy/H  ⇒ LED 点灯する。
  http://192.168.xxx.yyy/L  ⇒ LED 消灯する。

 スマートフォン(Android)から操作してみました。

Bluetooth

 Bluetoothも試してみました。

スケッチ

 サンプルスケッチを使って試してみました。

 Arduino IDEから『ファイル』⇒『スケッチ例』⇒『BluetoothSerial』⇒『SerialToSerialBT』を開きます。
 サンプルスケッチはそのまま改変せずに使用しました。

書き込み

 PCとESP32-DevKitCを接続し、シリアルモニタを起動しておいてからをクリックして書き込みます。
 書き込みに成功するとシリアルモニタの最後に

The device started, now you can pair it with bluetooth!

とメッセージが表示されペアリング可能な状態になります。

ペアリング

 今回はWindows10 のPC からペアリングしました(当然PCにBluetooth機能が内臓されているかアダプターが取り付けられている必要があります)。

 Windows 画面の右下のインジケーター領域から”Bluetoothデバイス”を選んでクリック。

 ”Bluetoothデバイスの追加(A)”を選択してクリック。

 ”設定”画面が開くので”Bluetoothとその他のデバイス”の項目の”+ Bluetoothまたはその他のデバイスを追加する”をクリック。

 ”デバイスを追加する”画面が開くので”Bluetooth”を選択してクリック。

 ”ESP32test”を選択してクリック。

 しばらくすると”デバイスの準備が整いました!”のメッセージが出るので”完了”をクリックして閉じます。

 ”設定”画面の”その他のデバイス”の項に”ESP32test ペアリング済み”と出ます。

接続

 Arduino IDEから『ツール』⇒『シリアルポート:”COM○”』⇒と選択していくと、シリアルポートが増えています。
 しかし2つ増えており、どちらにつなげばいいのか判断できませんでした。とりあえず両方とも試してみたところ片方(私の環境でCOM5)はエラー(送信しようとしたらフリーズした)になり、もう片方(COM4)でつながりました。

 ”Bluetooth設定”(”設定”画面”Bluetoothとその他のデバイス”項目の下方の”その他のBluetoothオプション”をクリックしたら開きます)のCOMポートタブを開いて見てみるとCOM4は方向が”発信”で名前が”ESP32test’ESP32SPP”、COM5が方向”着信”、名前”ESP32test”でした。
 知識不足で意味が分かりませんが、とりあえず”発信”側を選択すれば良いかと。(’21.2.2追記:COMポート番号を調べる方法を書きました。

シリアルモニタ

 このスケッチはBluetoothシリアルで受信すると、その内容をUSBシリアルに送信し、USBシリアルで受信するとBluetoothシリアルに送るというものです。
 しかしArduino IDEのシリアルモニタはどちらか一方しか見ることができません。
 ですので、別プロセスでもう一つArduino IDEを立ち上げ、シリアルモニタでUSB接続のシリアルポート(私の環境ではCOM6)を見ました。
 Arduino IDEを開いたまま、WindowsのArduino IDEのアイコンをダブルクリックすると新しいプロセスでArduino IDEが立ち上がります。”シリアルポート:”をUSB接続のシリアルポート(私の環境ではCOM6)に設定し、シリアルモニターを開きます。

送受信テスト

 Bluetooth(COM4)から送信すると、USB(COM6)に送信内容が出力されました。
 逆にUSB(COM6)から送信すると、Bluetooth(COM4)に送信内容が出力されました。

Lチカ

 Bluetooth SerialのコマンドでLEDを点灯させてみました。

スケッチ

 サンプルスケッチを次のように改変し、書き込みます。書き込みの際ポートを元(私の環境でCOM6)に戻すのを忘れないように。

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;
int led = 4;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
  pinMode(led, OUTPUT);
}

void loop() {
  if (SerialBT.available()) {
    char ledSW = SerialBT.read(); //"1" to turn on the LED, "0" to turn off the LED
    if (ledSW == '1'){
      digitalWrite(led, HIGH);
      SerialBT.write(ledSW);
    }
    if (ledSW == '0'){
      digitalWrite(led, LOW);
      SerialBT.write(ledSW);
    }
  }
  delay(20);
}
実行

 配線は上で作成したLED用の配線をそのまま使いました。
 モバイルバッテリーでESP32-DevKitCを駆動させ、Bluetoothのシリアルモニタ(私の環境でCOM4)から”1”を送るとLEDが点灯、”0”を送るとLEDが消灯しました。