【Arduino】MicroFanのESP8266-CORE ESP-WROOM-02を使う

it

MicroFanのESP8266-CORE(WROOM-02)を使ってみました。
基本性能の評価や無線(Wifi)を使って簡単なWebサーバーを作った内容を記事にしました。

マイコン名

簡単紹介


マイクロファン ラボ ESP8266-COREについて : 外部サイト

◆入手

amazonやYahoo! shoppingで\1000前後で購入できます。

ピン配置

外観

使ってみた

◆開発環境

Arduino環境で開発しました。
ボードライブラリには「esp8266 by ESP8266 Community」を使いました。

Arduino環境でのコンパイル時間をストップウォッチで計測しました。
単純なスケッチですがコンパイルするのにかかった時間は約10秒です。
Arduino環境で使えるマイコン基板の中では中盤程度の速さです。

プログラム関数にprintf()が使えます。
シリアル出力などで書式付き出力を使えるので、print()やprintln()を組み合わせて行数の増えるコードを削減できます。

発売から年月立っていますが、未だ十分活躍できるポテンシャルを持っています。
Arduino環境で開発できるESPマイコンとのベンチマークです。

同クロック帯でもESP32C3に比べて半分程度の効率です。

基板名CPUクロック(MHz)結果(周期 MHz)
ESP8266-COREXtensa LX106800.311
ESP8266-COREXtensa LX1061600.622
XIAO ESP32C3RIS-V1601.13
ESP32 DevkitC V4Xtensa LX62404.2
XIAO ESP32-S3Xtensa LX72400.98

室温22℃(5月の日中)で使っていましたが、マイコンのシールド部がほのかに暖かくなっています。
人が快適に過ごせる環境ならフィンや冷却は不要と思います。

ミドルクラスの性能でWifiが使える点が魅力です。
機能は最近のESPに比べると劣りますが、シンプルな設計だと前向きにとらえることにします。

◆ADC

ESP8266では0~1Vまで測れます。

下図は0~3.3Vまで入力したときに読み取ったAD値です。
1Vまでは直線的な読み取りができていましたが、1V以上はサチレーションして読み取れていません。

ほとんどのマイコンでは3.3Vか5Vまで測定できます。
ADCも1chしか使えないのでやりたいことがこのマイコンでできるか注意です。

◆無線(Wifi)
無線機能はWifiが使えます。
今回Wifiを使った簡単なWebサーバーを作りました。

アンテナ不要で手軽に使うことができます。


準備

Arduino環境の作成

◆開発環境

Arduino環境を使用します。
Arduino環境の作成についてはこちらで紹介しています。

◆ボードライブラリ

ボードマネージャのURLhttp://arduino.esp8266.com/stable/package_esp8266com_index.json
検索esp8266
ボードライブラリesp8266 by ESP8266 Community x.x.x※
選択するボードesp8266 > Generic ESP8266 Module
※動作確認では1.1.3を使用

◆モジュールライブラリ

I2CのサンプルではSSD1306、SPIのサンプルではILI9341とXPT2046を使用します。
サンプルを使用しない場合はインストール不要です。

SSD1306

OLED(SSD1306)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit SSD1306 by AdafruitSSD13062.5.11
Adafruit GFX Library by AdafruitGFX1.11.10

LCD(ILI9341)

LCD(ILI9341)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
Adafruit ILI9341 by AdafruitILI93411.6.1
Adafruit GFX Library by AdafruitGFX1.11.11

タッチパネル(XPT2046)

タッチパネル(XPT2046 または HR2046)を使用する場合にインストールします。

ライブラリ名検索確認時のバージョン
XPT2046_Touchscreen by Paul StoffregenXPT20461.4

コンパイルと書き込み

Arduino環境で書き込みボタンを押すことで書き込みができます。

スケッチ

デジタル出力

説明

GPIOのデジタル出力を使います。
LowとHighを繰り返し、プログラム繰り返し速度の計測をします。

計測にはオシロスコープ(HDS272)を使用し、信号の立ち上がりから次の立ち上がり(または立下りから次の立下り)までの時間を計測します。

このスケッチをコンパイルするのにかかった時間をストップウォッチで計測します。

配線

配線不要
オシロスコープで、GPIO0とGNDをプローブします。

スケッチ

#define PIN    (0)

void setup()
{
  pinMode(PIN, OUTPUT);
}

void loop()
{
  while(1)
  {
    digitalWrite(PIN, HIGH);
    digitalWrite(PIN, LOW);
  }
}

結果

スケッチのコンパイルにかかった時間は 10秒 でした。

オシロスコープ(HDS272)でGPIOのLow/High時間を計測しました。
CPUクロック80MHzでのA-B間の時間は3.22us、
CPUクロック160MHzでのA-B間の時間は1.608usでした。

クロックの設定に対して比例した変化が見えます。

デジタル入力出力

説明

ESP8266-COREのGPIO入出力を使います。
GPIOの出力にはユーザLED青の点灯(GPIO16)を使います。
ESP8266-COREのユーザLED青は、電圧がLOWで点灯、HIGHで消灯します。

GPIOの出力にはGPIO15を使いました。
ESP8266のデジタル入力では、pinModeのパラメータにINPUT_PULLDOWN、INPUT_PULLUPが設定できません。
実回路上でプルダウン、プルアップ抵抗を使った回路が必要です。

今回の配線ではプルダウンしています。

配線

スケッチ

#define LED_PIN     (16)
#define BUTTON_PIN  (15)

void setup()
{
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);

  while(1)
  {
    digitalWrite(LED_PIN, digitalRead(BUTTON_PIN));
  }
}

void loop()
{}

結果

ボタンを押していない間(画像上部)はユーザLED青が点灯しました。
ボタンを押している間(画像下部)はユーザLED青が消灯しました。

ボタンを押さない状態でユーザLEDをしばらく観察していると、数秒周期で一瞬消える現象がありました。
消えている時間は50ms弱です。
ユーザLEDのGPIO16からGPIO14に変更すると、一瞬消える現象がなくなりました。
原因がわからないので対処がありませんが、GPIO16は積極的に使わない方向で考えます。

PWM出力

説明

ESP8266-COREのPWMを使用します。
基板上のLED(GPIO16)をパッと光らせてゆっくり消灯させます。

配線

配線不要

スケッチ

#define PWM_PIN (16)

void setup()
{
  pinMode(PWM_PIN, OUTPUT);
}

void loop()
{
  const int16_t wai = 10;
  for(int16_t i = 0; i < 256; i ++)
  {
    analogWrite(PWM_PIN, i);
    delay(wai);
  }

}

結果

LED(青)は強く光ったあと徐々に暗くなる繰り返し動作をしました。
この動作をオシロスコープでモニタするとDutyの変化する様子がモニタ出来ました。

信号の幅を測定しました。
ESP8266のPWMは1.000msで約1kHzの周期です。

アナログ入力(ADC)

説明

ESP8266-COREのADCを使い、読み取った結果をシリアル(USBシリアルから)出力します。
ESP8266-COREのADCは0~1.0Vを10bit分解能(0~1023)で読み取ります。

今回電圧の入力にはXIAO SAMD21のDACを使いました。
0~3.3Vまで約2秒、3.3~0Vまで約2秒かけて変化を繰り返すようスケッチしています。

配線

スケッチ

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

  pinMode(A0, INPUT);

  while(1)
  {
    delay(2);
    Serial.println(analogRead(A0));
  }
}

void loop()
{
}

結果

ADC読み取りの様子と結果です。
入力電圧はXIAO SAMD21のDACから3.3Vまで入力しています。

ESP8266-COREのADCは1.0Vまでを10bit(0~1023)で表現します。
入力電圧1Vで頭打ちになり1024(AD)で固定されました。
(10bitですがなぜか1024で出力されていました)

UART

説明

ESP8266-COREのUARTを使います。
UARTからの入力をそのままUARTに出力するオウム返しです。

USBシリアルのTXとRXはUARTのTXとRXと共通のようなので同じ情報の入出力ができます。

配線

スケッチ

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

void loop()
{
  if(Serial.available())
  {
    Serial.write(Serial.read());
  }

}

結果

USBシリアルはCOM7、USB-UART変換アダプタ(FT232RL)はCOM3で認識されました。
(ローカルエコーはON)

COM14側から”ESP8266-CORE”と入力すると、COM3側にも入力した文字が表示されました。
COM14側はローカルエコーとオウム返しにより”EESSPP88226666–CCOORREE”と表示されました。

COM3側から”TAMANEGI”と入力すると、COM14側にも入力した文字が表示されました。
COM3側はローカルエコーとオウム返しにより”TTAAMMAANNEEGGII”と表示されました。

UART-シリアル変換アダプタをCH340Eに変えてみました。
UARTピンからの入出力をするようになり、半単にUSBシリアルの入力は認識されなくなりました。

I2C(SSD1306)

説明

I2Cを使いOLED(SSD1306)の表示制御をします。
OLEDのI2Cアドレスは3c(h)です。

OLED上に
“MicroFan”
“ESP8266-CORE”
と表示し、角丸枠で囲みます。

表示サンプルはAdafruit Exampleを参考にしました。
メニュー > Examples > Adafruit SSD1306 > ssd1306_128x64_i2c

配線

スケッチ

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH   (128)
#define SCREEN_HEIGHT  (64)

#define OLED_RESET     (-1)
#define SCREEN_ADDRESS (0x3C)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        
void setup()
{
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();
  
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 5);
  display.print(F("MicroFan"));
  
  display.setTextSize(1);
  display.setCursor(30, 25);
  display.print(F("ESP8266-CORE"));

  display.drawRoundRect(0, 0, display.width(), 40,display.height() / 4, SSD1306_WHITE);
  display.display();
}

void loop()
{
}

結果

OLEDに表示ができました。
今回白色発光のOLEDを使っています。

SPI(ILI9341, XPT2046)

説明

ESP8266-COREのSPIを使ってLCD表示とタッチパネルの座標読み取りをします。

画面上のタッチ位置にドットを描画し、簡単なメモパッドを作ります。

LCDはILI9341 2.4inch、使用したモジュールライブラリは「Adafruit ILI9341 by Adafruit」です。
表示サンプルにAdafruit Exampleを参考にしました。

タッチパネルはXPT2046感圧式タッチパネル、使用したモジュールライブラリは「XPT2046_Touchscreen by Paul Stoffregen」です。

ILI9341とXPT2046はどちらもSPIで制御します。
MOSI, SCKは共通です。

配線

スケッチ

#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>
#include <SPI.h>

#define TFT_DC      (2)
#define TFT_RST     (0)
#define TFT_CS      (SS)
#define TFT_MOSI    (MOSI)
#define TFT_SCK     (SCK)

#define TOUCH_CS    (4)
#define TFT_MOSI    (MOSI)
#define TOUCH_MISO  (MISO)
#define TFT_SCK     (SCK)


#define RADIUS      (2)

XPT2046_Touchscreen ts(TOUCH_CS);
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

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

  tft.begin();
  tft.setRotation(1);
  tft.setTextSize(2);
  tft.fillScreen(ILI9341_BLACK);

  ts.begin();
  ts.setRotation(3);

}

void loop()
{
  boolean bTouch = ts.touched();

  if (bTouch == true)
  {
    const int16_t Offset_x = 150;
    const int16_t Offset_y = 150;
    float RateX = (float)320 / (3700 - Offset_x);
    float RateY = (float)240 / (3700 - Offset_y);

    TS_Point tPoint = ts.getPoint();

    int16_t x = (float)(tPoint.x - Offset_x) * RateX;
    int16_t y = (float)(tPoint.y - Offset_y) * RateY;
    tft.fillCircle(x, y, RADIUS, ILI9341_WHITE);
    Serial.printf("(x,y) = (%d, %d) : (%d, %d)\r\n", tPoint.x, tPoint.y, x, y);
  }
}

結果
ILI9341の表示とXPT2046のタッチ読み取りできました。
結果の画像は「た」と描いてみた様子です。

Wifi(Webサーバ)

説明

Wifiを使ったWebサーバを作ります。
Webサーバ上には「LED off」と「LED on」ボタンを配置し、ボタンを押すことで基板上のLED(青)のOff/On制御をします。

このスケッチの実行にはログインできるWifi環境が必要で、SSIDとパスワードが必要です。
スケッチの5, 6行目の情報を書き換えてコンパイルします。

配線

配線不要です。

スケッチ

#include <ESP8266WiFi.h>

#define LED_PIN   (16)

const char* ssid = "your SSID";
const char* password = "your Password";

WiFiServer server(80);

char html[][128] =
{
  "HTTP/1.1 200 OK",
  "Content-Type: text/html",
  "<!DOCTYPE HTML>",
  "\n",
  "<html>",
  "<button onclick=\"location.href='/?LED=ON'\" type=\"button\">LED on</button>",
  "<button onclick=\"location.href='/?LED=OFF'\" type=\"button\">LED off</button>",
  "</html>",
  0
};
void setup()
 {
    Serial.begin(115200);
    pinMode(LED_PIN, OUTPUT);

    WiFi.begin(ssid, password);

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

    Serial.println("WiFi connected.");
    Serial.println(WiFi.localIP());
    server.begin();
}

void loop() 
{
  WiFiClient client = server.available();

  if (client)
  {
    boolean currentLineIsBlank = true;
    String request = "";
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        request += c;

        if (c == '\n' && currentLineIsBlank)
        {
          int i = 0;
          while(html[i][0] != 0)
          {

            client.println(html[i]);
            i ++;
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }

    if (request.indexOf("GET /?LED=ON") >= 0)
    {
      digitalWrite(LED_PIN, LOW);
    }
    if (request.indexOf("GET /?LED=OFF") >= 0)
    {
      digitalWrite(LED_PIN, HIGH);
    }

    delay(1);
    client.stop();
  }
}

結果
シリアルモニタからIPアドレスを読み取ります。

ブラウザのアドレスバーに表示されたIPアドレスを入力することでESP8266-COREのWebを閲覧できます。
Web上の「LED on」ボタンを押すことでLEDが点灯、「LED off」ボタンを押すことでLEDが消灯しました。

コメント

タイトルとURLをコピーしました