ESP-WROOM-02を使ってみる

実行環境を確認する


前回
、Arduino-IDEを使ったESP-WROOM-02へのスケッチ書き込み を紹介しま した。
そこで、今回はスケッチ実行時の環境を確認してみます。

こ ちらのページの「Minimal Hardware Setup for Running only」では
VCC VCC(3.3V)
GND GND
GPIO_0 PullUp
GPIO_15 PullDown
CH_PD PullUp
と書かれています。

この結線ではスケッチが動いたり、動かなかったり安定しませんでした。
そこでRESETのPullUpを追加したところ、安定して起動するようになりました。
VCC VCC(3.3V)
GND GND
GPIO_0 PullUp
GPIO_15 PullDown
CH_PD PullUp
RESET PullUp

GPIO_0がPullUp、GPIO_15がPullDownであれば、GPIO_2の状態に関係なくFlash Boot Modeで起動します。
スケッチの書き込み時には、GPIO_2はPullUpしておく必要が有りますので、GPIO_2は常にPullUpでも問題ありません。
WeMosやNodeMCUでは、スケッチ書き込み時にUSB-UART変換チップのDTRとRTSを使った、
こ ちらのリセット回路でGPIO_0とRESETのPullUp/PullDownを自動的に切り替えています。
難しい回路ではないので、自分で組み込むことも可能です。

また、電源(特に電流容量)にはかなりシビアで、500mA以上ないと安定してWiFiの接続ができません。
USB-TTL変換モジュールからの3.3V給電ではWiFi接続時に電流不足でクラッシュします。
USBの5Vを3.3Vに変換して使うときは、レギュレータ(AMS1117がよく使われます)を慎重に選ぶ必要が有ります。

GPIOとして実際に使えるのは(Tx/Rxを除いて)以下の9本で す。
・GPIO_0(※)
・GPIO_2(※)
・GPIO_4
・GPIO_5
・GPIO_12
・GPIO_13
・GPIO_14
・GPIO_15(※)
・GPIO_16

以下のスケッチで、これらのピンを使ったLチカが動くことを確認しました。
(※)GPIO_0、GPIO_2、GPIO_15は起動モードの選択ピンとして使われます。
PullUpやPullDownしておく必要がありますが、出力ポートとしては普通に使うことができます。
/*
 * Blink LED with ESP-13
 */

int pins[] = { 0, 2, 4, 5, 12, 13, 14, 15, 16 };
int numpins;

void setup() {
  delay(1000);
  Serial.begin(9600);
  numpins=sizeof(pins)/4;
  Serial.print("Start numpins=");
  Serial.println(numpins);
  for (int i=0;i<numpins;i++) {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], LOW);
  }
}

void loop() {
  static int pin=0;

  Serial.print("pin=");
  Serial.println(pins[pin]);
  for (int i=0;i<numpins;i++) {
    digitalWrite(pins[i], LOW);
  }
  digitalWrite(pins[pin], HIGH);
  pin++;
  if (pin == numpins) pin=0;
  delay(1000);
}

以下のスケッチで、これらのピンをディジタル入力で使える事を確認しました。
(※)GPIO_0、GPIO_2、GPIO_15は起動モードの選択ピンとして使われます。
PullUpやPullDownしておく必要がありますので、入力ポートとして使う場合は注意する必要があります。
*
 * Digital Read with ESP-13
 */

int pins[] = { 4, 5, 12, 13, 14, 16 };
int numpins;

void setup() {
  delay(1000);
  Serial.begin(9600);
  numpins=sizeof(pins)/4;
  Serial.print("Start numpins=");
  Serial.println(numpins);
  for (int i=0;i<numpins;i++) {
    pinMode(pins[i], INPUT);
  }
}

void loop() {
  static int pin=0;
  int data;

  Serial.print("pin=");
  Serial.print(pins[pin]);
  data=digitalRead(pins[pin]);
  Serial.print(" data=");
  Serial.println(data);
  pin++;
  if (pin == numpins) pin=0;
  delay(1000);
}