電子工作/ESP32
をテンプレートにして作成
[
トップ
] [
新規
| |
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#topicpath
- 目次
-- [[ESP32とは>./#n9d817c6]]
-- [[ESP32を搭載した開発用ボード>./#y9b3b88c]]
--- [[使用前の準備>./#de64a112]]
--- [[テストプログラム>./#rbc09f2e]]
-- [[磁気センサ(内蔵)>./#z45e3204]]
-- [[タッチセンサ(内蔵)>./#cdaa4e02]]
-- [[LEDを光センサとして使う>./#p99e208f]]
-- [[ADC(Analog-Digital Converter)でより良い精度でデータ...
-- [[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 社が作成したマイクロコントロ...
- 特徴
-- Arduino IDE (IDE とは「統合開発環境」のこと)で開発でき...
(他の開発環境も選択しうる)
-- Wifi 対応(単体で無線LAN接続できる。)
-- Bluetooth 対応(単体でBluetooth接続できる。)
-- dual core なので、2つの処理を同時に行うことができる。
-- ESP8266 の後継。~
~
- 関連するSoC の比較([[lang-ship>https://lang-ship.com/bl...
|比較項目| ESP32,ESP32-S3| ESP-C3 | ESP8266 |h
|対応する無線通信| Wifi, Bluetooth | Wifi, Bluetooth | Wi...
|CPU| 32bit, dualcore, 240MHz | 32bit, singlecore, 160MHz...
|秋月電子でのモジュール名| ESP-WROOM-32,ESP32-S3-WROOM-1-...
|単体の価格(秋月電子) | [[550>http://akizukidenshi.com/ca...
~
Arduino を使ってネットワーク接続をするのであれば、最初か...
~
- SPI~
まず、SPIそのものについては、[[Arduino/SPI]]を参照のこと。~
ESP32 は、SPIにも特徴がある。ESP32 単体で、2つのSPI接続で...
接続できる。ESP32のSPI については、[[ESP32 のSPIについて...
~
- 資料のURL
-- [[Espressif>https://www.espressif.com/]] のページ
--- [[ハードウエアリファレンス>https://docs.espressif.com...
--- [[DevKit Documentation>https://www.espressif.com/en/s...
--- [[資料一覧>https://www.espressif.com/en/support/downl...
-- [[ESP32-WROOM-32>https://ht-deko.com/arduino/esp-wroom...
ESP32について、細かなノウハウも含めて、盛りだくさんの情報...
-- [[the INTERNET of THINGS with ESP32>http://esp32.net]]~
ESP32(の諸々のバリエーション)についてのページ(ただし英語)
-- [[ESP32-dev-moduleのピンマップを確認する。>https://lei...
-- [[ESP32 で利用できる関数のリファレンスマニュアル的なも...
文献情報が少なく、github でソースを探して読むこととは別に...
~
** 開発用ボード [#y9b3b88c]
ESP32用の開発ボードはいくつかある。今回は、Switchscie...
&color(cyan,※); 中国の安いボード([[ESP-32S ESP-32 Dev...
*** 使用前の準備 [#de64a112]
+ ピンヘッダの半田付け~
まずはこれから。これをしないと、プロトタイピングできない。~
~
+ Arduino IDE のダウンロードと初期設定~
-- ポータブルな環境にするには、[["Windows ZIP file for no...
もちろん献金してよい。しかし、献金しなくても "Just Donwlo...
1.8.19 が最新版(2022-08-19 (金) 11:26:12時点)~
~
-- Switchscience の[[解説ページ>http://trac.switch-scienc...
--- ファイル > 環境設定~
設定タブの「追加のボードマネージャーのURL:」に
https://github.com/espressif/arduino-esp32/releases/down...
を書き込み OK をクリックする。~
~
※ github の[[Arduino-ESP32>https://github.com/espressif/a...
※ ファイルは次の場所に格納されるようである。~
C:\Users\[ユーザー名]\AppData\Local\Arduino15\packages\e...
~
--- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポイ...
現れたタブからボードマネージャを選んでクリック。窓に、ESP...
"esp32 by Expressif Systems"が現れる。これをクリックし、...
ボードの定義がダウンロードされてインストールされる。~
~
&color(cyan,※); [[中国ボード>https://www.ebay.com/itm/ESP...
自動的にインストールされない。そのため、対応したドライバ...
[[Silicon labsのページ>https://jp.silabs.com/products/dev...
展開してインストーラを起動すれば~
導入できる。~
~
--- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポイ...
ESP32 Dev Module を選択する。~
~
--- ツール > シリアルポート~
それらしい COM3 などを選択する。選択しないと通信できない。~
~
--- コンパイルに時間がかかることへの対策~
このままだと、コンパイルにかかる時間が尋常ではない。~
[[Qiita Arduino IDE でESP32のコンパイル時間を短縮する方法...
(1) バイナリの場所を固定、(2) ccache を使用するように設定...
~
+ はまったところ
++ コンパイルがエラーで止まる。~
Mc Afee のウィルス対策ソフトのリアルタイムスキャンが影響...
~
++ ツール > シリアルポートで選べない。~
USB Type B micro のコネクタが深く刺さっていないと、COMポ...
ちなみに、シリアル通信のデバイスドライバは、Windows が勝...
~
++ プログラムの書き込みに失敗する~
&color(cyan,※); 主に[[中国ボード>https://www.ebay.com/itm...
→ ボードの BOOT ボタンを押し続ける。(やっと解決。2022-08-...
--- %%シリアルモニタが開いていたら、これを閉じる。%%~
--- %%繰り返してみる。%%~
--- %%通信速度を 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:0...
どうやら、特定のPINが pull up あるいは pull down されてい...
--- 対策1: 12番ピンに何か接続されていたら、これを外して...
SPI に 12番が使われることがあるが、別の番号にしてみること...
~
--- 対策2: GNDの接続をチェックする。~
GND が浮いていると同様の現象が発生することがわかった。GND...
~
// --- 対策2:github から esptool.py (python プログラム)...
// [[github の esptool.py>https://github.com/espressif/es...
// python 環境があるなら
// pip3 install esptool
// で導入し、
// esptool.py -p /dev/ttyUSB0 -b 115200 erase_flash
// などとする。(ただし、Linux の場合)
// --- 対策2: 次のページに書いてあるように、ツールを esp...
// [[SW_RESET continuous reboot>https://www.esp32.com/vie...
~
-- センサの値が変~
[[mgo-tec電子工作>https://www.mgo-tec.com/blog-entry-esp-...
おそらくそれが原因で、センサーの値がきちんと取れないこと...
*** テストプログラム [#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 用のスケッチ例...
次のスケッチが表示される。~
#include "WiFi.h"
void setup()
{
Serial.begin(115200);
// Set WiFi to station mode and disconnect from an A...
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 netwo...
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) == WI...
delay(10);
}
}
Serial.println("");
// Wait a bit before scanning again
delay(5000);
}
うまくいけば、無線LANの情報が表示されるはずである。~
~
// + その他
// ++ ホール素子~
// ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ...
// 内蔵のホールセンサの値(磁場に関係した量)を表示できる。~
// ~
// ++ タッチセンサ~
// ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ...
// GPIO4 のピンからケーブルを伸ばすと、それに接触したかど...
// いわば、タッチセンサ―として機能する。それを試すプログ...
** 磁気センサ(内蔵, ホール素子) [#z45e3204]
#divregion
+ 概要~
内蔵のホールセンサの値(磁場に関係した量)を表示できる。サ...
ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例...
にある。電流が影響するせいか、他のプログラムの影響を受け...
#enddivregion
** タッチセンサ(内蔵) [#cdaa4e02]
#divregion
+ 概要~
ESP32 はタッチセンサが内蔵されている。GPIO 4 ピンを使う。...
ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例...
にある。手で触ると、値が小さくなる。~
#enddivregion
** LEDを光センサとして使う [#p99e208f]
#divregion
+ 概要~
LEDは、電圧をかけて電流を流すと光る。逆に、光を当てると起...
しかし、インピーダンスの関係で、これをそのままESP32 の AD...
対策としていくつかの方法が提案されているが、次のURLの方法...
-- [[SASAPEA'S LAB/LEDを光センサーとして使う。>https:/...
-- [[EDN Japan / LEDを光センサーとして使い、照明強度を計...
#enddivregion
** ADC(Analog-Digital Converter)でより良い精度でデータを...
#divregion
+ 概要~
analogReadMilliVolts()という関数が利用できる。内蔵された...
詳しくは次のページを参照。~
[[kohacraftのblog/ESP32のADCでキャリブレーションされた精...
なお、この方のページは、表面実装部品のはんだ付けに関する...
#enddivregion
** SPI と I2C (プルアップ抵抗について) [#j9f1feba]
#divregion
+ 概要~
近年のセンサは、SPI か I2C でデータを提供できるようになっ...
アナログ信号を末端ユーザがAD変換する時代は終わった(かも...
SPI と I2C について簡単にまとめる。~
| |SPI|I2C|h
|プルアップ抵抗 | 必要ない | 必要|
|線の数(電源、グラウンドを含まない) | 4(or3) | 2 |
|通信速度 | 50M bps 程度 | 100k bps 程度|
通信速度と、プルアップ抵抗が必要ない点で SPI が優れている...
個人的にはプルアップ抵抗を導入するのが面倒なので、もっぱ...
~
ところが、Arduino ではプルアップ抵抗が内蔵されていると知...
&color(red){プルアップ抵抗の設定のオン・オフをプログラム...
となった。~
~
+ サンプルプログラム
++ 配線~
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 pro...
// 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 を勧められたので、これを使うことにした。[[S...
BME280もDPS310も、MEMS で作られたセンサには違いないが、BM...
のに対して、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_simplete...
+++ Digital Pressure Sensorの場合~
ファイル > スケッチ例 > Digital Pressure Sensor > i2c_com...
~
※ Arduino IDE の環境設定で、コンパイラの警告を「全て」に...
&color(red){コンパイルできない};。(エラーで止まる。)ラ...
~
+ 参考URL
-- [[データシート>https://www.infineon.com/dgdl/Infineon-...
-- センサー開発元のライブラリ~
[[Infineon のライブラリ>https://github.com/Infineon/DPS31...
-- Adafruit~
[[Adafruitのライブラリ>https://github.com/adafruit/Adafru...
ただし、 単独では動かず、[[Adafruit BusIO>https://github....
~
#enddivregion
** SPI で気圧センサ BME280 の値を読みとる [#gd7e0a5a]
#divregion
+ 概要~
観測装置として、観測装置の置き場所と、センサの値の回収は...
が使えて、センサーの値を送信できれば好都合である。ESP32と...
SPIについては[[Arduino/SPI]]を参照のこと。~
~
+ 手順
++ 配線する~
[[参考URLに示したページ>https://www.mgo-tec.com/blog-entr...
※ HSPI という ESP32 の SPI 通信の仕組みを使っているので、...
接続するとしているものは、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_BME2...
+++ [[ここ>http://www.humblesoft.com/wiki/?Arduino%E3%83%...
+++ Arduino IDE で スケッチ > ライブラリをインクルード で...
~
++ プログラム~
[[参考URLに示したページ>https://www.mgo-tec.com/blog-entr...
ファイル > スケッチ例 > ESP32_BME280_SPI > ESP32_BME280_S...
を選択して開く。これを実行し、シリアルモニタで値が表示さ...
~
~
+ 参考URL
-- [[Bosch BME280>https://www.bosch-sensortec.com/bst/pro...
[[データシート>https://ae-bst.resource.bosch.com/media/_t...
-- [[Bosch BMP280>https://www.bosch-sensortec.com/bst/pro...
BME280とは違い湿度が測れない。気圧と気温のみ測定できる。~
[[データシート>https://ae-bst.resource.bosch.com/media/_t...
-- [[Arduinoライブラリのインストール(zipファイルで)>htt...
-- [[ESP32 用 BME280 ( 温度 湿度 気圧センサー ) ライブラ...
// ** 学内LAN(Captive Portal)での接続 [#l112b02e]
// ~
// 本学の学内無線LAN は "Captive Portal" と呼ばれる仕組み...
// ESP32 をこれに対応させることができれば、利用範囲は広ま...
//~
~
#enddivregion
** NTP で時刻を取得する [#ld460607]
#divregion
※ 手っ取り早くサンプルプログラムを見たい場合には[[こ...
- 概要~
NTP(Network Time Protocol)は、ネットワークを使って時計を...
これを用いてネットワーク越しに時刻を特定できる。~
~
ただし、パケットの往復にかかる時間などを考えると、実際に ...
わりと複雑な処理をしなければならない。そこで、マイコンレ...
簡単な方法を使って、ある程度いい加減に時計を合わせること...
ると、標準的な関数を使ったり、NTPClient ライブラリを使っ...
それよりも精度よく合わせたい場合には、工夫が必要になる。~
~
-- NTPプロトコルについての参考資料
--- https://milestone-of-se.nesuke.com/I7protocol/ntp/ntp...
--- http://www.venus.dti.ne.jp/~yoshi-o/NTP/NTP-SNTP_Form...
+ 標準的な関数で時計を合わせる方法
-- 参考資料
--- スケッチ例 > ESP32 > time > Simpletime~
このプログラム(スケッチ)は、lwIP(lightweight IP)のSNTP...
テムで用いられるような関数が使われていることから、ESP32 ...
ることをうかがわせる。~
しかし、どのような関数があるのか、調べ方がわからないのは...
~
--- https://github.com/espressif/esp-idf/tree/master/exam...
時間の関数について、ちょっと情報がわかる。~
~
--- time_opts.h~
ESP32 関連のファイルの中から time_opts.h を探して、あるい...
照する。すると、 SNTP_UPDATE_DELAY で、時刻の同期が1時間...
https://github.com/espressif/arduino-esp32/blob/master/to...
~
--- lwipopts.h~
あるいは次の URL。settimeofday の使われ方で秒単位での精度...
https://github.com/espressif/arduino-esp32/blob/96822d783...
~
--- その他のプログラム例~
[[ESP32 NTPを使って時刻をGET>https://qiita.com/coo0659/it...
[[ESP32で現在時刻を取得する>http://www.autumn-color.com/a...
~
+ NTPClient ライブラリを使った方法
-- 参考資料
--- [[github>https://github.com/arduino-libraries/NTPClie...
Arduino 汎用のライブラリ。ソースが読めるので、何をしてい...
な関数は Arduino そのものには実装されていないために、年月...
~
時刻の同期についても、1秒単位であり、現在の時刻と差が1秒...
~
+ その他の方法~
結局自分は[[自作>./NTP/NTP_SampleProgram]]した。NTPClient...
1秒以下の値もコントロールできるし、更新時間間隔(同期する...
自作したサンプルプログラムについては、[[こちら>./NTP/NTP_...
-- 参考資料
--- [[KERI's Lab ESP32で時間取得>https://kerikeri.top/pos...
同じ発想。しかも私よりもずっと先。定期的に同期するには NT...
~
~
#enddivregion
** IFTTT を利用する [#rd103966]
#divregion
+ IFTTT を使う際の考え方~
[[こちらのページ>../IFTTT]]にまとめた。IFTTTの [[webhooks...
https で ifttt.com に HTTP の POST あるいは GET でデータ...
~
+ https で特定のサイトにアクセスする。~
-- 予備知識~
ブラウザは、http と https を区別なくアクセスするように見...
開設されているサイトにアクセスするには、工夫が必要になる...
ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例...
で得られる。~
~
-- 証明書の取得~
「[[ESP32からIFTTTを使ってLINE Notifyで通知を送ってみた/...
送信先であるifttt.comにアクセスするための証明書を取得する...
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UE...
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY...
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290...
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3...
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw...
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEx...
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBH...
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3...
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuer...
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOo...
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SS...
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl...
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz...
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD...
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ...
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1...
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95...
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb...
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1...
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0...
4uJEvlz36hz1
-----END CERTIFICATE-----
~
-- IFTTT への通信~
HTTP の GET あるいは POST という方法でデータを送信する。...
--- 「[[IFTTTのトリガーおよびアクションをESP8266で実行す...
--- 「[[ESP8266を使って温度センサ情報をIFTTTに投げる/コ...
--- 「[[IFTTTにMaker Channelができました。>http://mag.swi...
~
-- スケッチのサンプル~
そんなこんなで作成したスケッチのサンプルを示す。~
4番ピンに触ると、IFTTT へのトリガーとして働くスケッチ。X...
ユーザーが設定する項目であることを示している。~
WiFiIDs.h
const char* ssid = "XXXXXXXXXXXXX"; // you...
const char* password = "XXXXXXXXXXXXX"; // you...
const char* IFTTTkey = "XXXXXXXXXXXXXXXXXXXXXX"; // IFT...
const char* server = "maker.ifttt.com"; // Ser...
const char* EventName = "XXXXXXXXXX"; // IFT...
const char* ifttt_root_ca= \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA...
"EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxG...
"EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb...
"ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXD...
"NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hM...
"EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jL...
"AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgL...
"DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJG...
"E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwI...
"/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6...
"DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU...
"GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFY...
"tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFca...
"AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwH...
"FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBA...
"WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+...
"9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJ...
"gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN...
"2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855...
"LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p...
"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...
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スプレッドシートに記録し...
~
#enddivregion
** Smart Config [#abb2dd6f]
#divregion
- 概要~
ESP32 は、手軽にあちこちで Wi-Fi に接続できるところに魅力...
SSID などをプログラムに書き込んでいては、場所場所でプログ...
それを避けるために、ESP32 が起動したら、一旦、ウェブサー...
バーに SSID などを送信して接続する。専用のスマホのアプリ...
ば、逆に、どこでも接続できる。~
~
- 参考URLなど
-- [[ESP32にSmartConfigでWiFi情報を伝える>https://keriker...
-- [[Google Play で検索>https://play.google.com/store/sea...
-- [[Espressif esptouch(Apple Store)>https://itunes.apple...
-- ファイル > スケッチ例 > Wi Fi > Wi Fi Smart Config
~
~
#enddivregion
** Bluetooth と Bluetooth LE 周り(未完) [#q8090a17]
#divregion
- 参考URLなど
-- [[MAC アドレス等を取得する>https://www.mgo-tec.com/blo...
-- [[ESP-WROOM-32でiBeaconをスキャンする>http://blog.live...
Arduino IDE を使って iBeacon の UUID Major, Minor といっ...
~
~
#enddivregion
** サーボモーターSG90 [#k304b16e]
#divregion
- SG90について~
とても安価なサーボモーター
-- 購入
--- [[秋月電子 gM-08761>http://akizukidenshi.com/catalog/...
--- [[eBay>https://www.ebay.com/sch/i.html?_from=R40&_trk...
-- 配線
--- [[秋月電子に掲載のデータシート>http://akizukidenshi.c...
茶:GND(マイナス)~
赤:VCC(プラス)~
オレンジ:PMW(制御)~
~
- 利用方法
-- ライブラリ~
ESP32 が Arduino と同様の開発環境が使えるからといって、全...
Arduino にはServo というライブラリがあるが、これは使えな...
--- 対策~
1. 上記のページを参照して、LEDの PWM 出力のライブラリを使...
2. ESP32 用のサーボモータのライブラリを用いる。(cf. [[Qii...
-- プログラム~
上記の 1. の方について、制御線を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 の可動範囲...
// -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 であることを、[[冒...
定期的に取得して、ある程度データがたまったらネットワーク...
ネットワーク通信をしている間に観測がおろそかになる。そこ...
合である。計算機の処理を行う部分(CPU)がひとつしか処理を行...
ESP32は、CPU に2つのコアを持っているために、2つの処理を...
するのと同時に、観測データを取得することができる。~
~
そういう話。~
~
- 参考URL
-- [[Dual CoreなESP32でマルチタスクの検証、ラズパイとも勝...
-- [[Arduino – ESP32 のマルチタスク ( Dual Core ) ...
~
~
- サンプルコード~
上記のページを、ほぼそのままパクっている。~
~
#include "freertos/task.h"
void タスク名(void *pvParameters){
while(1){
loop()と並行して実行したいプログラムを書くところ
}
}
void setup(){
xTaskCreatePinnedToCore( タスク名, "タスク名", 4096, N...
}
void loop(){
}
ほぼ、このまま何も考えずに使える。~
~
- 注意:~
ただし、下記の点に注意する。~
+++ タスク名 と書かれたところは同一の名前(ただし日本語で...
( "タスク名" はその限りではないがわかりやすさのため )
+++ void タスク名() は終了させない。 while(1) で回してお...
+++ while(1) で回しているプログラムの中に、少なくとも del...
これがないと、watchdog がどうのこうのと怒られる。~
cf. [[ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシュ...
+++ xTask…… の NULL で挟まれた 1 は優先順位を表している。...
+++ xTask…… の最後の 0 は、コアの ID である。普通の loop ...
それとは別に動かすので、0 にしている。~
~
#enddivregion
** ESP32-CAM [#sd313114]
#divregion
- デバイス~
-- ESP32-CAM~
ESP32 とカメラ(OV2640)とがセットで安価で売られている。例...
&ref(https://i.ebayimg.com/images/g/SlEAAOSw2Whdm~j...
ちなみにここに掲載したもの(ESP32-S)は技適マークがない。~
しかし、ESP32-Sは[[工事設計認証を受けている>https://www.t...
-- USB-TTL~
ESP32-CAM は、パソコンと直接接続することができない。パソ...
そこで、USB-TTL (TTL: Transistor-Transistor-Logic だそう...
&ref(https://www.amazon.co.jp/images/I/61cy9E8XD7L._AC_SL...
- デザイン~
次のようなものを作りたい。
-- Wifi で接続する。
-- Smartconfig(※) であとから IP アドレスが設定できる。~
※ スマホなどにアプリを入れて ESP32 と事前に通信し ESP32 ...
-- 再起動したときに、Smartconfig を使わなくても以前の IP ...
-- IPアドレスを容易に確認できる。~
添付のプログラム(&ref(TEST.ino);)通りで実行すると、esp32c...
-- 動画を配信できる。
-- 静止画も取得できる。
- 作成
-- Arduino IDE に ESP32 core を入れる。
-- [[Micro-RTSP>https://github.com/geeksville/Micro-RTSP]...
-- Micro-RTSPのサンプルプログラムを改変して作成する。(改...
-- 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 での動画のアクセス~
http://IPアドレス/ でアクセスできる。
-- HTTP で静止画を取得~
http://IPアドレス/jpg でアクセスできる。
RTSP や、HTTP の動画を待機しているせいか、応答が遅れるこ...
タイムラプス動画用に静止画を取得するのには使えなさそう。
- 資料
-- 参考URL
--- [[Micro-RTSP>https://github.com/geeksville/Micro-RTSP...
ここのサンプルプログラムをベースに、少しだけ改変した。
--- [[ESP32カメラモジュール+HTTP+RTSP+OTA+mDNS>http:/...
同じようなことを考える人がいるものである。~
ただ、情報が古く、現時点の Micro-RTSP のライブラリでは使...
添付のファイル(&ref(TEST.ino);)では、OTA は実現していない。
--- [[Ai-Thinker ESP32-CAM in the Arduino IDE>https://rob...
--- [[CameraWebserver2SD>https://github.com/v12345vtm/Cam...
NTPしながら画像をSDカードに収める。
ライブラリのサンプルプログラムに基いた情報
-- その他のヒント
--- カメラが認識できないようなメッセージが出て動かないこ...
#enddivregion
終了行:
#topicpath
- 目次
-- [[ESP32とは>./#n9d817c6]]
-- [[ESP32を搭載した開発用ボード>./#y9b3b88c]]
--- [[使用前の準備>./#de64a112]]
--- [[テストプログラム>./#rbc09f2e]]
-- [[磁気センサ(内蔵)>./#z45e3204]]
-- [[タッチセンサ(内蔵)>./#cdaa4e02]]
-- [[LEDを光センサとして使う>./#p99e208f]]
-- [[ADC(Analog-Digital Converter)でより良い精度でデータ...
-- [[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 社が作成したマイクロコントロ...
- 特徴
-- Arduino IDE (IDE とは「統合開発環境」のこと)で開発でき...
(他の開発環境も選択しうる)
-- Wifi 対応(単体で無線LAN接続できる。)
-- Bluetooth 対応(単体でBluetooth接続できる。)
-- dual core なので、2つの処理を同時に行うことができる。
-- ESP8266 の後継。~
~
- 関連するSoC の比較([[lang-ship>https://lang-ship.com/bl...
|比較項目| ESP32,ESP32-S3| ESP-C3 | ESP8266 |h
|対応する無線通信| Wifi, Bluetooth | Wifi, Bluetooth | Wi...
|CPU| 32bit, dualcore, 240MHz | 32bit, singlecore, 160MHz...
|秋月電子でのモジュール名| ESP-WROOM-32,ESP32-S3-WROOM-1-...
|単体の価格(秋月電子) | [[550>http://akizukidenshi.com/ca...
~
Arduino を使ってネットワーク接続をするのであれば、最初か...
~
- SPI~
まず、SPIそのものについては、[[Arduino/SPI]]を参照のこと。~
ESP32 は、SPIにも特徴がある。ESP32 単体で、2つのSPI接続で...
接続できる。ESP32のSPI については、[[ESP32 のSPIについて...
~
- 資料のURL
-- [[Espressif>https://www.espressif.com/]] のページ
--- [[ハードウエアリファレンス>https://docs.espressif.com...
--- [[DevKit Documentation>https://www.espressif.com/en/s...
--- [[資料一覧>https://www.espressif.com/en/support/downl...
-- [[ESP32-WROOM-32>https://ht-deko.com/arduino/esp-wroom...
ESP32について、細かなノウハウも含めて、盛りだくさんの情報...
-- [[the INTERNET of THINGS with ESP32>http://esp32.net]]~
ESP32(の諸々のバリエーション)についてのページ(ただし英語)
-- [[ESP32-dev-moduleのピンマップを確認する。>https://lei...
-- [[ESP32 で利用できる関数のリファレンスマニュアル的なも...
文献情報が少なく、github でソースを探して読むこととは別に...
~
** 開発用ボード [#y9b3b88c]
ESP32用の開発ボードはいくつかある。今回は、Switchscie...
&color(cyan,※); 中国の安いボード([[ESP-32S ESP-32 Dev...
*** 使用前の準備 [#de64a112]
+ ピンヘッダの半田付け~
まずはこれから。これをしないと、プロトタイピングできない。~
~
+ Arduino IDE のダウンロードと初期設定~
-- ポータブルな環境にするには、[["Windows ZIP file for no...
もちろん献金してよい。しかし、献金しなくても "Just Donwlo...
1.8.19 が最新版(2022-08-19 (金) 11:26:12時点)~
~
-- Switchscience の[[解説ページ>http://trac.switch-scienc...
--- ファイル > 環境設定~
設定タブの「追加のボードマネージャーのURL:」に
https://github.com/espressif/arduino-esp32/releases/down...
を書き込み OK をクリックする。~
~
※ github の[[Arduino-ESP32>https://github.com/espressif/a...
※ ファイルは次の場所に格納されるようである。~
C:\Users\[ユーザー名]\AppData\Local\Arduino15\packages\e...
~
--- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポイ...
現れたタブからボードマネージャを選んでクリック。窓に、ESP...
"esp32 by Expressif Systems"が現れる。これをクリックし、...
ボードの定義がダウンロードされてインストールされる。~
~
&color(cyan,※); [[中国ボード>https://www.ebay.com/itm/ESP...
自動的にインストールされない。そのため、対応したドライバ...
[[Silicon labsのページ>https://jp.silabs.com/products/dev...
展開してインストーラを起動すれば~
導入できる。~
~
--- ツール > ボード:"Arduiono/Genuin Uno" にマウスのポイ...
ESP32 Dev Module を選択する。~
~
--- ツール > シリアルポート~
それらしい COM3 などを選択する。選択しないと通信できない。~
~
--- コンパイルに時間がかかることへの対策~
このままだと、コンパイルにかかる時間が尋常ではない。~
[[Qiita Arduino IDE でESP32のコンパイル時間を短縮する方法...
(1) バイナリの場所を固定、(2) ccache を使用するように設定...
~
+ はまったところ
++ コンパイルがエラーで止まる。~
Mc Afee のウィルス対策ソフトのリアルタイムスキャンが影響...
~
++ ツール > シリアルポートで選べない。~
USB Type B micro のコネクタが深く刺さっていないと、COMポ...
ちなみに、シリアル通信のデバイスドライバは、Windows が勝...
~
++ プログラムの書き込みに失敗する~
&color(cyan,※); 主に[[中国ボード>https://www.ebay.com/itm...
→ ボードの BOOT ボタンを押し続ける。(やっと解決。2022-08-...
--- %%シリアルモニタが開いていたら、これを閉じる。%%~
--- %%繰り返してみる。%%~
--- %%通信速度を 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:0...
どうやら、特定のPINが pull up あるいは pull down されてい...
--- 対策1: 12番ピンに何か接続されていたら、これを外して...
SPI に 12番が使われることがあるが、別の番号にしてみること...
~
--- 対策2: GNDの接続をチェックする。~
GND が浮いていると同様の現象が発生することがわかった。GND...
~
// --- 対策2:github から esptool.py (python プログラム)...
// [[github の esptool.py>https://github.com/espressif/es...
// python 環境があるなら
// pip3 install esptool
// で導入し、
// esptool.py -p /dev/ttyUSB0 -b 115200 erase_flash
// などとする。(ただし、Linux の場合)
// --- 対策2: 次のページに書いてあるように、ツールを esp...
// [[SW_RESET continuous reboot>https://www.esp32.com/vie...
~
-- センサの値が変~
[[mgo-tec電子工作>https://www.mgo-tec.com/blog-entry-esp-...
おそらくそれが原因で、センサーの値がきちんと取れないこと...
*** テストプログラム [#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 用のスケッチ例...
次のスケッチが表示される。~
#include "WiFi.h"
void setup()
{
Serial.begin(115200);
// Set WiFi to station mode and disconnect from an A...
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 netwo...
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) == WI...
delay(10);
}
}
Serial.println("");
// Wait a bit before scanning again
delay(5000);
}
うまくいけば、無線LANの情報が表示されるはずである。~
~
// + その他
// ++ ホール素子~
// ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ...
// 内蔵のホールセンサの値(磁場に関係した量)を表示できる。~
// ~
// ++ タッチセンサ~
// ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ...
// GPIO4 のピンからケーブルを伸ばすと、それに接触したかど...
// いわば、タッチセンサ―として機能する。それを試すプログ...
** 磁気センサ(内蔵, ホール素子) [#z45e3204]
#divregion
+ 概要~
内蔵のホールセンサの値(磁場に関係した量)を表示できる。サ...
ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例...
にある。電流が影響するせいか、他のプログラムの影響を受け...
#enddivregion
** タッチセンサ(内蔵) [#cdaa4e02]
#divregion
+ 概要~
ESP32 はタッチセンサが内蔵されている。GPIO 4 ピンを使う。...
ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例...
にある。手で触ると、値が小さくなる。~
#enddivregion
** LEDを光センサとして使う [#p99e208f]
#divregion
+ 概要~
LEDは、電圧をかけて電流を流すと光る。逆に、光を当てると起...
しかし、インピーダンスの関係で、これをそのままESP32 の AD...
対策としていくつかの方法が提案されているが、次のURLの方法...
-- [[SASAPEA'S LAB/LEDを光センサーとして使う。>https:/...
-- [[EDN Japan / LEDを光センサーとして使い、照明強度を計...
#enddivregion
** ADC(Analog-Digital Converter)でより良い精度でデータを...
#divregion
+ 概要~
analogReadMilliVolts()という関数が利用できる。内蔵された...
詳しくは次のページを参照。~
[[kohacraftのblog/ESP32のADCでキャリブレーションされた精...
なお、この方のページは、表面実装部品のはんだ付けに関する...
#enddivregion
** SPI と I2C (プルアップ抵抗について) [#j9f1feba]
#divregion
+ 概要~
近年のセンサは、SPI か I2C でデータを提供できるようになっ...
アナログ信号を末端ユーザがAD変換する時代は終わった(かも...
SPI と I2C について簡単にまとめる。~
| |SPI|I2C|h
|プルアップ抵抗 | 必要ない | 必要|
|線の数(電源、グラウンドを含まない) | 4(or3) | 2 |
|通信速度 | 50M bps 程度 | 100k bps 程度|
通信速度と、プルアップ抵抗が必要ない点で SPI が優れている...
個人的にはプルアップ抵抗を導入するのが面倒なので、もっぱ...
~
ところが、Arduino ではプルアップ抵抗が内蔵されていると知...
&color(red){プルアップ抵抗の設定のオン・オフをプログラム...
となった。~
~
+ サンプルプログラム
++ 配線~
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 pro...
// 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 を勧められたので、これを使うことにした。[[S...
BME280もDPS310も、MEMS で作られたセンサには違いないが、BM...
のに対して、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_simplete...
+++ Digital Pressure Sensorの場合~
ファイル > スケッチ例 > Digital Pressure Sensor > i2c_com...
~
※ Arduino IDE の環境設定で、コンパイラの警告を「全て」に...
&color(red){コンパイルできない};。(エラーで止まる。)ラ...
~
+ 参考URL
-- [[データシート>https://www.infineon.com/dgdl/Infineon-...
-- センサー開発元のライブラリ~
[[Infineon のライブラリ>https://github.com/Infineon/DPS31...
-- Adafruit~
[[Adafruitのライブラリ>https://github.com/adafruit/Adafru...
ただし、 単独では動かず、[[Adafruit BusIO>https://github....
~
#enddivregion
** SPI で気圧センサ BME280 の値を読みとる [#gd7e0a5a]
#divregion
+ 概要~
観測装置として、観測装置の置き場所と、センサの値の回収は...
が使えて、センサーの値を送信できれば好都合である。ESP32と...
SPIについては[[Arduino/SPI]]を参照のこと。~
~
+ 手順
++ 配線する~
[[参考URLに示したページ>https://www.mgo-tec.com/blog-entr...
※ HSPI という ESP32 の SPI 通信の仕組みを使っているので、...
接続するとしているものは、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_BME2...
+++ [[ここ>http://www.humblesoft.com/wiki/?Arduino%E3%83%...
+++ Arduino IDE で スケッチ > ライブラリをインクルード で...
~
++ プログラム~
[[参考URLに示したページ>https://www.mgo-tec.com/blog-entr...
ファイル > スケッチ例 > ESP32_BME280_SPI > ESP32_BME280_S...
を選択して開く。これを実行し、シリアルモニタで値が表示さ...
~
~
+ 参考URL
-- [[Bosch BME280>https://www.bosch-sensortec.com/bst/pro...
[[データシート>https://ae-bst.resource.bosch.com/media/_t...
-- [[Bosch BMP280>https://www.bosch-sensortec.com/bst/pro...
BME280とは違い湿度が測れない。気圧と気温のみ測定できる。~
[[データシート>https://ae-bst.resource.bosch.com/media/_t...
-- [[Arduinoライブラリのインストール(zipファイルで)>htt...
-- [[ESP32 用 BME280 ( 温度 湿度 気圧センサー ) ライブラ...
// ** 学内LAN(Captive Portal)での接続 [#l112b02e]
// ~
// 本学の学内無線LAN は "Captive Portal" と呼ばれる仕組み...
// ESP32 をこれに対応させることができれば、利用範囲は広ま...
//~
~
#enddivregion
** NTP で時刻を取得する [#ld460607]
#divregion
※ 手っ取り早くサンプルプログラムを見たい場合には[[こ...
- 概要~
NTP(Network Time Protocol)は、ネットワークを使って時計を...
これを用いてネットワーク越しに時刻を特定できる。~
~
ただし、パケットの往復にかかる時間などを考えると、実際に ...
わりと複雑な処理をしなければならない。そこで、マイコンレ...
簡単な方法を使って、ある程度いい加減に時計を合わせること...
ると、標準的な関数を使ったり、NTPClient ライブラリを使っ...
それよりも精度よく合わせたい場合には、工夫が必要になる。~
~
-- NTPプロトコルについての参考資料
--- https://milestone-of-se.nesuke.com/I7protocol/ntp/ntp...
--- http://www.venus.dti.ne.jp/~yoshi-o/NTP/NTP-SNTP_Form...
+ 標準的な関数で時計を合わせる方法
-- 参考資料
--- スケッチ例 > ESP32 > time > Simpletime~
このプログラム(スケッチ)は、lwIP(lightweight IP)のSNTP...
テムで用いられるような関数が使われていることから、ESP32 ...
ることをうかがわせる。~
しかし、どのような関数があるのか、調べ方がわからないのは...
~
--- https://github.com/espressif/esp-idf/tree/master/exam...
時間の関数について、ちょっと情報がわかる。~
~
--- time_opts.h~
ESP32 関連のファイルの中から time_opts.h を探して、あるい...
照する。すると、 SNTP_UPDATE_DELAY で、時刻の同期が1時間...
https://github.com/espressif/arduino-esp32/blob/master/to...
~
--- lwipopts.h~
あるいは次の URL。settimeofday の使われ方で秒単位での精度...
https://github.com/espressif/arduino-esp32/blob/96822d783...
~
--- その他のプログラム例~
[[ESP32 NTPを使って時刻をGET>https://qiita.com/coo0659/it...
[[ESP32で現在時刻を取得する>http://www.autumn-color.com/a...
~
+ NTPClient ライブラリを使った方法
-- 参考資料
--- [[github>https://github.com/arduino-libraries/NTPClie...
Arduino 汎用のライブラリ。ソースが読めるので、何をしてい...
な関数は Arduino そのものには実装されていないために、年月...
~
時刻の同期についても、1秒単位であり、現在の時刻と差が1秒...
~
+ その他の方法~
結局自分は[[自作>./NTP/NTP_SampleProgram]]した。NTPClient...
1秒以下の値もコントロールできるし、更新時間間隔(同期する...
自作したサンプルプログラムについては、[[こちら>./NTP/NTP_...
-- 参考資料
--- [[KERI's Lab ESP32で時間取得>https://kerikeri.top/pos...
同じ発想。しかも私よりもずっと先。定期的に同期するには NT...
~
~
#enddivregion
** IFTTT を利用する [#rd103966]
#divregion
+ IFTTT を使う際の考え方~
[[こちらのページ>../IFTTT]]にまとめた。IFTTTの [[webhooks...
https で ifttt.com に HTTP の POST あるいは GET でデータ...
~
+ https で特定のサイトにアクセスする。~
-- 予備知識~
ブラウザは、http と https を区別なくアクセスするように見...
開設されているサイトにアクセスするには、工夫が必要になる...
ファイル > スケッチ例 > (EES32 Dev Module 用のスケッチ例...
で得られる。~
~
-- 証明書の取得~
「[[ESP32からIFTTTを使ってLINE Notifyで通知を送ってみた/...
送信先であるifttt.comにアクセスするための証明書を取得する...
-----BEGIN CERTIFICATE-----
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UE...
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY...
EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290...
ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3...
NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw...
EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEx...
AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBH...
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3...
E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuer...
/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOo...
DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SS...
GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl...
tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz...
AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD...
FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ...
WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1...
9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95...
gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb...
2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1...
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0...
4uJEvlz36hz1
-----END CERTIFICATE-----
~
-- IFTTT への通信~
HTTP の GET あるいは POST という方法でデータを送信する。...
--- 「[[IFTTTのトリガーおよびアクションをESP8266で実行す...
--- 「[[ESP8266を使って温度センサ情報をIFTTTに投げる/コ...
--- 「[[IFTTTにMaker Channelができました。>http://mag.swi...
~
-- スケッチのサンプル~
そんなこんなで作成したスケッチのサンプルを示す。~
4番ピンに触ると、IFTTT へのトリガーとして働くスケッチ。X...
ユーザーが設定する項目であることを示している。~
WiFiIDs.h
const char* ssid = "XXXXXXXXXXXXX"; // you...
const char* password = "XXXXXXXXXXXXX"; // you...
const char* IFTTTkey = "XXXXXXXXXXXXXXXXXXXXXX"; // IFT...
const char* server = "maker.ifttt.com"; // Ser...
const char* EventName = "XXXXXXXXXX"; // IFT...
const char* ifttt_root_ca= \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA...
"EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxG...
"EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb...
"ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXD...
"NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hM...
"EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jL...
"AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgL...
"DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJG...
"E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwI...
"/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6...
"DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU...
"GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFY...
"tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFca...
"AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwH...
"FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBA...
"WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+...
"9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJ...
"gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN...
"2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855...
"LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p...
"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...
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スプレッドシートに記録し...
~
#enddivregion
** Smart Config [#abb2dd6f]
#divregion
- 概要~
ESP32 は、手軽にあちこちで Wi-Fi に接続できるところに魅力...
SSID などをプログラムに書き込んでいては、場所場所でプログ...
それを避けるために、ESP32 が起動したら、一旦、ウェブサー...
バーに SSID などを送信して接続する。専用のスマホのアプリ...
ば、逆に、どこでも接続できる。~
~
- 参考URLなど
-- [[ESP32にSmartConfigでWiFi情報を伝える>https://keriker...
-- [[Google Play で検索>https://play.google.com/store/sea...
-- [[Espressif esptouch(Apple Store)>https://itunes.apple...
-- ファイル > スケッチ例 > Wi Fi > Wi Fi Smart Config
~
~
#enddivregion
** Bluetooth と Bluetooth LE 周り(未完) [#q8090a17]
#divregion
- 参考URLなど
-- [[MAC アドレス等を取得する>https://www.mgo-tec.com/blo...
-- [[ESP-WROOM-32でiBeaconをスキャンする>http://blog.live...
Arduino IDE を使って iBeacon の UUID Major, Minor といっ...
~
~
#enddivregion
** サーボモーターSG90 [#k304b16e]
#divregion
- SG90について~
とても安価なサーボモーター
-- 購入
--- [[秋月電子 gM-08761>http://akizukidenshi.com/catalog/...
--- [[eBay>https://www.ebay.com/sch/i.html?_from=R40&_trk...
-- 配線
--- [[秋月電子に掲載のデータシート>http://akizukidenshi.c...
茶:GND(マイナス)~
赤:VCC(プラス)~
オレンジ:PMW(制御)~
~
- 利用方法
-- ライブラリ~
ESP32 が Arduino と同様の開発環境が使えるからといって、全...
Arduino にはServo というライブラリがあるが、これは使えな...
--- 対策~
1. 上記のページを参照して、LEDの PWM 出力のライブラリを使...
2. ESP32 用のサーボモータのライブラリを用いる。(cf. [[Qii...
-- プログラム~
上記の 1. の方について、制御線を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 の可動範囲...
// -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 であることを、[[冒...
定期的に取得して、ある程度データがたまったらネットワーク...
ネットワーク通信をしている間に観測がおろそかになる。そこ...
合である。計算機の処理を行う部分(CPU)がひとつしか処理を行...
ESP32は、CPU に2つのコアを持っているために、2つの処理を...
するのと同時に、観測データを取得することができる。~
~
そういう話。~
~
- 参考URL
-- [[Dual CoreなESP32でマルチタスクの検証、ラズパイとも勝...
-- [[Arduino – ESP32 のマルチタスク ( Dual Core ) ...
~
~
- サンプルコード~
上記のページを、ほぼそのままパクっている。~
~
#include "freertos/task.h"
void タスク名(void *pvParameters){
while(1){
loop()と並行して実行したいプログラムを書くところ
}
}
void setup(){
xTaskCreatePinnedToCore( タスク名, "タスク名", 4096, N...
}
void loop(){
}
ほぼ、このまま何も考えずに使える。~
~
- 注意:~
ただし、下記の点に注意する。~
+++ タスク名 と書かれたところは同一の名前(ただし日本語で...
( "タスク名" はその限りではないがわかりやすさのため )
+++ void タスク名() は終了させない。 while(1) で回してお...
+++ while(1) で回しているプログラムの中に、少なくとも del...
これがないと、watchdog がどうのこうのと怒られる。~
cf. [[ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシュ...
+++ xTask…… の NULL で挟まれた 1 は優先順位を表している。...
+++ xTask…… の最後の 0 は、コアの ID である。普通の loop ...
それとは別に動かすので、0 にしている。~
~
#enddivregion
** ESP32-CAM [#sd313114]
#divregion
- デバイス~
-- ESP32-CAM~
ESP32 とカメラ(OV2640)とがセットで安価で売られている。例...
&ref(https://i.ebayimg.com/images/g/SlEAAOSw2Whdm~j...
ちなみにここに掲載したもの(ESP32-S)は技適マークがない。~
しかし、ESP32-Sは[[工事設計認証を受けている>https://www.t...
-- USB-TTL~
ESP32-CAM は、パソコンと直接接続することができない。パソ...
そこで、USB-TTL (TTL: Transistor-Transistor-Logic だそう...
&ref(https://www.amazon.co.jp/images/I/61cy9E8XD7L._AC_SL...
- デザイン~
次のようなものを作りたい。
-- Wifi で接続する。
-- Smartconfig(※) であとから IP アドレスが設定できる。~
※ スマホなどにアプリを入れて ESP32 と事前に通信し ESP32 ...
-- 再起動したときに、Smartconfig を使わなくても以前の IP ...
-- IPアドレスを容易に確認できる。~
添付のプログラム(&ref(TEST.ino);)通りで実行すると、esp32c...
-- 動画を配信できる。
-- 静止画も取得できる。
- 作成
-- Arduino IDE に ESP32 core を入れる。
-- [[Micro-RTSP>https://github.com/geeksville/Micro-RTSP]...
-- Micro-RTSPのサンプルプログラムを改変して作成する。(改...
-- 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 での動画のアクセス~
http://IPアドレス/ でアクセスできる。
-- HTTP で静止画を取得~
http://IPアドレス/jpg でアクセスできる。
RTSP や、HTTP の動画を待機しているせいか、応答が遅れるこ...
タイムラプス動画用に静止画を取得するのには使えなさそう。
- 資料
-- 参考URL
--- [[Micro-RTSP>https://github.com/geeksville/Micro-RTSP...
ここのサンプルプログラムをベースに、少しだけ改変した。
--- [[ESP32カメラモジュール+HTTP+RTSP+OTA+mDNS>http:/...
同じようなことを考える人がいるものである。~
ただ、情報が古く、現時点の Micro-RTSP のライブラリでは使...
添付のファイル(&ref(TEST.ino);)では、OTA は実現していない。
--- [[Ai-Thinker ESP32-CAM in the Arduino IDE>https://rob...
--- [[CameraWebserver2SD>https://github.com/v12345vtm/Cam...
NTPしながら画像をSDカードに収める。
ライブラリのサンプルプログラムに基いた情報
-- その他のヒント
--- カメラが認識できないようなメッセージが出て動かないこ...
#enddivregion
ページ名: