Skip to content

ESP32

ESP32 とは

ESP32は、中国のEspressif社が製造する小型のマイコンボード(マイクロコントローラー)です。

主な特徴

  • 低コスト: 数百円で購入できる
  • 高性能: 240MHzデュアルコアCPU、豊富なメモリ
  • WiFi・Bluetooth対応: インターネット接続やワイヤレス通信が可能
  • GPIOが豊富: 30以上のデジタル入出力ピンを搭載
  • 小さい: 指の爪くらいのサイズ

OSECHI宇宙線検出器もESP32ベースで設計されています。


Arduino 互換とは

Arduinoってなに?

Arduinoは、マイコンの開発を簡単にするためのプラットフォームです。 プラットフォームには3つの層があります:

  1. ハードウェア - マイコンボード
  2. ソフトウェア - IDE(開発環境)とライブラリ
  3. プログラミング言語 - Arduino言語(C++ベース)

Arduino 互換の意味

Arduino互換」とは、以下を意味します:

  • Arduinoと同じプログラミング言語が使える
  • Arduino IDEで開発できる
  • Arduinoライブラリをそのまま使える

つまり、Arduino向けに書かれたプログラムが、ほぼそのままESP32でも動作するということです。

メリット

  • 学習曲線が緩い:Arduinoの知識が直接活かせる
  • ライブラリが豊富:既存のコード資産を再利用できる
  • コミュニティが大きい:困ったときに情報が見つかりやすい

具体例

// Arduino互換なコード(ArduinoとESP32の両方で動作)
void setup() {
  Serial.begin(115200);  // シリアル通信を初期化
  pinMode(LED_BUILTIN, OUTPUT);  // LEDピンを出力に設定
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // LEDを点灯
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);   // LEDを消灯
  delay(1000);
}

ESP32の開発方法

必要なツール

  1. PlatformIOまたはArduino IDE
  2. マイコンのプログラムを書いて、ボードに書き込むためのツール
  3. OSECHIではPlatformIOを使用しています

  4. USBケーブル

  5. パソコンとESP32を接続するため
  6. データ転送と電力供給の両方を行う

  7. テキストエディター

  8. プログラムを書くのに使う
  9. VS Code推奨

開発の流れ

1. ソースコードを書く (.cppや.hファイル)
   ↓
2. コンパイル(ビルド)
   コンピュータが理解できる機械語に変換
   ↓
3. ファームウェアの書き込み
   USBケーブルでESP32にアップロード
   ↓
4. 実行・テスト
   ESP32がプログラムを実行
   ↓
5. デバッグ(問題があれば修正)
   シリアルモニタで動作確認

OSECHIでの開発例

OSECHIでは以下のタスクを使用します:

# ビルド(コンパイル)
task build

# ボードに書き込み
task upload

# シリアルモニタを開いて動作確認
task monitor

プログラミングの基本

ESP32はスケッチ(Arduinoプログラム)を実行します。 最小限のプログラムは次のようになります:

void setup() {
  // 起動時に1回だけ実行
  Serial.begin(115200);  // パソコンとの通信を開始
}

void loop() {
  // ずっと繰り返し実行
  Serial.println("Hello ESP32!");
  delay(1000);  // 1秒待つ
}

ESP32のハードウェアの特徴

ESP32は30個以上のGPIOピンを搭載しています また、WiFiとBluetoothを内蔵しています。

GPIOピンの分類

すべてのピンが同じ用途で使える訳ではありません。 ピンの種別と用途を以下にまとめました。

ピン種別 説明 用途
デジタルI/O 通常のGPIO LED制御、ボタン読み取り
アナログ入力(ADC) アナログセンサー値を読む 温度、光量、距離センサー
SPI/I2C 通信プロトコル用 センサーデバイスとの通信
UART シリアル通信 パソコンとの通信

よく使うピン

ESP32 Dev Board
├── GPIO0: ブート選択用(通常は使わない)
├── GPIO2: LED制御、デジタル出力
├── GPIO4 / 5 / 12-15: 汎用GPIO
├── GPIO32 / 33: ADC専用
├── GPIO21 / 22: I2C通信
└── ... その他多数

注意: ピンによって機能が限定されているため、用途に応じて適切なピンを選ぶ必要があります。

ADC(アナログデジタル変換)

ESP32は2つのADCチャンネルを搭載しており、アナログセンサーから値を読み込めます。

ADC1とADC2の違い

特性 ADC1 ADC2
ピン数 8ピン 10ピン
利用可能ピン GPIO32-39 GPIO0, 2, 4, 12-15, 25-27
WiFi使用時 常に使える WiFi使用時は使えない
推奨 WiFi併用時 WiFiを使わない場合

ADC値の読み込み関数

ESP32では、ADC値を読み込むための2つの関数があります。

analogRead() - デジタル値で読み込む

// 12ビット(0-4095)のデジタル値を返す
int rawValue = analogRead(GPIO32);
// rawValue: 0-4095 の整数値

analogReadMilliVolts() - ミリボルト値で読み込む

// ミリボルト(0-3300mV)の物理値を返す
// 内部キャリブレーション済み
int millivolts = analogReadMilliVolts(GPIO32);
// millivolts: 0-3300 (単位:mV)

ADC内部キャリブレーション

ESP32は出荷時に内部キャリブレーション値が記録されており、analogReadMilliVolts()はこの値を使って自動補正します。

  • analogRead(): 補正なし、速度優先
  • analogReadMilliVolts(): キャリブレーション適用、精度優先

推奨: 精密な測定が必要な場合はanalogReadMilliVolts()を使用してください。 OSECHIの宇宙線検出では精度が重要なため、適切なキャリブレーション方法を選択する必要があります。

使用例

#include <driver/adc.h>

void setup() {
  Serial.begin(115200);
  analogSetAttenuation(ADC_11db);  // 入力範囲設定(0-3.3V対応)
}

void loop() {
  // 方法1:デジタル値(速度優先)
  int raw = analogRead(GPIO32);
  Serial.print("Raw: ");
  Serial.println(raw);

  // 方法2:ミリボルト値(精度優先、キャリブレーション済み)
  int mv = analogReadMilliVolts(GPIO32);
  Serial.print("mV: ");
  Serial.println(mv);

  delay(100);
}

OSECHI での使用: OSECHIは宇宙線検出器の信号記録にADCを使用しています。 環境センサー(温度、湿度、気圧)はBME280を使ってI2C通信で読み込みます。

WiFi機能

#include <WiFi.h>

void setup() {
  // WiFiネットワークに接続
  WiFi.begin("SSID", "PASSWORD");

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

用途:

  • インターネット接続
  • クラウド連携
  • リモート制御
  • ルーター経由のデータ送信

Bluetooth機能

#include <BluetoothSerial.h>

BluetoothSerial SerialBT;

void setup() {
  SerialBT.begin("ESP32");  // Bluetooth デバイス名
}

void loop() {
  if (SerialBT.available()) {
    char c = SerialBT.read();
    Serial.println(c);
  }
}

用途:

  • スマートフォンとの通信
  • ワイヤレス周辺機器
  • IoTデバイス間通信

WiFiとADC2の注意点

重要な制限:

  • WiFiを使用中は、ADC2が使えません
  • ADC2が必要な場合は、WiFiを使わないか、ADC1を使う必要があります
// 危険:以下のコードはWiFi使用時に問題が発生します
WiFi.begin("SSID", "PASSWORD");
int value = analogRead(GPIO_ADC2_CH0);  // ← WiFi使用時は読値が不安定

まとめ

項目 説明
ESP32 小型で安い、WiFi・Bluetooth対応のマイコンボード
Arduino互換 Arduinoのプログラムがそのまま使える
開発方法 PlatformIOやArduino IDEでプログラムを書いて、USBで転送
GPIO 30個以上のピン、用途に応じて機能が異なる
ADC アナログセンサー対応、ADC1はWiFi併用可
通信 WiFi、Bluetooth内蔵でインターネット連携が容易
学習コスト 低い:Arduinoの知識があれば始められる

ESP32は初心者から上級者まで幅広く使われている、非常に人気のあるマイコンボードです。