ESP-WROOM-32 (ESP32) 開発ボードでネット経由Lチカ

自作macOS PCの電源をApple HomeKitから投入することを目的に、EPS-WROOM-32 (ESP32)というチップを組み込むことにしました。そのために、ESP32の開発用モジュールを入手してArduino IDEでLEDを点滅(Lチカ)させるプログラムを作りました。

Raspberry Pi Zero Wを置き換え

前回はRaspberry Pi Zero Wを自作macOS PCに組み込んで、これでHomeBridgeを動かしてSiriからPCの電源を入れる仕組みを作りました。ちゃんと動いていたのですが、いくつか問題点もありました。

まず、Pi Zeroは省電力で良いのですが、HomeBridgeを動かすにはちょっと力不足なところがありました。HomeBridgeを再起動するのに80秒くらいかかります。HomeBridgeのプラグインを色々試したり、その設定を調整する時に再起動が必要なので、時間がかかって少し大変でした。Raspberry Pi 4ならば再起動は20秒くらいで可能なので、HomeBridgeサーバはそちらに移行しようと考えました。

またトラブルのあった時の対応が面倒でした。実は、SDカードのファイルシステムに問題が発生して起動しなくなってしまったのですが、PCケースを分解してPi Zeroを取り出して、ディスプレイに接続して初めてトラブル原因が判明しました。外からシリアル接続してコントロールできるタイプの組み込みコンピュータの方が便利だと思いました。

ESP32開発用モジュール

Raspberry Pi Zeroよりもっとシンプルな組み込みコンピュータの選択肢は色々ありそうですが、今回は、ESP-WROOM-32 (ESP32)というチップを使うことにしました。Espressif Systemsという会社の製品でWiFiとBluetoothが搭載されてます。IoT機器WiFiのMACアドレスを見るとこの会社のチップが搭載されていることも多いです。ESP32の仕様は以下の通りです。

  • 本体サイズ 縦25.5mm × 横18mm
  • CPU Tensilica Xtensa Dual-Core LX6 @ 160 / 240Mhz
  • RAM 520 KB
  • フラッシュメモリ 64MB
  • Wi-Fi 802.11 b/g/n/d/e/i/k/r
  • Bluetooth Bluetooth v4.2 BR/EDR and BLE specification

EPS32だけでも動くのですが、これにUSBコネクター、USBシリアル変換器、USB電源5Vを3.3Vに変換する回路、リセットスイッチなどを追加して、気軽に使えるようにした開発用モジュールがいくつか作られています。スイッチサイエンスでは2,200円くらいで売ってます。ArduinoのIDEを使ってプログラム開発できるようです。

これを使っても良かったのですが、例によってAliExpressを見ていたら、同じような開発用モジュールが何種類か見つかりました。どれもArduino IDEが使えると書いてあります。何より値段が格安だったので、こちらを試してみることにしました。400円+送料150円くらいだったです。(今チェックしたら送料が320円くらいになってました)安いので色々な場面で気軽に使えると思いました。


AliExpress: ESP32開発用モジュール

到着したモジュールを見たところ、冒頭の写真のように日本の技適のマークが入っています。これも安心なところかと思いました。

Arduino IDEを準備する

もしArduinoを使ったことがないのでしたら、Arduino IDEをダウンロードしてインストールします。すでに使っていて、デフォルトの~/Documents/Arduinoに開発フォルダを作ってある場合は、以下のように進めます。まずは、ESP32用Arduinoツールが開発されているgithubに行き、

から一式をzipでダウンロードします。次に、

~/Documents/Arduino/hardware/espressif/esp32/

というフォルダを作って、その中に全部入れます。

Windowsの場合は、get.exeを動かすらしいです。でもmacOSなので.exeは動きませんので、python版のインストーラを試しました。

cd ~/Documents/Arduino/hardware/espressif/esp32/
cd tools
./get.py

これで、以下のようなメッセージで処理が進んだので、インストールできたようです。

./get.py
System: Darwin, Bits: 64, Info: Darwin-20.3.0-x86_64-i386-64bit
Platform: x86_64-apple-darwin
Downloading xtensa-esp32-elf-macos-1.22.0-97-gc752ad5-5.2.0.tar.gz ...
Done
Extracting xtensa-esp32-elf-macos-1.22.0-97-gc752ad5-5.2.0.tar.gz ...
Downloading esptool-3.0.0.2-macos.tar.gz ...
Done
Extracting esptool-3.0.0.2-macos.tar.gz ...
Downloading mkspiffs-0.2.3-arduino-esp32-osx.tar.gz ...
Done
Extracting mkspiffs-0.2.3-arduino-esp32-osx.tar.gz ...
Renaming mkspiffs-0.2.3-arduino-esp32-osx to mkspiffs ...
Platform Tools Installed

ちなみに、こちらを見たらもう少しスマートな手順が書いてありました。ターミナルから以下のようにタイプすれば良いようです。

mkdir -p ~/Documents/Arduino/hardware/espressif && \
cd ~/Documents/Arduino/hardware/espressif && \
git clone https://github.com/espressif/arduino-esp32.git esp32 --depth 1 && \
cd esp32 && \
git submodule update --init --recursive --depth 1 && \
cd tools && \
python get.py 

この状態でArduino IDEを起動したところ、選択肢が多数用意されていました。どれもESP32用のモジュールのようです。スイッチサイエンスのページにも書いてありましたが、大体は一番上のESP21 Dev Moduleで良いようです。動作が不安定な場合は他を試しても良いかもしれません。

USBシリアルドライバは不要

この基板には、USB-シリアル変換のために、Silicon Labs社のCP2102というチップが搭載されています。これ用のドライバソフトがWindows用、macOS用、Linux用と配布されていて、通常はそれをインストールする必要があるようです。ただ、Big Surならば、Silocon Labsのusbドライバは不要で、macOS標準のドライバーで機能しました。

Arduino IDEの、ツール、シリアルポートとメニューを辿ると、その中に、

cu.usbserial-0001

という項目が見つかりました。最後の数字は環境によっては異なるかもしれません。これを選んでおけば、Arduino IDEのプログラムをESP32にダウンロードできますし、ツールメニューの中のシリアルモニターでESP32からのシリアル通信を確認することができます。

USB接続が不調な場合は、使用するUSBケーブルに注意したいです。実は当初、macOS標準ドライバと、Silicon Labs社のドライバのどちらを試してもESP32がArduino IDEから認識できませんでした。ドライバはちゃんとインストールできているのですが、USB接続が検出されないようでした。原因はケーブルでした。適当に手近に落ちていたケーブルを2-3本入れ替え使ったところ、それらが全部充電専用のUSBケーブルでした。信号線が接続されていないので、使えないのは当たり前でした。

Lチカする

Arduino IDEでプログラムが開発できることを確認するために、簡単なLED点滅プログラムを書いて確認しました。13番ポートに接続したLEDが1秒ごとに点灯点滅します。13番ピンはGNDの隣にあるので、後で半田付けなどしやすいかと思い、これを選びました。

int LED=13;
void setup() {
  pinMode(LED, OUTPUT);
} void loop() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); }

これをコンパイルしてESP32にダウンロードすることで、通常のArduinoと同じようにLED点滅させることができました。

Lチカサーバを作る

普通のArduinoと同じようにLチカできたので、次はESP32らしく、ネット経由でLEDを点滅させるプログラムを作ります。Arduinoには、WiFiを使うためのライブラリが用意されています。上で追加したESP32用ライブラリにも、同じAPIのライブラリがあるようです。なので、標準的なArduinoプログラミングで、ESP32のWiFiプログラムも書けるようです。以下の公式サイトに、ArduinoのWiFiライブラリを使用して、Webサーバを作るサンプルが公開されていました。

これを参考にして、ESP32アドレスのonoffというファイルをGETしようとすると、13番LEDが1秒だけ点灯するプログラムを書きました。以下に示します。後でフォトリレー経由でPCの電源スイッチに接続しようと考えているので、13番ピンの変数名はPOWERSWにしました。サーバなのでアドレスは固定アドレスにしてあります。接続状況などの情報はシリアル経由で適宜出力するので、Arduino IDEのシリアルモニタを動かしていれば確認できます。

//WiFi switch for ESP32 AliExpress board.
//accessing the web server, turns on and off the digital port
//uses ESP32 Dev Module

#include <WiFi.h>
const int POWERSW=13; //photo relay to power switch

//WiFi関係と固定アドレスなどの設定 const char SSID[] = "XXXXXXXXX"; const char PASSWORD[] = "XXXXXXXX"; WiFiServer server(80); IPAddress ip(192, 168, xxx, xxx); // for fixed IP Address IPAddress gateway(192,168, xxx, xxx); // IPAddress subnet(255, 255, 255, 0); // IPAddress DNS(192, 168, xxx, 1); //
//接続してきたクライアントのコマンドを取り込むバッファなどの用意 #define BUFFLEN 256 //length of the receive buffer char buff[BUFFLEN]; //buffer int count = 0; //counter for the buffer int command = 0; //0:N/A 1:one-sec on bool isBlankLine = false; //if the last line is empty, the end of request
//クライアントから受け取った1バイトをバッファに溜めてGETコマンドをチェックする
//リクエスト行が空行ならば、リクエストは終了と判断してisBlankLineに反映する //put received char in buffer and check the GET command and empty line void processReequest(char c) { if(c == '\r') return; //if the code is CR, ignore it if(c == '\n') { //if the code is NL, read the GET request buff[count]='\0'; //put null character at the end String buffS = buff; //convert to String //Serial.print("command is: "); //for debug //Serial.println(bufferS); //for degub if(buffS.startsWith("GET /onoff")) command = 1; isBlankLine = (count == 0); //and check if the line is empty count=0; } else { //if the code is not control code, record it isBlankLine = false; if(count >= (BUFFLEN - 1) ) count=0; //if almost overflow, reset the counter buff[count++]=c; //add char at the end of buffer } }
//最初に実行される関数 void setup() { int status = WL_IDLE_STATUS; pinMode(POWERSW, OUTPUT); Serial.begin(115200); // ESP standard speed 115200 while (!Serial) ; // wait for serial port to connect. WiFi.config(ip, gateway, subnet, DNS); // Set fixed IP address while (status != WL_CONNECTED) { Serial.print("\nAttempting to connect to SSID: "); Serial.print(SSID); WiFi.begin(SSID, PASSWORD); for (int i=0; i<15; i++) { //wait up to 15 sec to be connected delay(1000); status = WiFi.status(); Serial.print("."); if(status == WL_CONNECTED) break; } } server.begin(); //start the server Serial.print("\nHTTP server started at: "); Serial.println(WiFi.localIP()); }
//繰り返し呼び出される関数 void loop() { WiFiClient client = server.available(); if (client) { Serial.println("new client"); while(client.connected()) { if(client.available()) { char c = client.read(); Serial.write(c); processReequest(c); //if the line is blank, the request has ended. if(isBlankLine) {
//空行ならばリクエスト終了と判断して応答 // send a http response client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed client.println(); client.println(""); client.println(""); client.println("The switch will be on-off by GETting /onoff"); client.println(""); break; } } }
//クライアントがGET /onoffしていたらLEDを1秒点灯させる delay(1); client.stop(); Serial.println("client disconnected"); if(command == 1) { Serial.println("the command is onoff"); digitalWrite(POWERSW, HIGH); delay(1000); digitalWrite(POWERSW, LOW); command = 0; } } }

setup関数でWiFi接続を開始します。WiFi基地局への接続を試みた後、15秒間、1秒ごとに接続結果をチェックします。大体は4~5秒で接続します。15秒経っても接続が確立されない場合は、再度WiFi基地局への接続を試みます。接続できたらwebサーバのアドレスを表示します。

Attempting to connect to SSID: XXXXXXXX.....
HTTP server started at: 192.168.XXX.XXX

このアドレスにhttpアクセスして試します。例えばcurlコマンドなら以下のようにします。

% curl 192.168.xxx.xxx/onoff
<!DOCTYPE HTML>
<html>
The switch will be on-off by GETting /onoff
</html>

すると、上記のようにHTMLで応答があり、LEDが1秒間点灯します。

まとめ

ESP32の開発モジュールを安価に入手し、httpアクセスでLEDを点滅させるプログラムを書きました。次回は、これを自作macOS PCに組み込んで、電源スイッチと接続して、Siriにお願いしてMacの電源を入れられるようにします。

2件のコメント

  1. お疲れさまです。
    電子工作いいですね^^
    昔はいわゆるパーツ屋さんも札幌あったのですが、もうないですね。
     いまは、通販や(アリババとかだと汎用部品だとかなり安いみたいですね)、基板自体もプリンタで作るようですね(私の兄の趣味はそっちに行ったようです)
     M1になって、何年かしてきたら、こっちの趣味もゆっくりになるでしょうから、そういうのもいいかなぁと思います。

  2. スマートハウス関連は、設定面倒で、プログラミング、電子工作、DIYの要素もあって、逸般の誤家庭じゃないと手が出せないところがあるので面白いかなと思ってます。

    hackintoshをたくさん作っていたSnazzy Labsの人もスマートハウスの紹介してますね
    https://youtu.be/85yH56DS5mg

bootmacos へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。