NANO ESP32 統合環境
2025.11.20

●Arduino Nano ESP32

Arduino Nano ESP32 ユーザーマニュアル
Arduino Nano ESP32 には、下記のような機能があります
・豊富なメモリ(384KB ROM,512KB RAM,16MB Flash, 8MB PSRAM
・USBホスト機能
・2系統のSPI
・2系統のI2C
・3系統のシリアル
・動作電圧3.3V
Features
| MICROCONTROLLER: | ESP32-S3R8 (Dual-core 32-bit Xtensa LX7) |
| CLOCK FREQUENCY: | ESP32-S3R8 240MHz |
| STORAGE: | 384KB ROM,512KB RAM,16MB Flash, 8MB PSRAM |
| WiFi: | 2.4GHz WiFi IEEE802.11 b/g/n |
| Bluetooth: | Bluetooth LE v5.0 |
| OPERATING VOLTAGE: | 3.3V |
| POWER INPUT: | 6-21V |
| IO PIN OUTPUT CURRENT: | 40mA |
| DIGITAL PINS: | 14 |
| ANALOG PINS: | 8 |
| DAC: | None |
| PWM: | 5 |
| UART: | 3 |
| I2C: | 2 |
| SPI: | 2 |
| 5V POWER OUTPUT: | 1000mA Max |
| VIN: | 6~21V |
| LED: | POWER(GREEN),SCK(YELLOW),RGB-LED |
VBUS
Nano ESP32は、5Vピンを搭載していません。
USB経由で電源供給されている場合、VBUSは5Vを供給します。
VIN
VIN入力電圧は6~21Vが推奨されています。
VINピン経由で電源供給されている場合はVBUSは無効になります。
VINピン経由でボードに電源を供給している間は、ボードから5Vを得ることができず、ロジックレベルシフタまたは外部5V電源を使用する必要があります。
ANALOG
すべてのアナログ ピンはデジタル ピンとしても使用できますが、その逆はできません。
ADCピンのデフォルトの解像度は 12 ビットです (0 ~ 4095 の間の値を返します)。
ADC2(A4~A7)ピンはWi-Fi機能とリソースを共有しているため、Wi-Fiが有効な間はアナログ入力として使用できません。ただし、I2C通信はWi-Fiと同時に使用できます。
DAC
実装されていません。
●Pinouts

~/.platformio/packages/framework-arduinoespressif32/variants/arduino_nano_nora/pins_arduino.h
#ifndef Pins_Arduino_h
#define Pins_Arduino_h
#include <stdint.h>
#define USB_VID 0x2341
#define USB_PID 0x0070
#ifndef __cplusplus
#define constexpr const
#endif
// primary pin names
#if defined(BOARD_HAS_PIN_REMAP) && !defined(BOARD_USES_HW_GPIO_NUMBERS)
// Arduino style definitions (API uses Dx)
static constexpr uint8_t D0 = 0; // also RX
static constexpr uint8_t D1 = 1; // also TX
static constexpr uint8_t D2 = 2;
static constexpr uint8_t D3 = 3; // also CTS
static constexpr uint8_t D4 = 4; // also DSR
static constexpr uint8_t D5 = 5;
static constexpr uint8_t D6 = 6;
static constexpr uint8_t D7 = 7;
static constexpr uint8_t D8 = 8;
static constexpr uint8_t D9 = 9;
static constexpr uint8_t D10 = 10; // also SS
static constexpr uint8_t D11 = 11; // also MOSI
static constexpr uint8_t D12 = 12; // also MISO
static constexpr uint8_t D13 = 13; // also SCK, LED_BUILTIN
static constexpr uint8_t LED_RED = 14;
static constexpr uint8_t LED_GREEN = 15;
static constexpr uint8_t LED_BLUE = 16; // also RTS
static constexpr uint8_t A0 = 17; // also DTR
static constexpr uint8_t A1 = 18;
static constexpr uint8_t A2 = 19;
static constexpr uint8_t A3 = 20;
static constexpr uint8_t A4 = 21; // also SDA
static constexpr uint8_t A5 = 22; // also SCL
static constexpr uint8_t A6 = 23;
static constexpr uint8_t A7 = 24;
#else
// ESP32-style definitions (API uses GPIOx)
static constexpr uint8_t D0 = 44; // also RX
static constexpr uint8_t D1 = 43; // also TX
static constexpr uint8_t D2 = 5;
static constexpr uint8_t D3 = 6; // also CTS
static constexpr uint8_t D4 = 7; // also DSR
static constexpr uint8_t D5 = 8;
static constexpr uint8_t D6 = 9;
static constexpr uint8_t D7 = 10;
static constexpr uint8_t D8 = 17;
static constexpr uint8_t D9 = 18;
static constexpr uint8_t D10 = 21; // also SS
static constexpr uint8_t D11 = 38; // also MOSI
static constexpr uint8_t D12 = 47; // also MISO
static constexpr uint8_t D13 = 48; // also SCK, LED_BUILTIN
static constexpr uint8_t LED_RED = 46;
static constexpr uint8_t LED_GREEN = 0;
static constexpr uint8_t LED_BLUE = 45; // also RTS
static constexpr uint8_t A0 = 1; // also DTR
static constexpr uint8_t A1 = 2;
static constexpr uint8_t A2 = 3;
static constexpr uint8_t A3 = 4;
static constexpr uint8_t A4 = 11; // also SDA
static constexpr uint8_t A5 = 12; // also SCL
static constexpr uint8_t A6 = 13;
static constexpr uint8_t A7 = 14;
#endif
// Aliases
static constexpr uint8_t LEDR = LED_RED;
static constexpr uint8_t LEDG = LED_GREEN;
static constexpr uint8_t LEDB = LED_BLUE;
// alternate pin functions
static constexpr uint8_t LED_BUILTIN = D13;
static constexpr uint8_t TX = D1;
static constexpr uint8_t RX = D0;
static constexpr uint8_t RTS = LED_BLUE;
static constexpr uint8_t CTS = D3;
static constexpr uint8_t DTR = A0;
static constexpr uint8_t DSR = D4;
static constexpr uint8_t SS = D10;
static constexpr uint8_t MOSI = D11;
static constexpr uint8_t MISO = D12;
static constexpr uint8_t SCK = D13;
static constexpr uint8_t SDA = A4;
static constexpr uint8_t SCL = A5;
#define PIN_I2S_SCK D7
#define PIN_I2S_FS D8
#define PIN_I2S_SD D9
#define PIN_I2S_SD_OUT D9 // same as bidir
#define PIN_I2S_SD_IN D10
#ifndef __cplusplus
#undef constexpr
#endif
#endif /* Pins_Arduino_h */
●Waveshare ESP32-S3-Nano
Arduino Nano ESP32は高額なので、統合環境の試作機には互換機を使用します



Compatible with Arduino Nano ESP32
Wiki: www.waveshare.com/wiki/ESP32-S3-Nano
●プロトタイプ作成

試作機を作るにあたり、KeyestudioのUNOプロトタイプ基板を用いました。

こんな感じになります。
●開発環境
ソースコードのビルドには、PlatformIOを使用しています
Arduino開発環境構築 PlatformIO
環境設定
$ pio boards 'NANO ESP32'
========================================================================
ID MCU Frequency Flash RAM Name
------------------ ------- --------- ----- ----- ------------------
arduino_nano_esp32 ESP32S3 240MHz 16MB 320KB Arduino Nano ESP32
~/.platformio/platforms/espressif32/boards/arduino_nano_esp32.json
"extra_flags": [
"-DARDUINO_NANO_ESP32",
"-DBOARD_HAS_PIN_REMAP", ← 削除
pins_arduino.h
#if defined(BOARD_HAS_PIN_REMAP) && !defined(BOARD_USES_HW_GPIO_NUMBERS)
// Arduino style definitions (API uses Dx)
static constexpr uint8_t D0 = 0; // also RX
static constexpr uint8_t D1 = 1; // also TX
......
#else
// ESP32-style definitions (API uses GPIOx)
static constexpr uint8_t D0 = 44; // also RX
static constexpr uint8_t D1 = 43; // also TX
......
arduino_nano_esp32.json で"-DBOARD_HAS_PIN_REMAP" の記述を削除してESP32スタイルのGPIO番号での指定を有効にしたほうがよいかもしれません。
環境設定ファイル
$ pio init -b arduino_nano_esp32
$ vi platformio.ini
[env:arduino_nano_esp32]
platform = espressif32
board = arduino_nano_esp32
framework = arduino
board_build.partitions = default_16MB.csv
build_flags =
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
-DCORE_DEBUG_LEVEL=4
board_build.arduino.memory_type = qio_opi
board_build.f_flash = 80000000L
board_build.flash_mode = dio
monitor_speed = 115200
upload_port = /dev/ttyACM0
$ pio run -e arduino_nano_esp32 -t upload
dfu-util: No DFU capable USB device available
リセットボタンをダブルクリックすると、DFUモードになり再び書き込めるようになります。
USB DFUプロトコル
NANO ESP32 ではアップロードにUSB DFUプロトコルを使用しています。
Nano ESP32 には、Arduino ブートローダー モードと呼ばれる機能があります。
これはボードの電源が入っているときにリセット ボタンを 2 回押すことで、ボードを一種のリカバリ モードにすることができることを意味します。
ブートローダーモードに入るには、リセットボタンを押し、RGB LEDが点滅したらもう一度押します。緑色のLEDがゆっくりと点滅し始めたら、ブートローダーモードに正常に入ったことがわかります。
DFUプロトコルをサポートしているRaspberry Pi OSについては下記を参考にしてください
Raspberry Pi OS Bookworm & PlatformIO
●USBホスト機能

Nano ESP32 では、GPIO19(USB D-).GPIO20(USB D+)がUSB端子に引き出されており、USBホスト機能を利用することができます。

USB MIDI機器をNano ESP32のUSB端子に接続して使用する場合、別途電源を供給する必要があります。
VIN端子の推奨入力電圧は6~21Vであり、かつVINからの電力供給はVBUSに出力されません。

Nano ESP32ボードの裏面をみてみると、USB端子と同じV+(D+),V-(D-),5V,GNDが存在するので、これを外付けUSB端子に接続します。
この外付け端子に5Vを供給すると、USB端子から5Vを電力供給することができます。
●I2C
Nano ESP32には2系統のI2Cバスがあります。
WireとWire1を同時に使用できるため、同じアドレスを共有する可能性のあるデバイスを操作するときに便利な機能です。

標準I2Cは、SDA:11、SCL:12です。このピンをQWIICコネクタに繋げています。
QWIICケーブルの先端にQwiicマルチポートアダプタを取り付けています。
Wire1を使用するには、SDAとSCLの2つの空きピンを設定する必要があります。
例) Wire1.begin(D4, D5); //sda, scl
●USBシリアルとUART

Nano ESP32 ボードには、3系統のハードウェア シリアル ポートと、USB経由で公開されるポートが備わっています。
checkPSRAM.ino
void setup() {
Serial.begin(115200);
Serial.printf("Internal Total heap %d, internal Free Heap %d\n", ESP.getHeapSize(), ESP.getFreeHeap());
Serial.printf("SPIRam Total heap %d, SPIRam Free Heap %d\n", ESP.getPsramSize(), ESP.getFreePsram());
Serial.printf("Flash Size %d, Flash Speed %d\n", ESP.getFlashChipSize(), ESP.getFlashChipSpeed());
Serial.printf("ChipRevision %d, Cpu Freq %d, SDK Version %s\n", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion());
Serial.println("");
}
void loop() {}
| Serial |
USBポートを指します。USB端子は色々な用途で使用されており、シリアル出力に用いようとすると下記のエラーが発生しました。
例) Serial.begin(115200);
$ pio device monitor -p /dev/ttyACM0 -b 115200
Disconnected (device reports readiness to read but returned no data (device disconnected or multiple access on port?))
Reconnecting to /dev/ttyACM0 .. Connected!
|
| Serial0 |
ボードの RX/TX ピン (D0:44、D1:43) を介してアクセスできるハードウェア シリアル ポート (UART) を指します。
例) Serial0.begin(115200);
$ pio device monitor -p /dev/ttyAMA0 -b 115200
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0xb (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x4bc
load:0x403c9700,len:0xbd8
load:0x403cc700,len:0x2a0c
entry 0x403c98d0
Internal Total heap 383556, internal Free Heap 350584
SPIRam Total heap 8386279, SPIRam Free Heap 8386035
Flash Size 16777216, Flash Speed 80000000
ChipRevision 0, Cpu Freq 240, SDK Version v4.4.7-dirty
ブートローダー/カーネルと共有され、ブート/リセット時にいくつかのメッセージを表示します。
|
Serial1 Serial2 |
任意の空いている GPIO に割り当てることができます。
システムメッセージを表示したくないときにはこの2つのポートを使用します。
例) Serial1.begin(115200,SERIAL_8N1, 6,5);
例) Serial2.begin(115200,SERIAL_8N1, 9,8);
$ pio device monitor -p /dev/ttyAMA0 -b 115200
Internal Total heap 383556, internal Free Heap 350584
SPIRam Total heap 8386279, SPIRam Free Heap 8386035
Flash Size 16777216, Flash Speed 80000000
ChipRevision 0, Cpu Freq 240, SDK Version v4.4.7-dirty
|
●SPI
Nano ESP32には2系統のSPIポート(HSPI)があります。

ここでは標準SPIをTFTディスプレイに使用しています。
#define SPI_MISO 47
#define SPI_MOSI 38
#define SPI_SCK 48
#define SPI_DC 21
#define SPI_TFT_CS 18
#define SPI_TFT_RST 17
#include <Adafruit_ILI9341.h>
Adafruit_ILI9341 tft = Adafruit_ILI9341(SPI_TFT_CS, SPI_DC, SPI_MOSI, SPI_SCK, SPI_TFT_RST, SPI_MISO);

標準SPIはUNOのピンソケット配列に合わせるようにアダプタを自作しました。

様々なSPI接続周辺機器を使用できるように脱着式にしています。
セカンドSPIポートを使用するには、空きピンを設定する必要があります。

セカンドSPIにmicroSDカードモジュールを接続して画像データを読込み、標準SPIにTFTに表示させています。
SPIClass SPI2(HSPI);
#define SPI2_MISO 3
#define SPI2_MOSI 2
#define SPI2_SCK 4
#define SPI2_CS 7
#define SDSPEED 40000000
void setup() {
pinMode(SPI2_CS, OUTPUT);
SPI2.begin(SPI2_SCK, SPI2_MISO, SPI2_MOSI, -1);
if (!SD.begin(SPI2_CS, SPI2, SDSPEED)) {
File jpegFile = SD.open( filename, FILE_READ);
........
}
●RGB LED
RGB LEDは発光色を使い分けてシステムの動作状況把握に使うのもよいかもしれません。

pins_arduino.h内にLEDピンの記載があります
static constexpr uint8_t LED_RED = 46;
static constexpr uint8_t LED_GREEN = 0;
static constexpr uint8_t LED_BLUE = 45; // also RTS
rgb_led.ino
int vDelay = 500; //Controls blink speed of built in and RGB leds
void setup()
{
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void toggleLED() {
if (digitalRead(LED_BUILTIN) == LOW){
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
}
void loop() {
toggleLED();
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
delay(vDelay);
toggleLED();
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
delay(vDelay);
toggleLED();
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
delay(vDelay);
toggleLED();
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
delay(vDelay);
toggleLED();
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
delay(vDelay);
toggleLED();
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
delay(vDelay);
toggleLED();
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
delay(vDelay);
}
●配線
| NANO ESP32 | | UNO PIN SOCKET |
| GND | | ─ | GND |
| 3V3 | | ─ | 3V3 |
| SPI_SCK | D13(48) | ─ | D13 |
| SPI_MISO | D12(47) | ─ | D12 |
| SPI_MOSI | D11(38) | ─ | D11 |
| SPI_DC | D10(21) | ─ | D10 |
| SPI_TFT_CS | D9(18) | ─ | D9 |
| SPI_TFT_RST | D8(17) | ─ | D8 |
| SPI_TFT_BL | D7(10) | ─ | D7 Backlight |
| Serial2 RX | D6(9) | ─ | Serial2 QWIIC(RX) |
| Serial2 TX | D5(8) | ─ | Serial2 QWIIC(TX) |
| SPI2_CS | D4(7) | ─ | microSD |
| GPIO1 | A0(1) | ─ | D6 |
| 3V3 | | ─ | D5 |
| GND | | ─ | D4 |
| Serial1 RX | D3(6) | ─ | Serial1 D2 |
| Serial1 TX | D2(5) | ─ | Serial1 D3 |
| Serial0 TX | D1(43) | ─ | Serial0 D1(TX1) |
| Serial0 RX | D0(44) | ─ | Serial0 D0(RX0) |
| ADC2_CH4 | A7(24) | 非推奨 | Wi-Fi機能とリソースを共有しているため、 Wi-Fi有効時はアナログ入力不可。 |
| ADC2_CH3 | A6(23) | 非推奨 |
| SCL | A5(22) | ─ | QWIIC(SCL) |
| SDA | A4(21) | ─ | QWIIC(SDA) |
| SPI2_SCK | A3(4) | ─ | microSD |
| SPI2_MISO | A2(3) | ─ | microSD |
| SPI2_MOSI | A1(2) | ─ | microSD |
| GPIO1 | A0(1) | ─ | A0 |
●DFROBOT PUSH Digital Push Button V2
GPIO1のみが未使用になっているので、これをプッシュボタンとして利用しました


このプッシュボタンはプルダウン回路が内蔵されています

●バックトレース
ESP32が実行時にコアを吐いた場合に、バックトレース情報からソースコードの該当箇所を調べることができます。
Backtrace: 0x42004031:0x3fced260 0x420077bd:0x3fced2a0
$ ~/.platformio/packages/toolchain-xtensa-esp32s3/bin/xtensa-esp32s3-elf-addr2line -pfiaC -e ".pio/build/arduino_nano_esp32/firmware.elf" 0x42004031:0x3fced260 0x420077bd:0x3fced2a0
ESP32が落ちた(強制リセット)時にBacktraceから該当コードを調べる
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|