ESP32でファイル読み込み

https://github.com/earlephilhower/arduino-littlefs-upload

https://qiita.com/kumakumao/items/be51f174bfeb0e4a6a06

Debugモニターは必ず閉じる

Upload成功

こんな感じでファイルを返却できる様になります

#include <WiFi.h>
#include <WebServer.h>
#include <LittleFS.h>

const char* ssid = "YOUR_SSID";
const char* pass = "YOUR_PASS";

WebServer server(80);

String contentType(const String& path) {
  if (path.endsWith(".html")) return "text/html; charset=utf-8";
  if (path.endsWith(".css"))  return "text/css; charset=utf-8";
  if (path.endsWith(".js"))   return "application/javascript; charset=utf-8";
  if (path.endsWith(".png"))  return "image/png";
  if (path.endsWith(".jpg"))  return "image/jpeg";
  if (path.endsWith(".ico"))  return "image/x-icon";
  return "text/plain; charset=utf-8";
}

bool handleFileRead(String path) {
  if (path.endsWith("/")) path += "index.html";

  if (!LittleFS.exists(path)) return false;

  File file = LittleFS.open(path, "r");
  server.streamFile(file, contentType(path));
  file.close();
  return true;
}

void setup() {
  Serial.begin(115200);

  if (!LittleFS.begin(true)) {
    Serial.println("LittleFS mount failed");
    return;
  }

  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  // どんなURLでも、LittleFS上のファイルを探して返す
  server.onNotFound([]() {
    if (!handleFileRead(server.uri())) {
      server.send(404, "text/plain; charset=utf-8", "Not Found");
    }
  });

  server.begin();
}

void loop() {
  server.handleClient();
}

ESP32でサーボ

秋月電子で売られているこのキットを動かすための準備です

2WD Mini Robot Mobile Platform Kit: キット一般 秋月電子通商-電子部品・ネット通販

ギヤードモータ(FM90)を2つ、モータドライバコントローラFT-SMC-4ch経由でコントロールします このモータはサーボのように信号線があり、サーボと違い無限回転仕様です。

Library ManagerからESP32 Servoをインストール

ESP32の32,33番ピンにサーボの信号を繋ぎます

#include <ESP32Servo.h>

int R_SPEED = 0;//-500 to 500 (0=STOP)
int L_SPEED = 0;//-500 to 500 (0=STOP)
Servo L_SERVO;
Servo R_SERVO;

int PWM_N = 1500; // Neutral
int PWM_MIN = 1000;
int PWM_MAX = 2000;

void setup() {
  L_SERVO.attach(32, PWM_MIN, PWM_MAX);
  R_SERVO.attach(33, PWM_MIN, PWM_MAX);
}

void loop() {
  L_SERVO.writeMicroseconds(PWM_N + L_SPEED);
  R_SERVO.writeMicroseconds(PWM_N - R_SPEED);
  while(1);
}

Stop状態が1500μsでそこから±500μs増減で車輪が前後します。

Amazonにある格安昇圧コンバーターを試す

このような商品で10個で639円です。1個あたり64円で格安です。商品名は「DAOKAI」でいいんでしょうか

基盤は切り取られていないので自分で切り離します。

試しにLEDを4つ光らせてみます

  • 入力:5.00V 0.289A = 1.445W
  • 出力:11.49V 92.4mA = 1.062W

この場合だと効率72%でした。 商品説明ページには特に効率に関して言及されていなかったので、問題ない範囲ではないでしょうか。

Amazon商品ページ

秋月の3WパワーLED ASMT-MY22-NLM00 を雑に評価

ウォームホワイト色3WパワーLED ASMT-MY22-NLM00: オプトエレクトロニクス 秋月電子通商-電子部品・ネット通販

秋月で購入したこちらのLEDを”とても雑に”評価します。

電圧[V] 電流[A] 消費電力[W] 明るさ[LUX]
2.00 0.000 0.000 0.7
2.10 0.000 0.000 0.8
2.20 0.000 0.000 0.0
2.30 0.000 0.000 0.7
2.40 0.000 0.000 1.0
2.50 0.000 0.000 8.9
2.60 0.004 0.008 36.7
2.70 0.024 0.065 1767
2.80 0.060 0.168 3702
2.90 0.110 0.319 5900
3.00 0.183 0.549 17990
3.10 0.278 0.862 22700
3.20 0.290 0.928 23800

2.40Vで光り始めました

ESP32のdeep sleepを試す

以下がDeep Sleepのコードです。

#define LED 2

void setup() {
  Serial.begin(9600);
  Serial.println("ESP32 launching...");
  pinMode(LED, OUTPUT);

  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch (wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup by ESP_SLEEP_WAKEUP_EXT0");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup by ESP_SLEEP_WAKEUP_EXT1");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup by ESP_SLEEP_WAKEUP_TIMER");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup by ESP_SLEEP_WAKEUP_TOUCHPAD");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup by ESP_SLEEP_WAKEUP_ULP");
      break;
    default:
      Serial.printf("Wakeup by unknown reason: %d\n", wakeup_reason);
      break;
  }

  esp_deep_sleep(10 * 1000 * 1000);
}

void loop() {

}

10秒ごとにスリープに入り復帰後にはリセットされます

ただし wakeup_reason が0の場合があります。その場合は esp_wifi_stop などを呼び出しといた方がいい感じです

参考

Esp_sleep_get_wakeup_cause returns always 0 - #2 by hodmi - Arduino & Seeeduino - Seeed Studio Forum

Seeed Studio XIAO ESP32C3の省電力運用について考える #Arduino - Qiita

IoT を使ってみる(その15:ESP32のディープスリープで長時間バッテリー駆動に挑戦) | 豆蔵デベロッパーサイト

ESP32 導入

ESP32の初期設定(Arduino IDEの導入からLチカまでの手順) – マイコン技術Navi

こちらの手順を参考にしています。

Amazonで売られていた「ESP32-WROVER」を使います。

https://www.amazon.co.jp/dp/B0CJJKSN4F

以下のプログラムを実行しようとしたところエラーが

#define LED 2

void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}

以下エラー

A fatal error occurred: Unable to verify flash chip connection (Invalid head of packet (0xE0): Possible serial noise or corruption.).

アップロード速度を 115200 に変更

無事にIO2のLEDが点滅しました。

コンソールに文字を出せるようにします。

#define LED 2

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
  Serial.println("Hello ESP32!!");
}

Tools > Serial Monitor を開く