#topicpath

- 目次
-- [[ESP32とは>./#n9d817c6]]
-- [[ESP32を搭載した開発用ボード>./#y9b3b88c]]
--- [[使用前の準備>./#de64a112]]
--- [[テストプログラム>./#rbc09f2e]]
-- [[SPI で気圧センサ BME280 の値を読みとる>./#gd7e0a5a]]
-- [[NTP で時刻を取得する>./#ld460607]]
-- [[IFTTT を利用する>./#rd103966]]
-- [[Google スプレッドシートに記録する>./#r9db5cb2]]
-- [[Smart Config>./#abb2dd6f]]
-- [[Bluetooth と Bluetooth LE 周り>./#q8090a17]]
-- [[サーボモーターSG90>./#k304b16e]]
-- [[デュアルコアの活用>./#va27dec2]]
~
~
** ESP32 [#n9d817c6]
  中国の Espressif Systems 社が作成したマイクロコントローラで、次の特徴を持つ。
- 特徴
-- Arduino IDE (IDE とは「統合開発環境」のこと)で開発できる。~
(他の開発環境も選択しうる)
-- Wifi 対応(単体で無線LAN接続できる。)
-- Bluetooth 対応(単体でBluetooth接続できる。)
-- dual core なので、2つの処理を同時に行うことができる。
-- 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 を使うことを考えるべき。~
~
- 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.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 をクリックする。~
~
※ 更新については、[[github>https://github.com/espressif/arduino-esp32/releases]]に掲載されている json データの URL(例えば~
https://github.com/espressif/arduino-esp32/releases/download/1.0.1-rc1/package_esp32_dev_index.json )~
を貼り付け古いパッケージを削除して、これをインストールする。~
~
※ ファイルは次の場所に格納されるようである。~
 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 などを選択する。選択しないと通信できない。~
~
+ はまったところ
++ コンパイルがエラーで止まる。~
Mc Afee のウィルス対策ソフトのリアルタイムスキャンが影響している。これを止めると、コンパイルできる。~
~
++ ツール > シリアルポートで選べない。~
USB Type B micro のコネクタが深く刺さっていないと、COMポートが認識できない。~
ちなみに、シリアル通信のデバイスドライバは、Windows が勝手にインストールしてくれる。~
~
++ コンパイルが遅い~
[[このページ(Arduino IDEのビルドを速くする|オブジェクトファイルの出力先を固定する)>https://nagayasu-shinya.com/arduino-buildpath-fix/]]を~
参照して変更すると、少し早くなったように思う。~
~
++ プログラムの書き込みに失敗する~
&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
理由はよくわからない。~
--- 対策1: GNDの接続をチェックする。~
GND が浮いていると同様の現象が発生することがわかった。GND がきちんと接続されているかチェックする。~
~
-- 対策2:github から esptool.py (python プログラム)を取得して実行する。~
--- 対策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 で気圧センサ BME280 の値を読みとる [#gd7e0a5a]
+ 概要~
観測装置として、観測装置の置き場所と、センサの値の回収はいつも問題になる点である。無線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番ピンを使ったほうが良いように思われます。~
~
++ 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 をこれに対応させることができれば、利用範囲は広まる。~
//~
~
** NTP で時刻を取得する [#ld460607]
  ※ 手っ取り早くサンプルプログラムを見たい場合には[[こちら>./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 のような関数を作る必要がある。~
~
~
** 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);
 }

** Google スプレッドシートに記録する [#r9db5cb2]
- 参照URL
-- [[M5stackで温度・湿度をGoogleスプレッドシートに記録してみませんか?(Arduino IDE)>http://www.telomere0101.site/archives/post-1008.html]]~
~
** Smart Config [#abb2dd6f]
- 概要~
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
~
~
** Bluetooth と Bluetooth LE 周り [#q8090a17]
- 参考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 といった情報を取得・表示する方法~
~
~
** サーボモーターSG90 [#k304b16e]
- 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);
    }
 }

** デュアルコアの活用 [#va27dec2]
- 何の話か~
ESP32 は、ESP8266とちがって、dualcore であることを、[[冒頭>./#n9d817c6]]で述べた。例えば、観測データを~
定期的に取得して、ある程度データがたまったらネットワーク経由でどこかに保存する、といった場合、~
ネットワーク通信をしている間に観測がおろそかになる。そこで、同時に2つの仕事をこなせると、好都~
合である。計算機の処理を行う部分(CPU)がひとつしか処理を行えないならそれはできない。ところが、~
ESP32は、CPU に2つのコアを持っているために、2つの処理を同時に行うことができる。データを送信~
するのと同時に、観測データを取得することができる。~
~
そういう話。~
~
- 参考URL
-- [[Dual CoreなESP32でマルチタスクの検証、ラズパイとも勝負!>https://qiita.com/makotaka/items/dd035f4b2db94f87b63c]]
-- [[Arduino &#8211; 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 にしている。~
~

トップ   編集 差分 添付 複製 名前変更 リロード   新規 単語検索 最終更新   ヘルプ   最終更新のRSS