#topicpath ** ESP32 [#n9d817c6] 中国の Espressif Systems 社が作成したマイクロコントローラで、次の特徴を持つ。 - 特徴 -- Arduino IDE (IDE とは「統合開発環境」のこと)で開発できる。~ (他の開発環境も選択しうる) -- Wifi 対応(単体で無線LAN接続できる。) -- Bluetooth 対応(単体でBluetooth接続できる。) -- ESP8266 の後継。~ ~ - ESP8266 との比較~ |比較項目| ESP32 | ESP8266 |h |対応する無線通信| Wifi, Bluetooth | Wifi | |CPU| 32bit, dualcore, 240MHz | 32bit, singlecore, 80MHz| |Espressif 製のモジュール名| ESP-WROOM-32 | ESP-WROOM-2 | |単体の価格(秋月電子) | [[550>http://akizukidenshi.com/catalog/g/gM-11647/]]円|[[400>http://akizukidenshi.com/catalog/g/gM-09607/]]円| ~ Arduino を使ってネットワーク接続をするのであれば、最初から ESP32 を使うことを考えるべき。~ ~ ** 開発用ボード [#y9b3b88c] ESP32用の開発ボードはいくつかある。今回は、Switchscience の [[ESPr Developer 32>https://www.switch-science.com/catalog/3210/]] を使用する。~ &color(cyan,※); 中国の安いボード([[ESP-32S ESP-32 Development Board>https://www.ebay.com/itm/ESP-32S-ESP-32-Development-Board-2-4GHz-Dual-Mode-WiFi-Bluetooth-Antenna-Module/253371778970?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649]],以下 中国ボード)を買った。これを使ったときの違いも書く。 *** 使用前の準備 [#de64a112] + ピンヘッダの半田付け~ まずはこれから。これをしないと、プロトタイピングできない。~ ~ + Arduino IDE のダウンロードと初期設定~ -- ポータブルな環境にするには、[["Windows ZIP file for non admin install">http://www.arduino.cc/en/Main/Donate]]を選択する。~ もちろん献金してよい。しかし、献金しなくても "Just Donwload" ボタンでファイルを取得できる。~ 1.8.5 が最新版(2018-08-16 (木) 17:44:23時点)~ ~ -- Switchscience の[[解説ページ>http://trac.switch-science.com/wiki/esp32_setup]]を参照して、Arduino IDE で ESP32 ボードを使えるようにする。 --- ファイル > 環境設定~ 設定タブの「追加のボードマネージャーのURL:」に https://dl.espressif.com/dl/package_esp32_index.json を書き込み OK をクリックする。~ ~ --- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポインターを合わせ、~ 現れたタブからボードマネージャを選んでクリック。窓に、ESP32 を入力すると、~ "esp32 by Expressif Systems"が現れる。これをクリックし、「インストール」をクリックする。~ ボードの定義がダウンロードされてインストールされる。~ ~ &color(cyan,※); 中国ボードの場合には、CP2102 というチップを使ってパソコンと通信する。そのため、対応した~ ドライバをあらかじめインストールする。[[Silicon labsのページ>https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers]]から、適切なものをダウンロードし、~ 展開してインストーラを起動すれば導入できる。~ ~ --- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポインターを合わせ、~ ESP32 Dev Module を選択する。~ ~ --- ツール > シリアルポート~ それらしい COM3 などを選択する。選択しないと通信できない。~ ~ + はまったところ ++ コンパイルがエラーで止まる。~ Mc Afee のウィルス対策ソフトのリアルタイムスキャンが影響している。これを止めると、コンパイルできる。~ ~ ++ ツール > シリアルポートで選べない。~ USB Type B micro のコネクタが深く刺さっていないと、COMポートが認識できない。~ ちなみに、シリアル通信のデバイスドライバは、Windows が勝手にインストールしてくれる。~ ~ *** テストプログラム [#rbc09f2e] 接続できたと思ったら、次のプログラム(Arduino ではスケッチと呼ぶ)を試してみる。 + Arduino としての機能~ 次のスケッチを実行し、ツール > シリアルモニタ でシリアルモニタ(別枠の窓)を表示させる。~ 右下の通信速度を、スケッチ中の 115200bps に変更する。 void setup() { Serial.begin(115200); } void loop() { Serial.println("Hello World."); delay(1000); } うまくいけば、1秒(1000ミリ秒)に1回、"Hello World." と表示される。~ ~ + Wi Fi としての機能~ ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例から) Wi Fi > Wi Fi Scan を選択する。~ 次のスケッチが表示される。~ #include "WiFi.h" void setup() { Serial.begin(115200); // Set WiFi to station mode and disconnect from an AP if it was previously connected WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.println("Setup done"); } void loop() { Serial.println("scan start"); // WiFi.scanNetworks will return the number of networks found int n = WiFi.scanNetworks(); Serial.println("scan done"); if (n == 0) { Serial.println("no networks found"); } else { Serial.print(n); Serial.println(" networks found"); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(")"); Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*"); delay(10); } } Serial.println(""); // Wait a bit before scanning again delay(5000); } うまくいけば、無線LANの情報が表示されるはずである。~ ~ + その他 ++ ホール素子~ ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例から) ESP32 > Hall Sensor~ 内蔵のホールセンサの値(磁場に関係した量)を表示できる。~ ~ ++ タッチセンサ~ ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例から) ESP32 > Touch > Touchread~ GPIO4 のピンからケーブルを伸ばすと、それに接触したかどうかで判定できる。~ いわば、タッチセンサ―として機能する。それを試すプログラム。~ ** 学内LAN(Captive Portal)での接続 [#l112b02e] ~ 本学の学内無線LAN は "Captive Portal" と呼ばれる仕組みを使っている。~ ESP32 をこれに対応させることができれば、利用範囲は広まる。~ ~ ~ ** IFTTT で利用する。 [#rd103966] + IFTTT を使う際の考え方~ [[こちらのページ>../IFTTT]]にまとめた。IFTTTの [[webhooksサービス>../IFTTT#ma07c03f]]を利用する。そのためには、~ https で ifttt.com に HTTP の POST あるいは GET でデータを送信しなければならない。~ ~ + https で特定のサイトにアクセスする。~ -- 予備知識~ ブラウザは、http と https を区別なくアクセスするように見える。しかし、マイコンで https で~ 開設されているサイトにアクセスするには、工夫が必要になる。サンプルプログラムは、~ ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例から) Wi Fi Client Secure > Wi Fi Client Secure~ で得られる。~ ~ -- 証明書の取得~ 「[[ESP32からIFTTTを使ってLINE Notifyで通知を送ってみた/スケッチの設定>https://qiita.com/mascii/items/4c366ad4709469d5fda9#%E3%82%B9%E3%82%B1%E3%83%83%E3%83%81%E3%81%AE%E8%A8%AD%E5%AE%9A]]」を参照して、~ 送信先であるifttt.comにアクセスするための証明書を取得する。~ -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI 4uJEvlz36hz1 -----END CERTIFICATE----- ~ -- IFTTT への通信~ HTTP の GET あるいは POST という方法でデータを送信する。送信方法については、次のページを参照した。~ --- 「[[IFTTTのトリガーおよびアクションをESP8266で実行する/トリガーの場合>https://qiita.com/mayfair/items/e761c788a9d8787bc610#esp8266%E5%81%B4]]」 --- 「[[ESP8266を使って温度センサ情報をIFTTTに投げる/コードの解説>https://qiita.com/triwave33/items/76c5ba9f18631b96785d#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A7%A3%E8%AA%AC]]」 --- 「[[IFTTTにMaker Channelができました。>http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/]]」(用語が古い) ~ -- スケッチのサンプル~ そんなこんなで作成したスケッチのサンプルを示す。~ 4番ピンに触ると、IFTTT へのトリガーとして働くスケッチ。Xで埋められている部分は、それぞれの~ ユーザーが設定する項目であることを示している。~ WiFiIDs.h const char* ssid = "XXXXXXXXXXXXX"; // your network SSID (name of wifi network) const char* password = "XXXXXXXXXXXXX"; // your network password const char* IFTTTkey = "XXXXXXXXXXXXXXXXXXXXXX"; // IFTTT webhook key for me const char* server = "maker.ifttt.com"; // Server URL const char* EventName = "XXXXXXXXXX"; // IFTTT Event Name const char* ifttt_root_ca= \ "-----BEGIN CERTIFICATE-----\n" \ "MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\n" \ "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\n" \ "EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\n" \ "ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz\n" \ "NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\n" \ "EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE\n" \ "AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw\n" \ "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD\n" \ "E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH\n" \ "/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy\n" \ "DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh\n" \ "GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR\n" \ "tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA\n" \ "AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE\n" \ "FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX\n" \ "WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu\n" \ "9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr\n" \ "gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo\n" \ "2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\n" \ "LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI\n" \ "4uJEvlz36hz1\n" \ "-----END CERTIFICATE-----\n"; プログラム本体 /* IFTTT trigger sample */ #include <WiFiClientSecure.h> #include "WiFiIDs.h" WiFiClientSecure client; int val1 = 1000, val2 = 1001, val3 = 1002; // dummy data void setup() { // Serial Monitor Serial.begin(115200); // WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { // attempt to connect to Wifi network: Serial.print("."); delay(500); } Serial.println("WiFi Connected"); // CACert client.setCACert(ifttt_root_ca); } void loop() { val3 = val2; val2 = val1; val1 = touchRead(T0); Serial.println(val1); if ( val1 + val2 + val3 < 80 ) { // touched Serial.println("\nStarting connection to server..."); if (!client.connect(server, 443)) { Serial.print ("Connection failed!"); Serial.println(server); return; } String request = "/trigger/"; request += EventName; request += "/with/key/"; request += IFTTTkey; request += "?value1=" + String(val1) + "&value2=" + String(val2) + "&value3=" + String(val3); Serial.println("GET " + request + " HTTP/1.1"); client.println("GET " + request + " HTTP/1.1"); client.print ("Host: "); client.println(server); client.println("Connection: close"); client.println(); while (client.connected()) { String line = client.readStringUntil('\n'); if (line == "\r") { Serial.println("headers received"); break; } } client.stop(); val1 = 1000, val2 = 1001, val3 = 1002; delay(10000); } delay(100); }