#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 を使うことを考えるべき。~ ~ - 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 -- [[メーカーの資料のダウンロードページ>https://www.espressif.com/en/support/download/overview]] ** 開発用ボード [#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,※); [[中国ボード>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/]]を~ 参照して変更すると、少し早くなったように思う。~ ~ ++ プログラムの書き込みに失敗する~ --- シリアルモニタが開いていたら、これを閉じる。~ --- 通信速度を 115200 に落としてみる。~ ~ *** テストプログラム [#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]])~ ~ ++ 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(Network Time Protocol)は、ネットワークを使って時計を同期するための通信規約である。~ これを用いてネットワーク越しに時刻を特定できる。~ ~ ただし、この方法では、せっかくNTPを使いながら、秒単位での精度でしかない。マイクロ秒単位~ で調整することについては、[[ここ>https://www.esp32.com/viewtopic.php?t=4972]]が参考になるかもしれない。~ ~ + 参考URL -- [[ESP32 NTPを使って時刻をGET>https://qiita.com/coo0659/items/13d36668b2037e38f834]] -- [[ESP32で現在時刻を取得する>http://www.autumn-color.com/archives/839]] + NTPの更新間隔~ https://github.com/espressif/arduino-esp32/blob/master/tools/sdk/include/lwip/lwip/apps/sntp_opts.h を参照すると、 SNTP_UPDATE_DELAY を設定しない限り、1時間に1回更新。~ ~ ** 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); } }