#author("2022-08-19T18:21:36+09:00","external:moriat","moriat") #topicpath - 目次 -- [[ESP32とは>./#n9d817c6]] -- [[ESP32を搭載した開発用ボード>./#y9b3b88c]] --- [[使用前の準備>./#de64a112]] --- [[テストプログラム>./#rbc09f2e]] -- [[SPI と I2C (プルアップ抵抗について)>./#j9f1feba]] -- [[I2C で気圧センサ DPS310 の値を読みとる>./#w86638fa]] -- [[SPI で気圧センサ BME280 の値を読みとる>./#gd7e0a5a]] -- [[NTP で時刻を取得する>./#ld460607]] -- [[IFTTT を利用する>./#rd103966]] -- [[Google スプレッドシートに記録する>./#r9db5cb2]] -- [[Smart Config>./#abb2dd6f]] -- [[Bluetooth と Bluetooth LE 周り>./#q8090a17]] -- [[サーボモーターSG90>./#k304b16e]] -- [[デュアルコアの活用>./#va27dec2]] -- [[ESP32-CAM>./#sd313114]] ~ ~ ** ESP32 [#n9d817c6] 中国の Espressif Systems 社が作成したマイクロコントローラ(あるいは SoC: System on Chip)で、次の特徴を持つ。 - 特徴 -- Arduino IDE (IDE とは「統合開発環境」のこと)で開発できる。~ (他の開発環境も選択しうる) -- Wifi 対応(単体で無線LAN接続できる。) -- Bluetooth 対応(単体でBluetooth接続できる。) -- dual core なので、2つの処理を同時に行うことができる。 -- ESP8266 の後継。~ ~ - 関連するSoC の比較([[lang-ship>https://lang-ship.com/blog/work/esp32-2022-01/]]による)~ |比較項目| ESP32,ESP32-S3| ESP-C3 | ESP8266 |h |対応する無線通信| Wifi, Bluetooth | Wifi, Bluetooth | Wifi | |CPU| 32bit, dualcore, 240MHz | 32bit, singlecore, 160MHz| 32bit, singlecore, 80MHz| |秋月電子でのモジュール名| ESP-WROOM-32,ESP32-S3-WROOM-1-N16R8|- | ESP-WROOM-2 | |単体の価格(秋月電子) | [[550>http://akizukidenshi.com/catalog/g/gM-11647/]]円,[[530>https://akizukidenshi.com/catalog/g/gM-17256/]]円|-|[[320>http://akizukidenshi.com/catalog/g/gM-09607/]]円| ~ Arduino を使ってネットワーク接続をするのであれば、最初から ESP32 を使うことを考えるべき。~ ~ - SPI~ まず、SPIそのものについては、[[Arduino/SPI]]を参照のこと。~ ESP32 は、SPIにも特徴がある。ESP32 単体で、2つのSPI接続できるようになっているので、より多くのデバイスが~ 接続できる。ESP32のSPI については、[[ESP32 のSPIについてのページ>https://www.mgo-tec.com/blog-entry-esp32-spimode-hspi-vspi-hispeed.html]]が大変参考になる。~ ~ - 資料のURL -- [[ESP32-WROOM-32>https://ht-deko.com/arduino/esp-wroom-32.html]]~ ESP32について、細かなノウハウも含めて、盛りだくさんの情報が掲載されているページ(日本語)。売っているサイトの情報も。 -- [[the INTERNET of THINGS with ESP32>http://esp32.net]]~ ESP32(の諸々のバリエーション)についてのページ(ただし英語) -- [[Expressif(メーカー)の資料のダウンロードページ>https://www.espressif.com/en/support/download/overview]] -- [[ESP32 で利用できる関数のリファレンスマニュアル的なもの>http://chiselapp.com/user/jschimpf/repository/ESP32Lib/doc/tip/Docs/ESP32Lib.pdf]]~ 文献情報が少なく、github でソースを探して読むこととは別に、関数の一覧や、型についての情報を与えてくれる便利な文献~ ~ ** 開発用ボード [#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.19 が最新版(2022-08-19 (金) 11:26:12時点)~ ~ -- Switchscience の[[解説ページ>http://trac.switch-science.com/wiki/esp32_setup]]を参照して、Arduino IDE で ESP32 ボードを使えるようにする。 --- ファイル > 環境設定~ 設定タブの「追加のボードマネージャーのURL:」に https://github.com/espressif/arduino-esp32/releases/download/2.0.4/package_esp32_index.json を書き込み OK をクリックする。~ ~ ※ github の[[Arduino-ESP32>https://github.com/espressif/arduino-esp32]]を参照し、最新の安定版(2022-08-19 (金) 11:26:12時点で 2.0.4) を選ぶ。安定版のページの package_esp32_index.json の URL を書く。~ ※ ファイルは次の場所に格納されるようである。~ C:\Users\[ユーザー名]\AppData\Local\Arduino15\packages\esp32\hardware ~ --- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポインターを合わせ、~ 現れたタブからボードマネージャを選んでクリック。窓に、ESP32 を入力すると、~ "esp32 by Expressif Systems"が現れる。これをクリックし、「インストール」をクリックする。~ ボードの定義がダウンロードされてインストールされる。~ ~ &color(cyan,※); [[中国ボード>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]]の場合には、CP2102 というチップを使ってパソコンと通信する。そのドライバは~ 自動的にインストールされない。そのため、対応したドライバをあらかじめインストールする。~ [[Silicon labsのページ>https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers]]から、適切なものをダウンロードし、 展開してインストーラを起動すれば~ 導入できる。~ ~ --- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポインターを合わせ、~ ESP32 Dev Module を選択する。~ ~ --- ツール > シリアルポート~ それらしい COM3 などを選択する。選択しないと通信できない。~ ~ --- コンパイルに時間がかかることへの対策~ このままだと、コンパイルにかかる時間が尋常ではない。~ [[Qiita Arduino IDE でESP32のコンパイル時間を短縮する方法>https://qiita.com/njm2360/items/c8a15047cde43617f6ce]]を参照して、~ (1) バイナリの場所を固定、(2) ccache を使用するように設定する。~ ~ + はまったところ ++ コンパイルがエラーで止まる。~ Mc Afee のウィルス対策ソフトのリアルタイムスキャンが影響している。これを止めると、コンパイルできる。~ ~ ++ ツール > シリアルポートで選べない。~ USB Type B micro のコネクタが深く刺さっていないと、COMポートが認識できない。~ ちなみに、シリアル通信のデバイスドライバは、Windows が勝手にインストールしてくれる。~ ~ ++ プログラムの書き込みに失敗する~ &color(cyan,※); 主に[[中国ボード>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]]の場合 --- シリアルモニタが開いていたら、これを閉じる。~ --- 繰り返してみる。~ --- 通信速度を 115200 に落としてみる。~ --- グラウンドになっているところを指で触ってみる。~ 私の環境では再現性なくときどき失敗していた。USBコネクタの金属部分に触れると調子が良くなる。~ ~ ++ 永遠にメッセージを吐き続ける rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 どうやら、特定のPINが pull up あるいは pull down されていると生じるらしい。([[情報源>https://www.esp32.com/viewtopic.php?t=11439&start=20]])~ --- 対策1: 12番ピンに何か接続されていたら、これを外してプログラムを流しこむ。~ SPI に 12番が使われることがあるが、別の番号にしてみることが考えられる。~ ~ --- 対策2: GNDの接続をチェックする。~ GND が浮いていると同様の現象が発生することがわかった。GND がきちんと接続されているかチェックする。~ ~ // --- 対策2:github から esptool.py (python プログラム)を取得して実行する。~ // [[github の esptool.py>https://github.com/espressif/esptool#installation--dependencies]]~ // python 環境があるなら // pip3 install esptool // で導入し、 // esptool.py -p /dev/ttyUSB0 -b 115200 erase_flash // などとする。(ただし、Linux の場合) // --- 対策2: 次のページに書いてあるように、ツールを espressif からダウンロードして、リセットする。~ // [[SW_RESET continuous reboot>https://www.esp32.com/viewtopic.php?t=11439#p48365]]~ ~ *** テストプログラム [#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 のピンからケーブルを伸ばすと、それに接触したかどうかで判定できる。~ いわば、タッチセンサ―として機能する。それを試すプログラム。~ ** SPI と I2C (プルアップ抵抗について) [#j9f1feba] #divregion + 概要~ 近年のセンサは、SPI か I2C でデータを提供できるようになっている。~ アナログ信号を末端ユーザがAD変換する時代は終わった(かも)。~ SPI と I2C について簡単にまとめる。~ | |SPI|I2C|h |プルアップ抵抗 | 必要ない | 必要| |線の数(電源、グラウンドを含まない) | 4(or3) | 2 | |通信速度 | 50M bps 程度 | 100k bps 程度| 通信速度と、プルアップ抵抗が必要ない点で SPI が優れているが、配線数が多くなる。~ 個人的にはプルアップ抵抗を導入するのが面倒なので、もっぱら SPI を使っていた。~ ~ ところが、Arduino ではプルアップ抵抗が内蔵されていると知り、また、ESP32では、~ &color(red){プルアップ抵抗の設定のオン・オフをプログラムで制御できる};と知り、I2C へ傾くこと~ となった。~ ~ + サンプルプログラム ++ 配線~ LEFT:|DSP310ボード|ESP32 |h | GND | GND | | VCC | 3V3 | | SDA | GPIO21| | SCL | GPIO22| ++ プログラム I2C Scanner // -------------------------------------- // i2c_scanner // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // Originally from // https://playground.arduino.cc/Main/I2cScanner/ // branch out for ESP32 2018/05/25 // https://qiita.com/nanbuwks/items/c235f7f867f6139b6c8b // modified 2021-08-06 // -------------------------------------- #include <Wire.h> void setup() { Wire.begin(21,22); pinMode(21, INPUT_PULLUP); pinMode(22, INPUT_PULLUP); Serial.begin(921600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; boolean isThereDevices = false; Serial.println("Scanning..."); for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) // acknowledge to the address. { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); isThereDevices = true; } else if (error==4) { Serial.print("Unknown error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (isThereDevices) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(3000); // wait 3 seconds for next scan } #enddivregion ** I2C で気圧センサ DPS310 の値を読みとる [#w86638fa] #divregion + 概要~ 先輩に DSP310 を勧められたので、これを使うことにした。[[SeeedStudio>https://www.seeedstudio.com/Grove-High-Precision-Barometer-Sensor-DPS310-p-4397.html]] から10個購入した。~ BME280もDPS310も、MEMS で作られたセンサには違いないが、BME280 がピエゾ効果である~ のに対して、DPS310 は静電容量を使っている。長期的に安定するのは、原理的にもDPS310~ であると思われる。 ~ + 手順 ++ 配線~ LEFT:|DSP310ボード|ESP32 |h | GND | GND | | VCC | 3V3 | | SDA | GPIO21| | SCL | GPIO22| ++ ライブラリのインストール~ +++ Arduino IDE を開いて、ツール > ライブラリを管理… でライブラリマネージャを開く。 +++ 検索窓に DPS310 と入力。 +++ 現れたライブラリにマウスのポインタを合わせると、ライブラリがインストールできる。~ "Adafruit DPS310" と Infineon の "Digital Pressure Sensor" のどちらかをインストールする。~ ~ ++ サンプルプログラムの実行 +++ Adafruit DPS310の場合~ ファイル > スケッチ例 > Adafruit DPS310 > dps310_simpletest を選択して実行する。 +++ Digital Pressure Sensorの場合~ ファイル > スケッチ例 > Digital Pressure Sensor > i2c_command を選択して実行する。~ ~ ※ Arduino IDE の環境設定で、コンパイラの警告を「全て」にしていると、warning によってライブラリが~ &color(red){コンパイルできない};。(エラーで止まる。)ライブラリを作成(最初のコンパイル)時には「なし」にしておく。~ ~ + 参考URL -- [[データシート>https://www.infineon.com/dgdl/Infineon-DPS310-DataSheet-v01_02-EN.pdf?fileId=5546d462576f34750157750826c42242]] -- センサー開発元のライブラリ~ [[Infineon のライブラリ>https://github.com/Infineon/DPS310-Pressure-Sensor]] -- Adafruit~ [[Adafruitのライブラリ>https://github.com/adafruit/Adafruit_DPS310]]~ ただし、 単独では動かず、[[Adafruit BusIO>https://github.com/adafruit/Adafruit_BusIO]] と、[[Adafruit Unified Sensor Driver>https://github.com/adafruit/Adafruit_Sensor]] が必要。~ ~ #enddivregion ** SPI で気圧センサ BME280 の値を読みとる [#gd7e0a5a] #divregion + 概要~ 観測装置として、観測装置の置き場所と、センサの値の回収はいつも問題になる点である。無線LAN~ が使えて、センサーの値を送信できれば好都合である。ESP32と BME280 を用いてこれを実現する。~ SPIについては[[Arduino/SPI]]を参照のこと。~ ~ + 手順 ++ 配線する~ [[参考URLに示したページ>https://www.mgo-tec.com/blog-entry-esp32-bme280-sensor-library.html]]の SPI の方を参考に接続する。([[画像へのリンク>https://farm5.staticflickr.com/4414/36458274462_c34affa473_o.jpg]])~ ※ HSPI という ESP32 の SPI 通信の仕組みを使っているので、26番ピンに~ 接続するとしているものは、15番ピンを使ったほうが良いように思われる。~ | BME280 | ESP32 |h |VCC | 3V3 | |GND | GND| |SCK, SCLK, SCL | 14 | |SDO, MISO | 12 | |SDI, MOSI, SDA | 13 | |CS (CSB) | 26 | ~ ++ ESP32 で BME280 のデータを SPI で読みとるためのライブラリをありがたく使わせていただく。 +++ github の[[ここ>https://github.com/mgo-tec/ESP32_BME280_SPI]]から、"clone or download" を選んで zip ファイルをダウンロードする。 +++ [[ここ>http://www.humblesoft.com/wiki/?Arduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#w73a0896]]を参考に、ライブラリをインストールする。~ +++ Arduino IDE で スケッチ > ライブラリをインクルード で ESP32_BME280_SPI を選択する。~ ~ ++ プログラム~ [[参考URLに示したページ>https://www.mgo-tec.com/blog-entry-esp32-bme280-sensor-library.html]]の SPI の方のサンプルプログラムを~ ファイル > スケッチ例 > ESP32_BME280_SPI > ESP32_BME280_SPI_sample01 ~ を選択して開く。これを実行し、シリアルモニタで値が表示されるか確かめる。~ ~ ~ + 参考URL -- [[Bosch BME280>https://www.bosch-sensortec.com/bst/products/all_products/bme280]]~ [[データシート>https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280-DS002.pdf]]が Downloads タブからダウンロードできる。 -- [[Bosch BMP280>https://www.bosch-sensortec.com/bst/products/all_products/bmp280]]~ BME280とは違い湿度が測れない。気圧と気温のみ測定できる。~ [[データシート>https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP280-DS001-19.pdf]]が Downloads タブからダウンロードできる。 -- [[Arduinoライブラリのインストール(zipファイルで)>http://www.humblesoft.com/wiki/?Arduino%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB#w73a0896]] -- [[ESP32 用 BME280 ( 温度 湿度 気圧センサー ) ライブラリを作ってみた>https://www.mgo-tec.com/blog-entry-esp32-bme280-sensor-library.html]] // ** 学内LAN(Captive Portal)での接続 [#l112b02e] // ~ // 本学の学内無線LAN は "Captive Portal" と呼ばれる仕組みを使っている。~ // ESP32 をこれに対応させることができれば、利用範囲は広まる。~ //~ ~ #enddivregion ** NTP で時刻を取得する [#ld460607] #divregion ※ 手っ取り早くサンプルプログラムを見たい場合には[[こちら>./NTP/NTP_SampleProgram]]を参照して下さい。~ - 概要~ NTP(Network Time Protocol)は、ネットワークを使って時計を同期するための通信規約である。~ これを用いてネットワーク越しに時刻を特定できる。~ ~ ただし、パケットの往復にかかる時間などを考えると、実際に NTP を使って時計を合わせるのは、~ わりと複雑な処理をしなければならない。そこで、マイコンレベル(ESP32も含めて)では、より~ 簡単な方法を使って、ある程度いい加減に時計を合わせることになる。1秒程度の違いに目をつぶ~ ると、標準的な関数を使ったり、NTPClient ライブラリを使ったりして時計を合わせられる。~ それよりも精度よく合わせたい場合には、工夫が必要になる。~ ~ -- NTPプロトコルについての参考資料 --- https://milestone-of-se.nesuke.com/I7protocol/ntp/ntp-format/ --- http://www.venus.dti.ne.jp/~yoshi-o/NTP/NTP-SNTP_Format.html + 標準的な関数で時計を合わせる方法 -- 参考資料 --- スケッチ例 > ESP32 > time > Simpletime~ このプログラム(スケッチ)は、lwIP(lightweight IP)のSNTPを使って時間を合わせる例であるが、他のシス~ テムで用いられるような関数が使われていることから、ESP32 用のシステムには豊富な関数があ~ ることをうかがわせる。~ しかし、どのような関数があるのか、調べ方がわからないのは困ったことである。~ ~ --- https://github.com/espressif/esp-idf/tree/master/examples/protocols/sntp ~ 時間の関数について、ちょっと情報がわかる。~ ~ --- time_opts.h~ ESP32 関連のファイルの中から time_opts.h を探して、あるいは、次の URL からファイルを参~ 照する。すると、 SNTP_UPDATE_DELAY で、時刻の同期が1時間に1回であるとわかる。~ https://github.com/espressif/arduino-esp32/blob/master/tools/sdk/include/lwip/lwip/apps/sntp_opts.h ~ ~ --- lwipopts.h~ あるいは次の URL。settimeofday の使われ方で秒単位での精度でしか合わせていないとわかる。~ https://github.com/espressif/arduino-esp32/blob/96822d783f3ab6a56a69b227ba4d1a1a36c66268/tools/sdk/include/lwip/lwipopts.h ~ ~ --- その他のプログラム例~ [[ESP32 NTPを使って時刻をGET>https://qiita.com/coo0659/items/13d36668b2037e38f834]]~ [[ESP32で現在時刻を取得する>http://www.autumn-color.com/archives/839]]~ ~ + NTPClient ライブラリを使った方法 -- 参考資料 --- [[github>https://github.com/arduino-libraries/NTPClient]]~ Arduino 汎用のライブラリ。ソースが読めるので、何をしているかよくわかる。settimeofday() のような高度~ な関数は Arduino そのものには実装されていないために、年月などの情報は保持できない。~ ~ 時刻の同期についても、1秒単位であり、現在の時刻と差が1秒以内なら時刻の改定もしない。~ ~ + その他の方法~ 結局自分は[[自作>./NTP/NTP_SampleProgram]]した。NTPClient ライブラリをよく読んで、settimeofday() で時刻を設定する。~ 1秒以下の値もコントロールできるし、更新時間間隔(同期する時間間隔)も設定できる。~ 自作したサンプルプログラムについては、[[こちら>./NTP/NTP_SampleProgram]]を参照のこと。~ -- 参考資料 --- [[KERI's Lab ESP32で時間取得>https://kerikeri.top/posts/2017-04-26-esp32-time/]]~ 同じ発想。しかも私よりもずっと先。定期的に同期するには NTPClient のような関数を作る必要がある。~ ~ ~ #enddivregion ** IFTTT を利用する [#rd103966] #divregion + 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); } #enddivregion ** Google スプレッドシートに記録する(未完) [#r9db5cb2] #divregion - 参照URL -- [[M5stackで温度・湿度をGoogleスプレッドシートに記録してみませんか?(Arduino IDE)>http://www.telomere0101.site/archives/post-1008.html]]~ ~ #enddivregion ** Smart Config [#abb2dd6f] #divregion - 概要~ ESP32 は、手軽にあちこちで Wi-Fi に接続できるところに魅力がある。それなのに、いちいち~ SSID などをプログラムに書き込んでいては、場所場所でプログラムを入れなおす必要が生じる。~ それを避けるために、ESP32 が起動したら、一旦、ウェブサーバーとして機能させて、そのサー~ バーに SSID などを送信して接続する。専用のスマホのアプリ等が必要になるが、それさえあれ~ ば、逆に、どこでも接続できる。~ ~ - 参考URLなど -- [[ESP32にSmartConfigでWiFi情報を伝える>https://kerikeri.top/posts/2018-02-16-esp32-smartconfig/]] -- [[Google Play で検索>https://play.google.com/store/search?q=Espressif%20esptouch&c=apps]] -- [[Espressif esptouch(Apple Store)>https://itunes.apple.com/jp/app/espressif-esptouch/id1071176700?mt=8]] -- ファイル > スケッチ例 > Wi Fi > Wi Fi Smart Config ~ ~ #enddivregion ** Bluetooth と Bluetooth LE 周り(未完) [#q8090a17] #divregion - 参考URLなど -- [[MAC アドレス等を取得する>https://www.mgo-tec.com/blog-entry-chip-info-esp-wroom-32-esp32.html]] -- [[ESP-WROOM-32でiBeaconをスキャンする>http://blog.livedoor.jp/sce_info3-craft/archives/9717154.html]]~ Arduino IDE を使って iBeacon の UUID Major, Minor といった情報を取得・表示する方法~ ~ ~ #enddivregion ** サーボモーターSG90 [#k304b16e] #divregion - SG90について~ とても安価なサーボモーター -- 購入 --- [[秋月電子 gM-08761>http://akizukidenshi.com/catalog/g/gM-08761/]] --- [[eBay>https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=SG90&_sacat=0]] -- 配線 --- [[秋月電子に掲載のデータシート>http://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf]]~ 茶:GND(マイナス)~ 赤:VCC(プラス)~ オレンジ:PMW(制御)~ ~ -- プログラム~ ESP32 が Arduino と同様の開発環境が使えるからといって、全てのライブラリが使えるわけではないようだ。~ Arduino にはServo というライブラリがあるが、これは使えないとのこと。([[hackaday.comの記事>https://hackaday.com/2016/10/31/whats-new-esp-32-testing-the-arduino-esp32-library/]]を参照)~ 上記のページを参照して、制御線を25番ピンにするときのプログラム例を以下に示す。~ ~ // ESP32 によるサーボモータ SG90 の制御例 #include "esp32-hal-ledc.h" void setup() { ledcSetup(1, 50, 16); // channel 1, 50 Hz(20ms), 16-bit ledcAttachPin(25, 1); // GPIO 25 on channel 1 // 16bit なので、0-65535 までの範囲が 0-20ms に対応する。 // データシートによると、20msのサイクルの中で、パルス幅を // 次のようにして角度をコントロールできる。()内はPWMの値 // 0.50ms(1638) → -90度 // 1.45ms(4751) → 0度 // 2.40ms(7864) → +90度 } void loop() { // 回転の角度を i で指定する。16bit の SG90 の可動範囲の PMW 値にマップして与える。 // -90度から10度ごとに90度まで変化させる。 for (int i=-90 ; i <= 90 ; i +=10){ ledcWrite(1, map(i,-90,90,1638,7864)); delay(1000); } } #enddivregion ** デュアルコアの活用 [#va27dec2] #divregion - 何の話か~ ESP32 は、ESP8266とちがって、dualcore であることを、[[冒頭>./#n9d817c6]]で述べた。例えば、観測データを~ 定期的に取得して、ある程度データがたまったらネットワーク経由でどこかに保存する、といった場合、~ ネットワーク通信をしている間に観測がおろそかになる。そこで、同時に2つの仕事をこなせると、好都~ 合である。計算機の処理を行う部分(CPU)がひとつしか処理を行えないならそれはできない。ところが、~ ESP32は、CPU に2つのコアを持っているために、2つの処理を同時に行うことができる。データを送信~ するのと同時に、観測データを取得することができる。~ ~ そういう話。~ ~ - 参考URL -- [[Dual CoreなESP32でマルチタスクの検証、ラズパイとも勝負!>https://qiita.com/makotaka/items/dd035f4b2db94f87b63c]] -- [[Arduino – ESP32 のマルチタスク ( Dual Core ) を試す>https://www.mgo-tec.com/blog-entry-arduino-esp32-multi-task-dual-core-01.html]] ~ ~ - サンプルコード~ 上記のページを、ほぼそのままパクっている。~ ~ #include "freertos/task.h" void タスク名(void *pvParameters){ while(1){ loop()と並行して実行したいプログラムを書くところ } } void setup(){ xTaskCreatePinnedToCore( タスク名, "タスク名", 4096, NULL, 1, NULL, 0 ); } void loop(){ } ほぼ、このまま何も考えずに使える。~ ~ - 注意:~ ただし、下記の点に注意する。~ +++ タスク名 と書かれたところは同一の名前(ただし日本語でない)にしておく。~ ( "タスク名" はその限りではないがわかりやすさのため ) +++ void タスク名() は終了させない。 while(1) で回しておく。 +++ while(1) で回しているプログラムの中に、少なくとも delay(1); のようなものを入れる。~ これがないと、watchdog がどうのこうのと怒られる。~ cf. [[ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ>https://www.mgo-tec.com/blog-entry-trouble-shooting-esp32-wroom.html/4]] +++ xTask…… の NULL で挟まれた 1 は優先順位を表している。1 でよい。 +++ xTask…… の最後の 0 は、コアの ID である。普通の loop は、コア1 で動く。~ それとは別に動かすので、0 にしている。~ ~ #enddivregion ** ESP32-CAM [#sd313114] #divregion - デバイス~ -- ESP32-CAM~ ESP32 とカメラ(OV2640)とがセットで安価で売られている。例えば [[ebay>https://www.ebay.com/itm/5PCS-ESP32-CAM-ESP32-OV2640-Camera-Module-WIFI-Bluetooth-Development-Board-5V/274042848379?_trkparms=aid%3D1110006%26algo%3DHOMESPLICE.SIM%26ao%3D1%26asc%3D20200818143230%26meid%3Dec389674599f4ce7aaf2993bfb66e5d9%26pid%3D101224%26rk%3D2%26rkt%3D5%26mehot%3Dnone%26sd%3D401732792188%26itm%3D274042848379%26pmt%3D1%26noa%3D1%26pg%3D2047675%26algv%3DDefaultOrganic%26brand%3DMarkenlos&_trksid=p2047675.c101224.m-1]] など。~ &ref(https://i.ebayimg.com/images/g/SlEAAOSw2Whdm~jQ/s-l1600.jpg,,20%);~ ちなみにここに掲載したもの(ESP32-S)は技適マークがない。~ しかし、ESP32-Sは[[工事設計認証を受けている>https://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jg01_01&PC=204&TC=N&PK=1&FN=200109N204&SN=%94%46%8F%D8&LN=32&R1=*****&R2=*****]]。 -- USB-TTL~ ESP32-CAM は、パソコンと直接接続することができない。パソコンにはシリアルポートがないし、ESP32はシリアルポートで通信する。 そこで、USB-TTL (TTL: Transistor-Transistor-Logic だそうな。) で接続して通信しなければならない。例えば[[こんなもの>https://www.amazon.co.jp/dp/B081RHWLKH]]。~ &ref(https://www.amazon.co.jp/images/I/61cy9E8XD7L._AC_SL1000_.jpg,,20%); - デザイン~ 次のようなものを作りたい。 -- Wifi で接続する。 -- Smartconfig(※) であとから IP アドレスが設定できる。~ ※ スマホなどにアプリを入れて ESP32 と事前に通信し ESP32 をローカルネットに接続する仕組み -- 再起動したときに、Smartconfig を使わなくても以前の IP アドレスで接続できる。 -- IPアドレスを容易に確認できる。~ 添付のプログラム(&ref(TEST.ino);)通りで実行すると、esp32cam.local でアクセスできる。 -- 動画を配信できる。 -- 静止画も取得できる。 - 作成 -- Arduino IDE に ESP32 core を入れる。 -- [[Micro-RTSP>https://github.com/geeksville/Micro-RTSP]]を Arduino のライブラリとして導入する。 -- Micro-RTSPのサンプルプログラムを改変して作成する。(改変したものを添付する。&ref(TEST.ino);)~ -- PCと USB-TTLとESP32-CAM を接続する。プログラムを流しこむ。~ --- 配線~ いつも間違えやすいが、Transmit と Recieve は互い違いにしなければ通信できない。 LEFT:|USBTTL | ESP32-CAM| 備考|h |5V | 5V || |GND | GND || |TXD | UOR|| |RXD | UOT|| |- | GND-IO0| パソコンからプログラムを流しこむときだけ接続しておく。逆に、カメラを起動するときには外しておく。 | --- ヒント~ シリアル通信を開始しないときは、ESP32-CAMのリセットボタンを押す。 - 結果のまとめ -- RTSP での動画のアクセス~ Linux なら vlc などで、rtsp://IPアドレス/ でアクセスできる。HTTP の方が応答が良い。RTSP はコマ落ちが激しい。~ -- HTTP での動画のアクセス~ http://IPアドレス/ でアクセスできる。 -- HTTP で静止画を取得~ http://IPアドレス/jpg でアクセスできる。 RTSP や、HTTP の動画を待機しているせいか、応答が遅れることがよくある。~ タイムラプス動画用に静止画を取得するのには使えなさそう。 - 資料 -- 参考URL --- [[Micro-RTSP>https://github.com/geeksville/Micro-RTSP/]]~ ここのサンプルプログラムをベースに、少しだけ改変した。 --- [[ESP32カメラモジュール+HTTP+RTSP+OTA+mDNS>http://maplerain78.blogspot.com/2019/04/esp32httprtspotamdns.html]]~ 同じようなことを考える人がいるものである。~ ただ、情報が古く、現時点の Micro-RTSP のライブラリでは使えない。~ 添付のファイル(&ref(TEST.ino);)では、OTA は実現していない。 --- [[Ai-Thinker ESP32-CAM in the Arduino IDE>https://robotzero.one/esp32-cam-arduino-ide/]]~ --- [[CameraWebserver2SD>https://github.com/v12345vtm/CameraWebserver2SD]]~ NTPしながら画像をSDカードに収める。 ライブラリのサンプルプログラムに基いた情報 -- その他のヒント --- カメラが認識できないようなメッセージが出て動かないことがある。delay(500);を入れまくった。 #enddivregion