勉強しないとな~blog

ちゃんと勉強せねば…な電気設計エンジニアです。

ドクターイエローとロマンスカー作った

前回に引き続き、ペーパークラフトを夜鍋して作ってしまった。

作ったもの

前と同じキヤノンのcreativeparkから、

creativepark.canon

creativepark.canon

どちらも、前回のE6系こまちと同じ作者さんで、小ぶりなサイズ。

製作過程

小田急ロマンスカー、新幹線より曲線少なくて楽かと思いきや、車体上部に重ね貼りするパーツがあり、そこで難儀した。いまいちうまく貼れなかった。

ドクターイエローは、こまちよりは面構成シンプルで、ちょっと楽だった。

前回はスティックのりで貼ってたが、すぐ乾くのでやりにくかった。
今回木工用ボンド使ってみたら、貼りやすくなったような。ただ、出し過ぎで、紙が少しぶよぶよになった感はある。

出来上がり

小田急ロマンスカーは、上部パーツが浮いてるのがやっぱり気になる。

ドクターイエローは立体感がいい感じ。

以上

先頭車両を一両ずつしか作ってないので、残りも作らないと…

かがやきとこまち作った

子供がイベントで置いてあった新幹線のペーパークラフトを触ってたら、ブース担当の人にもらえた。

もしかして、こういうペーパークラフトってネットに転がってて、印刷すれば自分で色々作れるのでは?と思って調べたら、見つかった。

調べたもの

これはJR西日本で、新幹線もあるし、その他特急、普通の電車も色々ある。

www.westjr.co.jp

こっちはキヤノンのサイトで、電車もあるし、季節物、行事関係など役に立ちそうな物もある。

creativepark.canon

今回選んだもの

今回は、この2つをダウンロードして作った。

JR西日本のW7系(かがやき)と、

www.westjr.co.jp

↓ pdfダウンロード元(無料) https://www.westjr.co.jp/fan/paper/assets/pdf/shinkansen/w7_free_top.pdfwww.westjr.co.jp

キヤノンcreative parkのE6系こまち。

creativepark.canon

製作過程

pdfをダウンロードして、家のプリンターで印刷。紙は普通のペラペラのA4のコピー用紙。結果的にそれでよかった。

まずかがやきから着手。

切り抜いて、折り目のところで折り曲げて。車体の側面は軽く曲げるぐらいで。

前面の下部に、つまようじ等に巻いて丸めてください、みたいなところがあったが、手でなんとなく丸める。いまいちきれいにできなかった。左右対称にならなかった。

雪除けパーツが別になってて、貼り付けて立体的になっていい感じ。

運転席の窓も立体的になってるが、若干貼り付けで難儀。

次はこまち。パーツが小さいので大変な予感。

切り抜き、折り目付けは同じだが、こまちは谷折りもちょっとあって、複雑度高し。

フロントの側面が分かれてて、中央パーツに貼り付ける形だが、面構成が複雑で、うまく合わない…
結果、右側面はなんとかなったが、左側面はきちんとした形状が出なかった。無念。

こまちは先頭車両x2、中間車両x1あるが、そこまでできないので、また今度で。

できあがり

こんな感じ。

うまくできなかった部分はあるが、それなりに形になったので、まあ満足。

以上

今日はちょい工作の記事でした。

M5Stampをバスおもちゃに仕込む - 8. 仕上げ

↓ 前回記事

nokixa.hatenablog.com

前回でだいたいできたが、最後に電源スイッチを付けたかったので、追加した。

結果

こんな感じで加工完了!

赤枠のところに、本体に穴をあけて、スライドスイッチをねじ止めし、電池ボックスと昇圧モジュールの間に配線した。

プログラム修正

電源スイッチを付けたのはすぐに電池がなくなってしまうからだが、子供へ説明するためのもっといい理由付けがしたい。

ということで、電源スイッチを入れたらLEDが光るように修正した。

生成AIに、「起動時にきれいなパターンでLEDが点灯するようにプログラム追加してください」と言ってみたら、こんな感じで作ってくれた。

はい、前に作成したM5StampのプログラムにNeoPixelの起動時の点灯パターンを追加できます。以下は、setup()関数に追加するコードです:

void setup() {
  // 既存のsetup()コード

  // NeoPixelの初期化
  pixels.begin();

  // 起動時の点灯パターン
  for(int i=0; i<256; i++) {
    pixels.setPixelColor(0, pixels.ColorHSV(i*256, 255, 255));
    pixels.show();
    delay(10);
  }
  pixels.clear();
  pixels.show();

  // 既存のsetup()コードの続き
}

このコードは、起動時にNeoPixelをHSV色空間を使って虹色に変化させます。256ステップで一周し、各ステップで10ミリ秒待機するので、約2.56秒かけて美しい色の変化を表示します。

きれいって何だよ、という感じだが、きちんときれいなパターンを提案してくれた。

実際に点灯しているところ。

これで仕上げ

これで心置きなくふたを閉められるので、ようやく子供に渡せる形になった。

本体越しだと光り方がちょっと地味になってしまうが。

以上

あとは子供に渡して完了!
お疲れ様でした!

M5Stampをバスおもちゃに仕込む - 7. BLE版プログラム

↓ 前回記事

nokixa.hatenablog.com

Bluetooth Low Energy (BLE)を使えば、Wi-Fiのときより低消費電力で、電池からでも動かせるのでは?と考えたので、それをやってみる。

BLE消費電力

調べてみたが、あまりいい情報はなし。

Bluetooth Low Energyの低消費電力 - フィールドデザイン

無線LANでは、100mくらいの範囲で100Mbpsの速度で通信ができるので、送受信時とも200mAくらいの電流を消費します(2016年現在の値で、半導体のプロセスによる値)。Bluetooth Low Energyでは、5mくらいの範囲で100kbpsの速度で通信ができるので、送受信時とも10mAくらいの電流を消費します(2016年現在の値で、半導体のプロセスによる値)。

ESP32 C3のデータシートを見たが、BLE動作中の電流、というのは書かれていない。
Wi-Fi動作中のみ。

esp32-c3_datasheet_en.pdf

別のボードだが、そこで使われているESP32デバイスのデータシートには、BLE受信、送信で100mA、130mAの消費電流、と書かれているよう。

ESP32 の BLE 動作時の消費電流を調べてみた • IoT ソフトウェア設計のファームロジックス [相模原]

第一弾プログラム

生成AIに聞いて、M5StampでBLE通信を使うプログラムを作ってもらった。

最初に一発作ってもらった後、接続/切断されたときのメッセージ表示をリクエストで追加してもらったのと、BLEで値を書き込みされたときのメッセージ表示を追加した。

プログラム

コードは下記の通り。

#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define LED_PIN 4

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;

// UUIDs for the service and characteristic
#define SERVICE_UUID        "12345678-1234-5678-1234-56789abcdef0"
#define CHARACTERISTIC_UUID "abcdefab-cdef-1234-5678-abcdefabcdef"

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();
      if (value == "ON") {
        digitalWrite(LED_PIN, HIGH);
        Serial.println("Written \"ON\"");
      } else if (value == "OFF") {
        digitalWrite(LED_PIN, LOW);
        Serial.println("Written \"OFF\"");
      }
    }
};

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      Serial.println("スマートフォンが接続されました");
    }

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
      Serial.println("スマートフォンが切断されました");
    }
};


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

  // Initialize BLE
  BLEDevice::init("M5StampC3");
  BLEServer *pServer = BLEDevice::createServer();

  pServer->setCallbacks(new MyServerCallbacks());
  
  // Create a service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_WRITE
                    );

  pCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->start();
}

void loop() {
  // Main loop does nothing, all logic is handled in the callback
}


ビルド

問題なくビルドできた。

BLE関連の部分は下記の通り。

Dependency Graph
|-- ESP32 BLE Arduino @ 2.0.0

Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2902.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2904.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertisedDevice.cpp.o     
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertising.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEBeacon.cpp.o
esptool.py v4.5.1
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristicMap.cpp.o    
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptorMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneTLM.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneURL.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEExceptions.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEHIDDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteCharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEScan.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLESecurity.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServiceMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUUID.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEValue.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\FreeRTOS.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\GeneralUtils.cpp.o

全ビルドログ(クリックで開く/閉じる)

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ESP32 BLE Arduino @ 2.0.0
Building in release mode
Compiling .pio\build\esp32-c3-devkitm-1\src\main.cpp.o
Building .pio\build\esp32-c3-devkitm-1\bootloader.bin
Generating partitions .pio\build\esp32-c3-devkitm-1\partitions.bin
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2902.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2904.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertisedDevice.cpp.o     
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertising.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEBeacon.cpp.o
esptool.py v4.5.1
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristicMap.cpp.o    
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptorMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneTLM.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneURL.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEExceptions.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEHIDDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteCharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEScan.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLESecurity.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServiceMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUUID.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEValue.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\FreeRTOS.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\GeneralUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Esp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FirmwareMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FunctionalInterrupt.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HWCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPv6Address.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\MD5Builder.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Print.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\StreamString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USB.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\base64.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\cbuf.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-adc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-bt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-cpu.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-dac.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-gpio.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c-slave.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libab4\libBLE.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-ledc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-matrix.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-misc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-psram.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rgb-led.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rmt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-sigmadelta.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-spi.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-time.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-timer.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-tinyusb.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-touch.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-uart.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\firmware_msc_fat.c.o    
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cdecode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cencode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\main.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libFrameworkArduino.a
Linking .pio\build\esp32-c3-devkitm-1\firmware.elf
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"       
RAM:   [=         ]  11.8% (used 38700 bytes from 327680 bytes)
Flash: [========  ]  76.0% (used 995620 bytes from 1310720 bytes)
Building .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Creating esp32c3 image...
Merged 2 ELF sections
Successfully created esp32c3 image.
========================= [SUCCESS] Took 11.78 seconds =========================
 *  Terminal will be reused by tasks, press any key to close it. 
 

動作

"Upload and Monitor"コマンドで。

スマホからは、"LightBlue"アプリで操作した。デバイス検索、接続ができて、Charasteristicの書き込みで操作ができる。

LightBlue®

LightBlue®

  • Punch Through
  • ユーティリティ
  • ç„¡æ–™
apps.apple.com

LightBlueアプリでの操作

LightBlueアプリを立ち上げると、ペリフェラル検索画面が立ち上がる。

M5Stampでプログラム動作すると、"M5StampC3"のペリフェラルが現れる。

"Connect"を押すと、接続されて、情報が表示される。
"Services"には、プログラムで適当に設定した"SERVICE_UUID"と、"CHARASTERISTIC_UUID"が表示されている。

このCharacteristicを開いてみると、値の書き込みと読み出しのボタンがある。

"Write new value"を押すと、値の入力画面が出る。デフォルトでは、フォーマットは文字列になっている。

"UTF-8 String"を押すと、"Hex"等、他のフォーマットも選択できる。

文字列フォーマットで、"ON"や"OFF"を何回か入力したところ。

一つ前の画面に戻ると、"Disconnect"ができた。

M5Stamp側の挙動

スマホから接続したり、値の書き込みをした際、 シリアルコンソール上にその表示が出た。
また、値の書き込みで、きちんとバスのボタンプッシュと同じ挙動(LED点灯、音声)をやってくれた。

スマートフォンが接続されました
Written "ON"
Written "OFF"
Written "ON"
スマートフォンが切断されました

全ログ(クリックで開く/閉じる)

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --target upload --target monitor --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES: 
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - tool-mkfatfs @ 2.0.1
 - tool-mklittlefs @ 1.203.210628 (2.3)
 - tool-mkspiffs @ 2.230.0 (2.30)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ESP32 BLE Arduino @ 2.0.0
Building in release mode
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"       
RAM:   [=         ]  11.8% (used 38700 bytes from 327680 bytes)
Flash: [========  ]  76.0% (used 996016 bytes from 1310720 bytes)
Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-builtin, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Serial port COM3
Connecting....
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 68:67:25:b2:d0:54
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x00109fff...
Compressed 13248 bytes to 9562...
Writing at 0x00000000... (100 %)
Wrote 13248 bytes (9562 compressed) at 0x00000000 in 0.5 seconds (effective 226.5 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 386.4 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 535.6 kbit/s)...
Hash of data verified.
Compressed 1023968 bytes to 556568...
Writing at 0x00010000... (2 %)
Writing at 0x0001bfae... (5 %)
Writing at 0x0002986e... (8 %)
Writing at 0x00035fe6... (11 %)
Writing at 0x0004115a... (14 %)
Writing at 0x000479f2... (17 %)
Writing at 0x0004da5a... (20 %)
Writing at 0x00053d57... (23 %)
Writing at 0x0005a972... (26 %)
Writing at 0x00061c87... (29 %)
Writing at 0x00067e6c... (32 %)
Writing at 0x0006e160... (35 %)
Writing at 0x000756ad... (38 %)
Writing at 0x0007c38c... (41 %)
Writing at 0x0008305c... (44 %)
Writing at 0x00088f6d... (47 %)
Writing at 0x0008f419... (50 %)
Writing at 0x000954a0... (52 %)
Writing at 0x0009ca68... (55 %)
Writing at 0x000a3622... (58 %)
Writing at 0x000ab219... (61 %)
Writing at 0x000b1944... (64 %)
Writing at 0x000b8210... (67 %)
Writing at 0x000bf2d7... (70 %)
Writing at 0x000c8073... (73 %)
Writing at 0x000cf3f3... (76 %)
Writing at 0x000d5bae... (79 %)
Writing at 0x000dcb37... (82 %)
Writing at 0x000e354f... (85 %)
Writing at 0x000e987f... (88 %)
Writing at 0x000ef65e... (91 %)
Writing at 0x000f5447... (94 %)
Writing at 0x000fd5f2... (97 %)
Writing at 0x00103723... (100 %)
Wrote 1023968 bytes (556568 compressed) at 0x00010000 in 16.8 seconds (effective 488.7 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
--- Terminal on COM3 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5810,len:0x438
load:0x403cc710,len:0x90c
load:0x403ce710,len:0x2624
entry 0x403cc710
スマートフォンが接続されました
Written "ON"
Written "OFF"
Written "ON"
スマートフォンが切断されました

クロック周波数変えて低消費電力化

上で作ったプログラムをM5Stampに書き込んで、電池から動かしてみた。

きちんと動くときは動くが、ときどき反応しなくなる。
また、一旦反応しなくなると、電池を外さないと復旧しない。USBを接続してもだめ。

まだ消費電力が大き過ぎるのか、と考えて、生成AIに対策案を出してもらったら、クロック周波数を下げる、というのがあったので、それを試す。

M5Stampだと、デフォルトでは160MHzで動いているが、BLEを使う場合は80MHzまで下げても大丈夫のよう。

プログラム

生成AIに作ってもらったプログラム。

変更部分は、

  • esp_pm.hのインクルード追加
#include <esp_pm.h>
  • setup()の先頭でクロック周波数設定を実施
void setup() {
  // クロック周波数を80MHzに設定
  esp_pm_config_esp32c3_t pm_config = {
    .max_freq_mhz = 80,
    .min_freq_mhz = 80,
    .light_sleep_enable = false
  };
  esp_pm_configure(&pm_config);
  
  Serial.begin(115200);

  ...

プログラム全体は下記の通り。

#include <Arduino.h>
#include <esp_pm.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

#define LED_PIN 4

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;

// UUIDs for the service and characteristic
#define SERVICE_UUID        "12345678-1234-5678-1234-56789abcdef0"
#define CHARACTERISTIC_UUID "abcdefab-cdef-1234-5678-abcdefabcdef"

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();
      if (value == "ON") {
        digitalWrite(LED_PIN, HIGH);
        Serial.println("Written \"ON\"");
      } else if (value == "OFF") {
        digitalWrite(LED_PIN, LOW);
        Serial.println("Written \"OFF\"");
      }
    }
};

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      Serial.println("スマートフォンが接続されました");
    }

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
      Serial.println("スマートフォンが切断されました");
    }
};


void setup() {
  // クロック周波数を80MHzに設定
  esp_pm_config_esp32c3_t pm_config = {
    .max_freq_mhz = 80,
    .min_freq_mhz = 80,
    .light_sleep_enable = false
  };
  esp_pm_configure(&pm_config);
  
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);

  // Initialize BLE
  BLEDevice::init("M5StampC3");
  BLEServer *pServer = BLEDevice::createServer();

  pServer->setCallbacks(new MyServerCallbacks());

  // Create a service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_WRITE
                    );

  pCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->start();
}

void loop() {
  // Main loop does nothing, all logic is handled in the callback
}


ビルド

特に変わったことはなし。

全ビルドログ(クリックで開く/閉じる)

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ESP32 BLE Arduino @ 2.0.0
Building in release mode
Compiling .pio\build\esp32-c3-devkitm-1\src\main.cpp.o
Building .pio\build\esp32-c3-devkitm-1\bootloader.bin
Generating partitions .pio\build\esp32-c3-devkitm-1\partitions.bin
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2902.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2904.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertisedDevice.cpp.o     
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertising.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEBeacon.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristic.cpp.o
esptool.py v4.5.1
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristicMap.cpp.o    
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptorMap.cpp.o        
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneTLM.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneURL.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEExceptions.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEHIDDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteCharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEScan.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLESecurity.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServiceMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUUID.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEValue.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\FreeRTOS.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\GeneralUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Esp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FirmwareMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FunctionalInterrupt.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HWCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPv6Address.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\MD5Builder.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Print.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\StreamString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USB.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\base64.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\cbuf.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-adc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-bt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-cpu.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-dac.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-gpio.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c-slave.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-ledc.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libab4\libBLE.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-matrix.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-misc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-psram.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rgb-led.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rmt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-sigmadelta.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-spi.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-time.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-timer.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-tinyusb.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-touch.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-uart.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\firmware_msc_fat.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cdecode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cencode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\main.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libFrameworkArduino.a
Linking .pio\build\esp32-c3-devkitm-1\firmware.elf
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]  11.8% (used 38700 bytes from 327680 bytes)
Flash: [========  ]  76.0% (used 996042 bytes from 1310720 bytes)
Building .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Creating esp32c3 image...
Merged 2 ELF sections
Successfully created esp32c3 image.
========================= [SUCCESS] Took 11.39 seconds =========================
 *  Terminal will be reused by tasks, press any key to close it. 

実行

こちらも変わりなし。
このプログラムに変えたところ、動作が安定して、途中で電源が落ちるようなことはなくなった。

スマートフォンが接続されました
Written "ON"
スマートフォンが切断されました

全実行ログ(クリックで開く/閉じる)

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --target upload --target monitor --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - tool-mkfatfs @ 2.0.1
 - tool-mklittlefs @ 1.203.210628 (2.3)
 - tool-mkspiffs @ 2.230.0 (2.30)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- ESP32 BLE Arduino @ 2.0.0
Building in release mode
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"       
RAM:   [=         ]  11.8% (used 38700 bytes from 327680 bytes)
Flash: [========  ]  76.0% (used 996042 bytes from 1310720 bytes)
Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-builtin, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Serial port COM3
Connecting....
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 68:67:25:b2:d0:54
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x00109fff...
Compressed 13248 bytes to 9562...
Writing at 0x00000000... (100 %)
Wrote 13248 bytes (9562 compressed) at 0x00000000 in 0.5 seconds (effective 225.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 392.2 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 557.7 kbit/s)...
Hash of data verified.
Compressed 1023984 bytes to 556555...
Writing at 0x00010000... (2 %)
Writing at 0x0001bf9c... (5 %)
Writing at 0x0002986e... (8 %)
Writing at 0x00035fe8... (11 %)
Writing at 0x00041164... (14 %)
Writing at 0x000479ec... (17 %)
Writing at 0x0004da46... (20 %)
Writing at 0x00053d3c... (23 %)
Writing at 0x0005a95e... (26 %)
Writing at 0x00061c73... (29 %)
Writing at 0x00067e62... (32 %)
Writing at 0x0006e155... (35 %)
Writing at 0x00075634... (38 %)
Writing at 0x0007c386... (41 %)
Writing at 0x00083042... (44 %)
Writing at 0x00088f57... (47 %)
Writing at 0x0008f411... (50 %)
Writing at 0x00095490... (52 %)
Writing at 0x0009ca56... (55 %)
Writing at 0x000a3617... (58 %)
Writing at 0x000ab214... (61 %)
Writing at 0x000b1915... (64 %)
Writing at 0x000b8202... (67 %)
Writing at 0x000bf2d2... (70 %)
Writing at 0x000c8081... (73 %)
Writing at 0x000cf404... (76 %)
Writing at 0x000d5b56... (79 %)
Writing at 0x000dcb55... (82 %)
Writing at 0x000e355c... (85 %)
Writing at 0x000e98b0... (88 %)
Writing at 0x000ef68c... (91 %)
Writing at 0x000f546a... (94 %)
Writing at 0x000fd618... (97 %)
Writing at 0x0010374e... (100 %)
Wrote 1023984 bytes (556555 compressed) at 0x00010000 in 16.8 seconds (effective 488.8 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
--- Terminal on COM3 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5810,len:0x438
load:0x403cc710,len:0x90c
load:0x403ce710,len:0x2624
entry 0x403cc710
スマートフォンが接続されました
Written "ON"
スマートフォンが切断されました

仕様改善

雑な指示で生成AIにプログラムを作ってもらったので、ちょっと不便なところあり。

  • 値の書き込みで、文字列を入力しないといけない(LightBlueアプリだと、デフォルトは"Hex"入力だったので、文字列入力するには、接続ごとに一度入力フォーマット設定が必要)
  • "ON"を書いた後、"OFF"を書かないと次のボタンプッシュが効かない

あとちょっと追加したいこと。

  • M5Stamp自体にもLED(NeoPixelのもの)が載っているので、これも光らせたい

プログラム

生成AIに修正してもらったプログラムは下記の通り。

何度か作ってもらって、それを見てやっぱりこんな仕様にしてもらいたい、というやり取りを繰り返した。

生成AIからの提案で、バスボタンプッシュ、LEDを適当なパターンで点灯、以外の値書き込みが来たとき、それを色コードとしてLEDを点灯してはどうか、というのがあったので、それに乗っかった。

#include <Arduino.h>
#include <esp_pm.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <Adafruit_NeoPixel.h>

#define OUTPUT_PIN 4
#define LED_PIN 2
#define NUM_LEDS 1

BLECharacteristic *pCharacteristic;
bool deviceConnected = false;

// UUIDs for the service and characteristic
#define SERVICE_UUID        "12345678-1234-5678-1234-56789abcdef0"
#define CHARACTERISTIC_UUID "abcdefab-cdef-1234-5678-abcdefabcdef"

Adafruit_NeoPixel pixels(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();
      int len = value.length();

      Serial.print("受信したデータ長: ");
      Serial.println(len);
      Serial.print("受信データ: ");
      for (int i = 0; i < len; i++) {
        Serial.print("0x");
        Serial.print((uint8_t)value[i], HEX);
        Serial.print(" ");
      }
      Serial.println();

      if (len == 1) {
        // 1バイトデータの処理
        uint8_t receivedByte = (uint8_t)value[0];
        if (receivedByte == 0x00) {
          digitalWrite(OUTPUT_PIN, HIGH);
          delay(500);
          digitalWrite(OUTPUT_PIN, LOW);
        } else if (receivedByte == 0x01) {
          for (int i = 0; i < 2; i++) {
            pixels.setPixelColor(0, pixels.Color(0, 0, 255)); // 青
            pixels.show();
            delay(250);
            pixels.setPixelColor(0, pixels.Color(0, 255, 0)); // ç·‘
            pixels.show();
            delay(250);
          }
          pixels.setPixelColor(0, pixels.Color(0, 0, 0)); // 消灯
          pixels.show();
        }
      } else if (len == 3) {
        // 3バイトデータの処理(RGB色データ)
        uint8_t r = (uint8_t)value[0];
        uint8_t g = (uint8_t)value[1];
        uint8_t b = (uint8_t)value[2];
        pixels.setPixelColor(0, pixels.Color(r, g, b));
        pixels.show();
        delay(1000);
        pixels.setPixelColor(0, pixels.Color(0, 0, 0));
        pixels.show();
      }
    }
};

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      Serial.println("スマートフォンが接続されました");
    }

    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
      Serial.println("スマートフォンが切断されました");
    }
};

void setup() {
  // クロック周波数を80MHzに設定
  esp_pm_config_esp32c3_t pm_config = {
    .max_freq_mhz = 80,
    .min_freq_mhz = 80,
    .light_sleep_enable = false
  };
  esp_pm_configure(&pm_config);

  Serial.begin(115200);
  pinMode(OUTPUT_PIN, OUTPUT);
  pixels.begin();

  // Initialize BLE
  BLEDevice::init("M5StampC3");
  BLEServer *pServer = BLEDevice::createServer();

  pServer->setCallbacks(new MyServerCallbacks());

  // Create a service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a characteristic
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      BLECharacteristic::PROPERTY_WRITE
                    );

  pCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->start();
}

void loop() {
  // Main loop does nothing, all logic is handled in the callback
}

NeoPixelのLEDを使うためには、プロジェクトにライブラリの追加が必要。

nokixa.hatenablog.com

ビルド

NeoPixelのライブラリのコンパイルが追加されたぐらい。

クリックで開く/閉じる

*  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 34 compatible libraries
Scanning dependencies...
Dependency Graph
|-- Adafruit NeoPixel @ 1.12.3
|-- ESP32 BLE Arduino @ 2.0.0
Building in release mode
Compiling .pio\build\esp32-c3-devkitm-1\src\main.cpp.o
Building .pio\build\esp32-c3-devkitm-1\bootloader.bin
Generating partitions .pio\build\esp32-c3-devkitm-1\partitions.bin
Compiling .pio\build\esp32-c3-devkitm-1\lib63c\Adafruit NeoPixel\Adafruit_NeoPixel.cpp.o
esptool.py v4.5.1
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.
Compiling .pio\build\esp32-c3-devkitm-1\lib63c\Adafruit NeoPixel\esp.c.o
Compiling .pio\build\esp32-c3-devkitm-1\lib63c\Adafruit NeoPixel\esp8266.c.o
Compiling .pio\build\esp32-c3-devkitm-1\lib63c\Adafruit NeoPixel\kendyte_k210.c.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2902.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLE2904.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertisedDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEAdvertising.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEBeacon.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLECharacteristicMap.cpp.o    
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDescriptorMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneTLM.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEEddystoneURL.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEExceptions.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEHIDDevice.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteCharacteristic.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteDescriptor.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLERemoteService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEScan.cpp.o
Archiving .pio\build\esp32-c3-devkitm-1\lib63c\libAdafruit NeoPixel.a
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLESecurity.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEService.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEServiceMap.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUUID.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\BLEValue.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\FreeRTOS.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\libab4\BLE\GeneralUtils.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Esp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FirmwareMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FunctionalInterrupt.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HWCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPv6Address.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\MD5Builder.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Print.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\StreamString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USB.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\base64.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\cbuf.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-adc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-bt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-cpu.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-dac.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-gpio.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c-slave.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libab4\libBLE.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-ledc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-matrix.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-misc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-psram.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rgb-led.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rmt.c.o       
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-sigmadelta.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-spi.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-time.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-timer.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-tinyusb.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-touch.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-uart.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\firmware_msc_fat.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cdecode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cencode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\main.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libFrameworkArduino.a
Linking .pio\build\esp32-c3-devkitm-1\firmware.elf
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]  11.8% (used 38748 bytes from 327680 bytes)
Flash: [========  ]  76.3% (used 999536 bytes from 1310720 bytes)
Building .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Creating esp32c3 image...
Merged 2 ELF sections
Successfully created esp32c3 image.
========================= [SUCCESS] Took 13.13 seconds =========================
 *  Terminal will be reused by tasks, press any key to close it. 

動作

LightBlueアプリでは、16進の値を書き込み。
6桁(3byte)の値を書くと、色コードとして認識されて、M5Stamp上のLEDが点灯する。

期待したようなログ表示。

実際のLED、音声も期待通り。

スマートフォンが接続されました
受信したデータ長: 1
受信データ: 0x0
受信したデータ長: 1
受信データ: 0x0
受信したデータ長: 1
受信データ: 0x1
受信したデータ長: 1
受信データ: 0x1
受信したデータ長: 3
受信データ: 0x80 0x80 0x80
受信したデータ長: 3
受信データ: 0x40 0x40 0x40
受信したデータ長: 3
受信データ: 0x80 0x0 0x80
スマートフォンが切断されました

動いている様子。

以上

BLEで、なんとかバッテリーで動かすことができた。

ただ、これでしばらく電池を入れっぱなしにしていると、数時間で電池がなくなってしまっていた。
電源スイッチだけ取り付けておきたい。

次回はそれをやっておく。
そうしたら子供に提供できる形になるか。

M5Stampをバスおもちゃに仕込む - 6. 電力問題

↓ 前回記事

nokixa.hatenablog.com

前回、Wi-Fi接続を使って、ブラウザからバスのボタンプッシュと同等の操作ができるプログラムを作ったが、問題があったので、それを整理する。

問題点

このプログラムを、USB接続で動かしているときは問題なかったが、電池からの給電で動作させようとすると、起動せず、バスのボタンを押しても反応がなかった(=バスおもちゃに電源供給されていないと思われる)。

原因

M5Stamp C3でWi-Fiを動かすと結構消費電力が大きいのが原因のようだった。

  • LEDチカチカするだけのプログラムに戻したら、電池で動いた。昇圧モジュールが壊れたかとも思っていたが、ちょっと安心した。やっぱり負荷が重過ぎて、電源供給できなくなっているように思われる。

  • M5Stamp C3での例はなかったが、M5Stamp S3, picoでのWi-Fi動作時消費電力は調査例があった。
    これによると、どちらもWi-Fi動作中は50~100mA (電源はNi-MH電池4本なので、4~4.8Vといったところ)で、接続開始時にはピークで150mA (M5Stamp pico)、250mA (M5Stamp S3)出る、というようなグラフが載っている。
    M5Stamp S3でできること 〜M5Stamp S3の消費電流値(他のM5デバイスと比較) - MSR合同会社

  • 今回使った昇圧モジュールだと、5V 0.21A出力(@入力3V)と書かれている。
    これだとWi-Fi接続のピーク消費電流に耐えられるか微妙なところ。
    今回は単4電池一本(Ni-MH電池使ったので、1.2Vぐらい)から電源供給していて、昇圧回路だと入力側の電流量でリミットが決まったかと思うので、実質この4割(=80mA)ぐらいしか供給できないかもしれない。

XCL103使用5V出力昇圧DCDCコンバーターキット: 半導体 秋月電子通商-電子部品・ネット通販

使われているICの出力電流見ると、500mA @Vout=5V,VBAT=3.3Vと書かれている。モジュールではICに外付けコンデンサを付けたぐらいの回路になっているが、本当に違いがあるのか?何か間違えてるだけか?

XCL102-103-j.pdf

対策

  • Ni-MH 1本から2本に変えて、電流リミットが倍になって何とかなるかと思ったが、ダメだった。

  • M5Stampだと、Bluetoothも使えるので、こっちにすれば低消費電力で動かせるのでは、と検討。これで進めてみる。 → 次回記事へ…

その他

今回は電池としてeneloopも使ったが、他にダイソーで2本300円で買えるものもあり、それも使ってみた。
特にeneloopと変わらない感じで使える。

単4形 充電式ニッケル水素電池 650mAh (LOOPER) 2本入り - ダイソーネットストア通販【公式】

ダイソー充電池LOOPER容量UPして再登場 | さっぽろ旅客自動車・航空機・鉄道 (丘珠空港中心?!)

ただし、専用の充電器もあったらしいが、見つからなかった…
今は売られていない?
とりあえずeneloopの充電器で充電できたので、それでやっておくことにする。

セリアでもニッケル水素電池と充電器が売られていたりするらしい。

【ダイソー】の充電池「充電式ニッケル水素充電池(Looper)」がパワーアップして登場!2本で330円はコスパ最高! | イチオシ | ichioshi

セリア(100均)単3・4乾電池専用充電器コンセントタイプレビュー! | 多趣味のんびり日記帳

M5Stampをバスおもちゃに仕込む - 5. コード作成、コンパイル

↓ 前回記事

nokixa.hatenablog.com

前回、Wi-Fi接続するプログラムをPlatformIOで作成できたので、今度は当初の目的のアプリケーション(スマホからブラウザアクセス、Webページのボタンを押して、バスおもちゃの音を鳴らす)を作っていく。

概要

生成AIにソースコードとプロジェクト開発手順を作ってもらっているので、それを実機で動かしていく。

ソースコード等

生成AIに作ってもらったのは下記の通り。

バスのボタンへのIO番号は実際の接続に合わせて書き換えている。

  • main.cpp
#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include "index.h" // HTMLコードを別ファイルに分離

const char* ssid = "あなたのWiFi_SSID";
const char* password = "あなたのWiFiパスワード";
const int outputPin = 4;

WebServer server(80);

void setup() {
  Serial.begin(115200);
  pinMode(outputPin, OUTPUT);
  digitalWrite(outputPin, LOW);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.print("Connected to WiFi. IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", HTTP_GET, []() {
    server.send(200, "text/html", INDEX_HTML);
  });

  server.on("/trigger", HTTP_POST, []() {
    digitalWrite(outputPin, HIGH);
    delay(100);
    digitalWrite(outputPin, LOW);
    server.send(200, "text/plain", "OK");
  });

  server.begin();
}

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

  • index.h

#ifndef INDEX_H
#define INDEX_H

const char INDEX_HTML[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>バス停ボタン</title>
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
.button {
padding: 40px;
font-size: 24px;
border-radius: 50%;
background-color: #ff4444;
color: white;
border: none;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
cursor: pointer;
}
.button:active {
transform: translateY(4px);
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
}
</style>
</head>
<body>
<button class="button" onclick="triggerSound()">停車</button>
<script>
function triggerSound() {
fetch('/trigger', {method: 'POST'})
.then(response => console.log('Triggered'))
.catch(error => console.error('Error:', error));
}
</script>
</body>
</html>
)rawliteral";

#endif

index.hの中に、スマホ等からアクセスされたときに返すindex.htmlが丸々含まれている。

index.hは、includeフォルダの中に保存する。

  • 一応、platform.iniに、シリアルポートのボーレートの記述も入れておく。
    実際必要かは分からない。"Monitor"をやるときのコマンド引数で設定できるのかもしれない。
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:esp32-c3-devkitm-1]
platform = espressif32
board = esp32-c3-devkitm-1
framework = arduino
monitor_speed = 115200

ソースコードでやってること

いまいち仕組みがよく分からなかったが、生成AIに聞くと、こんな感じで回答が出た。

以下の流れで動作しています:

1. *HTMLのボタンクリック時の動作*:
function triggerSound() {
fetch('/trigger', {method: 'POST'})
.then(response => console.log('Triggered'))
.catch(error => console.error('Error:', error));
}
このコードは、ボタンがクリックされたときに`/trigger`というURLにHTTP POSTリクエストを送るだけです。

2. *マイコン側でのIO操作*:
実際のIO操作は、マイコン(ESP8266/ESP32)のプログラムで行っています:

// POSTリクエストを受け取ったときの処理
server.on("/trigger", HTTP_POST, []() {
digitalWrite(outputPin, HIGH); // ここでIOピンをHIGHに
delay(100); // 100ミリ秒待機
digitalWrite(outputPin, LOW); // IOピンをLOWに戻す
server.send(200, "text/plain", "OK"); // ブラウザに応答を返す
});

つまり、動作の順序は:

1. ブラウザでボタンをクリック
2. JavaScriptが`/trigger`にPOSTリクエストを送信
3. マイコンのWebサーバーがリクエストを受信
4. マイコンのプログラムがIO操作を実行
5. 操作完了後、ブラウザに「OK」を返す

なんとなく理解が進んだような気がする。

ビルド

ビルド結果のログは下記の通り。

クリックで開く/閉じる

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
--------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- WebServer @ 2.0.0
|-- WiFi @ 2.0.0
Building in release mode
Compiling .pio\build\esp32-c3-devkitm-1\src\main.cpp.o
Building .pio\build\esp32-c3-devkitm-1\bootloader.bin
Generating partitions .pio\build\esp32-c3-devkitm-1\partitions.bin
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFi.cpp.o
esptool.py v4.5.1
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiAP.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiGeneric.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiMulti.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiSTA.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiScan.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiUdp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib01d\FS\FS.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib01d\FS\vfs_api.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib371\WebServer\Parsing.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib371\WebServer\WebServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib371\WebServer\detail\mimetable.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Esp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FirmwareMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FunctionalInterrupt.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HWCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPv6Address.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\MD5Builder.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Print.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\StreamString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USB.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\base64.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\cbuf.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-adc.c.o
Archiving .pio\build\esp32-c3-devkitm-1\lib4ca\libWiFi.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-bt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-cpu.c.o
Archiving .pio\build\esp32-c3-devkitm-1\lib01d\libFS.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-dac.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-gpio.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c-slave.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-ledc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-matrix.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-misc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-psram.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rgb-led.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rmt.c.o
Archiving .pio\build\esp32-c3-devkitm-1\lib371\libWebServer.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-sigmadelta.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-spi.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-time.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-timer.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-tinyusb.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-touch.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-uart.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\firmware_msc_fat.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cdecode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cencode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\main.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libFrameworkArduino.a
Linking .pio\build\esp32-c3-devkitm-1\firmware.elf
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]  12.0% (used 39284 bytes from 327680 bytes)
Flash: [======    ]  58.5% (used 766746 bytes from 1310720 bytes)
Building .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Creating esp32c3 image...
Merged 2 ELF sections
Successfully created esp32c3 image.
================================== [SUCCESS] Took 10.90 seconds ==================================
 *  Terminal will be reused by tasks, press any key to close it. 

今回は、"WebServer.h"のライブラリが追加されている。

Dependency Graph
|-- WebServer @ 2.0.0
|-- WiFi @ 2.0.0
Compiling .pio\build\esp32-c3-devkitm-1\lib371\WebServer\Parsing.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib371\WebServer\WebServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib371\WebServer\detail\mimetable.cpp.o

実動作

"Upload and Monitor"をすると、こんな表示になった。

クリックで開く/閉じる

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --target upload --target monitor --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - tool-mkfatfs @ 2.0.1
 - tool-mklittlefs @ 1.203.210628 (2.3)
 - tool-mkspiffs @ 2.230.0 (2.30)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- WebServer @ 2.0.0
|-- WiFi @ 2.0.0
Building in release mode
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"       
RAM:   [=         ]  12.0% (used 39284 bytes from 327680 bytes)
Flash: [======    ]  58.5% (used 766746 bytes from 1310720 bytes)
Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-builtin, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Serial port COM3
Connecting....
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 68:67:25:b2:d0:54
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x000d0fff...
Compressed 13248 bytes to 9562...
Writing at 0x00000000... (100 %)
Wrote 13248 bytes (9562 compressed) at 0x00000000 in 0.5 seconds (effective 226.6 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 405.4 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 552.6 kbit/s)...
Hash of data verified.
Compressed 789456 bytes to 473675...
Writing at 0x00010000... (3 %)
Writing at 0x0001c2eb... (6 %)
Writing at 0x00026126... (10 %)
Writing at 0x000308a3... (13 %)
Writing at 0x00036dce... (17 %)
Writing at 0x0003e31a... (20 %)
Writing at 0x000443ea... (24 %)
Writing at 0x0004a739... (27 %)
Writing at 0x000501eb... (31 %)
Writing at 0x00055f15... (34 %)
Writing at 0x0005c0cb... (37 %)
Writing at 0x00061e8e... (41 %)
Writing at 0x00067e3f... (44 %)
Writing at 0x0006e054... (48 %)
Writing at 0x00073c2f... (51 %)
Writing at 0x000795d1... (55 %)
Writing at 0x0007f8bd... (58 %)
Writing at 0x0008571d... (62 %)
Writing at 0x0008b554... (65 %)
Writing at 0x0009162e... (68 %)
Writing at 0x00097b9c... (72 %)
Writing at 0x0009e024... (75 %)
Writing at 0x000a41ea... (79 %)
Writing at 0x000aa37c... (82 %)
Writing at 0x000b00dc... (86 %)
Writing at 0x000b8262... (89 %)
Writing at 0x000bec19... (93 %)
Writing at 0x000c4dbb... (96 %)
Writing at 0x000cad36... (100 %)
Wrote 789456 bytes (473675 compressed) at 0x00010000 in 13.7 seconds (effective 460.5 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
--- Terminal on COM3 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5810,len:0x438
load:0x403cc710,len:0x90c
load:0x403ce710,len:0x2624
entry 0x403cc710
...
Connected to WiFi. IP address: 192.168.1.37

...
Connected to WiFi. IP address: 192.168.1.37

ここで、PCのブラウザからIPアドレスを入力すると、こんな感じでバスのボタンの画面が出た。

このボタンを押すと、バスおもちゃが光って、音も出た。ねらい通り。

www.dropbox.com

ここまで

ひとまず動いたが、この後ハード的な問題があったので、その対処をする。

大幅変更になりそう。

M5Stampをバスおもちゃに仕込む - 4. Wi-Fi接続

↓ 前回記事

nokixa.hatenablog.com

今回は、Wi-Fi接続を確認する。

概要

M5StampでのWi-Fi接続は前やったが、このときはESP-IDFを使ったやり方だった。

nokixa.hatenablog.com

今回のバスおもちゃ改造では、PlatformIOの開発環境を使うので、ここでのWi-Fiの扱い方を確認する。

やったこと

まずは前回記事と同じ手順で、Wi-Fiテスト用にPlatformIOのプロジェクトを作成。

生成AI(Perplexity)に、PlatformIOでの開発方法を聞いている文脈で、「Wi-Fi接続をするプログラム」ということで聞いて、コードを作成してもらった。

あとはPlatformIOにコードを持ってきてコンパイルし、デバイス接続して書き込み、実行しただけ。

結果的に、これで一発で行けた。

生成AIで作成してもらったコード

下記の通り出てきた。

#include <Arduino.h>
#include <WiFi.h>

const char* ssid = "あなたのWi-FiのSSID";
const char* password = "あなたのWi-Fiのパスワード";

void setup() {
  Serial.begin(115200);
  Serial.println("Wi-Fi接続を開始します");

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Wi-Fi接続に成功しました");
  Serial.print("IPアドレス: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("Wi-Fi接続中");
  } else {
    Serial.println("Wi-Fi接続が切れました");
  }
  delay(5000);
}

※Wi-FiのSSID、パスワードは自宅のWi-Fiルーターのものに置き換える。

生成AIが参照していたサイトも一部書いておく。

platformioでESP32がwifiに接続まで試してみた! - KOKENSHAの技術ブログ

開発環境(ESP-IDF)によるESP32のWiFi機能の使用方法 #ESP32 - Qiita

PlatformIOでコンパイル

上記コードでは、WiFi.hをインクルードしているが、特にPlatformIOでライブラリ追加はいらなかった。
PlatformIOの標準で付いている?
プロジェクト作成時に"Espressif ESP32-C3-DevKitM-1"の選択をしたが、この中に含まれている?

コンパイル時のログは下記の通り。

ログを全部見る

*  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
--------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- WiFi @ 2.0.0
Building in release mode
Compiling .pio\build\esp32-c3-devkitm-1\src\main.cpp.o
Building .pio\build\esp32-c3-devkitm-1\bootloader.bin
Generating partitions .pio\build\esp32-c3-devkitm-1\partitions.bin
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFi.cpp.o
esptool.py v4.5.1
Creating esp32c3 image...
Merged 1 ELF section
Successfully created esp32c3 image.
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiAP.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiGeneric.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiMulti.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiSTA.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiScan.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiUdp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Esp.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FirmwareMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\FunctionalInterrupt.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HWCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\IPv6Address.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\MD5Builder.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Print.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\StreamString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USB.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBCDC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\USBMSC.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\WString.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\base64.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\cbuf.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-adc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-bt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-cpu.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-dac.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-gpio.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c-slave.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-i2c.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-ledc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-matrix.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-misc.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-psram.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rgb-led.c.o
Archiving .pio\build\esp32-c3-devkitm-1\lib4ca\libWiFi.a
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-rmt.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-sigmadelta.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-spi.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-time.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-timer.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-tinyusb.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-touch.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\esp32-hal-uart.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\firmware_msc_fat.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cdecode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\libb64\cencode.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\main.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\stdlib_noniso.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_shift.c.o
Archiving .pio\build\esp32-c3-devkitm-1\libFrameworkArduino.a
Linking .pio\build\esp32-c3-devkitm-1\firmware.elf
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]  11.4% (used 37372 bytes from 327680 bytes)
Flash: [=====     ]  54.0% (used 707752 bytes from 1310720 bytes)
Building .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Creating esp32c3 image...
Merged 2 ELF sections
Successfully created esp32c3 image.
================================== [SUCCESS] Took 11.30 seconds ==================================
 *  Terminal will be reused by tasks, press any key to close it. 

ところどころにWi-Fi関連のログがある。

Dependency Graph
|-- WiFi @ 2.0.0
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiAP.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiClient.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiGeneric.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiMulti.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiSTA.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiScan.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiServer.cpp.o
Compiling .pio\build\esp32-c3-devkitm-1\lib4ca\WiFi\WiFiUdp.cpp.o

デバイスつないで書き込み、実行

PlatformIOで、"Upload and Monitor"をやった結果のログ。

ログを全部見る

 *  Executing task: C:\Users\a\.platformio\penv\Scripts\platformio.exe run --target upload --target monitor --environment esp32-c3-devkitm-1 

Processing esp32-c3-devkitm-1 (platform: espressif32; board: esp32-c3-devkitm-1; framework: arduino)
---------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp32-c3-devkitm-1.html
PLATFORM: Espressif 32 (6.9.0) > Espressif ESP32-C3-DevKitM-1
HARDWARE: ESP32C3 160MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-builtin, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.0 (2.0.17)
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - tool-mkfatfs @ 2.0.1
 - tool-mklittlefs @ 1.203.210628 (2.3)
 - tool-mkspiffs @ 2.230.0 (2.30)
 - toolchain-riscv32-esp @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 33 compatible libraries
Scanning dependencies...
Dependency Graph
|-- WiFi @ 2.0.0
Building in release mode
Retrieving maximum program size .pio\build\esp32-c3-devkitm-1\firmware.elf
Checking size .pio\build\esp32-c3-devkitm-1\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"       
RAM:   [=         ]  11.4% (used 37372 bytes from 327680 bytes)
Flash: [=====     ]  54.0% (used 707752 bytes from 1310720 bytes)
Configuring upload protocol...
AVAILABLE: cmsis-dap, esp-bridge, esp-builtin, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
CURRENT: upload_protocol = esptool
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\esp32-c3-devkitm-1\firmware.bin
esptool.py v4.5.1
Serial port COM3
Connecting....
Chip is ESP32-C3 (revision v0.3)
Features: WiFi, BLE
Crystal is 40MHz
MAC: 68:67:25:b2:d0:54
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Flash will be erased from 0x00000000 to 0x00003fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00010000 to 0x000c0fff...
Compressed 13248 bytes to 9562...
Writing at 0x00000000... (100 %)
Wrote 13248 bytes (9562 compressed) at 0x00000000 in 0.5 seconds (effective 227.1 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 146...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (146 compressed) at 0x00008000 in 0.1 seconds (effective 408.0 kbit/s)...
Hash of data verified.
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 555.3 kbit/s)...
Hash of data verified.
Compressed 723264 bytes to 437404...
Writing at 0x00010000... (3 %)
Writing at 0x0001bd02... (7 %)
Writing at 0x00025ec7... (11 %)
Writing at 0x0002e54a... (14 %)
Writing at 0x00034cc8... (18 %)
Writing at 0x0003bc4d... (22 %)
Writing at 0x00041cff... (25 %)
Writing at 0x00047a25... (29 %)
Writing at 0x0004d6b3... (33 %)
Writing at 0x000536bc... (37 %)
Writing at 0x000596eb... (40 %)
Writing at 0x0005f667... (44 %)
Writing at 0x0006592a... (48 %)
Writing at 0x0006b3b0... (51 %)
Writing at 0x00070ca5... (55 %)
Writing at 0x00077087... (59 %)
Writing at 0x0007cf90... (62 %)
Writing at 0x00082ce4... (66 %)
Writing at 0x00088e1f... (70 %)
Writing at 0x0008f3e4... (74 %)
Writing at 0x00095814... (77 %)
Writing at 0x0009b9c6... (81 %)
Writing at 0x000a1af1... (85 %)
Writing at 0x000a7921... (88 %)
Writing at 0x000af48b... (92 %)
Writing at 0x000b5ea6... (96 %)
Writing at 0x000bc037... (100 %)
Wrote 723264 bytes (437404 compressed) at 0x00010000 in 12.7 seconds (effective 457.2 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
--- Terminal on COM3 | 115200 8-N-1
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at https://bit.ly/pio-monitor-filters
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
ESP-ROM:esp32c3-api1-20210207
Build:Feb  7 2021
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd5810,len:0x438
load:0x403cc710,len:0x90c
load:0x403ce710,len:0x2624
entry 0x403cc710
Wi-Fi接続を開始します
...........
Wi-Fi接続に成功しました
IPアドレス: 192.168.1.37
Wi-Fi接続中
Wi-Fi接続中
Wi-Fi接続中
Wi-Fi接続中

シリアルコンソールへの表示は下記の通りで、きちんとWi-FiルーターからIPアドレスをもらって、Wi-Fi接続できている。

Wi-Fi接続を開始します
...........
Wi-Fi接続に成功しました
IPアドレス: 192.168.1.37
Wi-Fi接続中
Wi-Fi接続中
Wi-Fi接続中
Wi-Fi接続中

ここまで

PlatformIOでのWi-Fi機能開発のやり方が分かった。
特別なライブラリ追加不要だったので、スムーズだった。

次回は、本番用プログラムを進める。