ESP32開発ボードを使用してIoTウェブサーバを作ります。前回はイーサネットシールドを使った有線ケーブルによる接続でしたが、今回はWi-Fi無線で接続します。ESP32とは何か、ESP32でプログラミングするための開発環境を整える方法、ライブラリの基本的な使い方について紹介します。
ESP32とは
近年最もよく使われるWi-Fi対応マイクロコントローラは、中国のespressif社から発売されている「ESP32」です。非常に小さく、親指の爪ほどの大きさしかありません。
このチップに520kBのメインメモリ(Arduinoは32kB)、4MBのプログラムメモリ(バージョンにより異なる。Arduinoは2kB)が搭載されていて、クロックは最大240MHz(Arduinoは16MHz)で動作します。チップには38か所のピンがありますが、寸法が小さいため電線の接続がしにくくなっています。
ESP32をより大きな基板にマウントし、取り回ししやすくするモジュールもありますが、Arduinoのような統一した企画がなく、販売メーカーによってたくさんの種類があります。ここでは、広く使われている「ESP32開発モジュール」を中心に解説します。
このESP32開発モジュールは、ESP32のすべてのGPIOピン(出入力ピン)がブレッドボードで使える形で引き出されています。USB端子(USB→シリアル変換回路)もついており、パソコンから簡単にプログラムをアップロードできます。USBの電源電圧は5Vですが、内蔵の変換回路を使ってESP32で必要な3.3Vを作っています。
多数の入出力端子(GPIO : General Purpose Input/Output)を備えており、そのうち一部はほかの機能(アナログ入力やI2Cインターフェースなど)と兼用になっています。ESP32は電源電圧3.3Vで動作するということに注意が必要です。
ESP32の大きなメリットは、Arduino IDE経由でプログラミング・書き込みができるという点です。(対応する設定ファイルやコンパイラをダウンロードしておく必要があります。)
ESP32開発環境の準備
ここでは、前回のwebサーバーの例をESP32で実現してみます。
Arduino IDEでESP32をプログラミングするのに必要なファイルはgitというインターネット上のバージョン管理ツールに最新版がアップされているので、そこからダウンロードして使います。
まずはgitからローカルのパソコンにファイルをダウンロードするツールを用意します。Gitクライアントソフト「git-scm」をパソコンにダウンロードしてインストールします。このサイトから使用しているパソコンのOSに合わせてダウンロードします。ダウンロードしたファイル(Windowsなら.exe)を実行します。
多くのインストールオプションが表示されます。よくわからないものはデフォルトやrecommended(おすすめ)と書かれている設定にしておきます。
インストール後、スタートメニューから「Git GUI」プログラムを起動し、「Clone Existing Repository」(既存のリポジトリのクローン)という項目を選択します。
開いたダイアログボックスで、「Source Location」(コピー元のデータの場所)として、https://github.com/espressif/arduino-esp32と入力します。「Target Directory」(コピー先のフォルダ)は、手動で作成します。
Windowsの「Document」フォルダを開き、「Arduino」フォルダに移動します。Arduinoフォルダの中に「hardware」というフォルダを作成し、その中に「espressif」フォルダを作成します。Git GUIソフトウェアの「Target Directory」の枠の右側の「Browse」ボタンからこのフォルダを選択し、出てきたパスの末尾に「/esp32」を追加します。この「esp32」フォルダはGit GUIが自動で作成してくれます。Clone Typeの設定は変更しなくて構いません。
「Clone」ボタンを押すと、ダウンロードが始まります。途中でgithubへのログインを求められます。
ダウンロードが完了したら、ダウンロード先のフォルダ内の「tools」フォルダを開きます。Toolsフォルダ内の「get.exe」という実行ファイルを起動します。コマンドプロンプト(黒いテキスト画面)が開き、ESP32用のコンパイラをダウンロードしてくれます。
このダウンロードが完了し、コマンドプロンプトが自動で閉じたらインストール完了です。Arduino IDEを開いていた場合はここで一度閉じてください。Arduino IDEを開き、「メニュー」>「ツール」>「ボード」を見ると、ESP32に関連した新しいボードが多数追加されています。今回はその中から「ESP32 Dev Module」を選択します。
ボードをパソコンに接続した後、Arduinoと同様に対応するCOMポートを設定します。「ツール」メニューの中の「シリアルポート」から該当するポートを選択します。Webサーバーの実験を行うため、可変抵抗とLED・抵抗をESP32モジュールに接続します。
回路図
Arduinoの電源電圧は5Vですが、今回は電源電圧が3.3VなのでLEDの保護抵抗を330オームから220オームに変更します。330オームのままでも実験はできますが、少しLEDが暗くなります。
ESP32モジュールは幅が大きく、1枚のブレッドボードに載せると配線するスペースがなくなります。小さなブレッドボードを2枚用意してまたぐように配置することで、配線スペースを確保します。
プログラム
スケッチは前回使用したものとほぼ同じで、簡単に流用できます。
#define LEDPIN 4 // = GPIO 4 (1) #define ANALOGPIN ADC1_CHANNEL_4 // = GPIO 32 #define NetworkName "MyWLAN" //(2) #define PASSWORD "MyPassword" #include "WiFi.h" //(3) #include "driver/adc.h" //(4) WiFiServer Server(80); //(5) WiFiClient Client; String Request; void setup() { pinMode(LEDPIN, OUTPUT); adc1_config_width(ADC_WIDTH_BIT_10); //(6) adc1_config_channel_atten(ANALOGPIN,ADC_ATTEN_DB_11); //(7) Serial.begin(115200); delay(100); Serial.println(); Serial.print("Connect to: "); Serial.println(NetworkName); WiFi.begin(NetworkName, PASSWORD); //(8) while (WiFi.status() != WL_CONNECTED) //(9) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("My IP-Adresse: "); Serial.println(WiFi.localIP()); Server.begin(); } void loop() { Client = Server.available(); if (Client) { Serial.println("New Client"); boolean blankLine = true; while (Client.connected()) { if (Client.available()) { char c = Client.read(); if (Request.length() < 100) Request += c; if (c == '\n' && blankLine) { Serial.print("Request from Client: "); Serial.println(Request); if(Request.indexOf("ein")>0) digitalWrite(LEDPIN,HIGH); if(Request.indexOf("aus")>0) digitalWrite(LEDPIN,LOW); Client.println("HTTP/1.1 200 OK"); Client.println("Content-Type: text/html"); Client.println("Connection: close"); // Verbindung wird nach Antwort beendet Client.println("Refresh: 2"); // Seite alle 25 Sekunden neu abfragen Client.println(); Client.println("<!DOCTYPE HTML>"); Client.println("<html>"); Client.print("AnalogValue: "); Client.print(adc1_get_raw(ANALOGPIN)); //(10) Client.println("<br><br>"); Client.println("<a href='?on'>LED Switch ON</a>"); Client.println("<br><br>"); Client.println("<a href='?off'>LED Switch OFF</a>"); Client.println("</html>"); Request = ""; break; } if (c == '\n') blankLine = true; else if (c != '\r') blankLine = false; } } delay(1); Client.stop(); Serial.println("client disconnected."); Serial.println(""); } //(11) }
スケッチの解説
(1) デジタル出力ピンは、ESP32のGPIO番号で指定します。
一方、アナログ入力ピンはESP32のアナログ/デジタル変換器(ADC)の番号で指定します。
これらに関しては、使用するモジュールのドキュメントを確認してください。
(2) 「NetworkName」「PASSWORD」は使用する(接続する)WiFiの設定に置き換えます。
(3) ネットワーク接続に「WiFi.h」というライブラリを使用します。ESP32用のコンパイラをインストールした際にセットでインストールされているはずです。
(4) ESP32ではアナログ入力を使用するためにライブラリが必要になります。
(5) イーサネットシールドの例と同じようにライブラリのクラスからオブジェクトを、作成します。
イーサネットシールドの時とはクラス名が異なります。
(6) 「adc.h」ライブラリに関する設定で、アナログ入力に関する設定をしています。
解像度10ビットに(入力値を0~1023の範囲で読み取る)設定します。
ESP32では最大12ビットまで(入力値を0~4095の範囲で読み取る)設定できます。
(7) こちらも「adc.h」ライブラリに関する設定で、電源電圧3.3Vが入力されたときに1023となるように信号の増幅度を設定します。
(8) webサーバーとして動作を始めます。イーサネットシールドの時は引数にMACアドレスを渡しましたが、Wi-Fiの場合はWi-Fiネットワークの名前とパスワードを渡します。
(9) Wi-Fiネットワーク接続完了まで時間がかかります。これ以降のプログラムの実行を接続完了するまで遅らせます。
(10) ArduinoでいうanalogRead()関数ですが、別のライブラリを使っている関係で表現が変わります。
(11) イーサネットシールドでは「maintain()」関数でIPアドレスの有効期限の延長を行いましたが、ESP32ではバックグラウンドでこうした処理を行ってくれるので、maintain()関数の処理は不要です。
ESP32にアップロード後、シリアルモニタでIPアドレスを確認することができます。ルーターのDHCP機能により、自動でIPアドレスが与えられます。WebブラウザからこのIPアドレスにアクセスすると、アナログ入力の値の確認やLEDのON/OFFのコントロールができるようになります。イーサネットシールドの時と同じ機能ですが、データ通信は無線で行えるようになりました。
コメントを残す