ESP WROOM 32

 

ESP8266でLチカやWiFi接続がうまくいったことに気をよくして,BanggoodにESP WROOM 32の開発用のボードを発注する.この時点ではまだ日本ではESP32は単体でしか販売されていないので狭いピッチの端子に工夫してはんだ付けする必要がある.その後,秋月電子で中国より安く開発ボードが発売された.

ESP8266とESP WROOM 32の違いは?

  ESP8266 ESP32
Package QFN-48 (6×6 mm) QFN-48 (6x6 mm)
CPU Tensilica LX106 @ 80 / 160 MHz Tensilica Xtensa Dual-Core LX6 @ 160 / 240Mhz
RAM 36KB 520 KB
Flash 1, 2, 4, 8 or 16 MB up to 64 MBytes
WiFi
Bluetooth ×
I/O GPIO:17,PWM:4,I2C:1,UART:2 GPIO:32,PWM:8,I2C:2,UART:3

I/Oが増えた,Bluetoothが付いた.CPUが速くなってメモリが増えた.書いてないけどWiFiも速くなっている.

今回,Banggoodから購入した開発ボードのピン配置は次の通り.秋月電子で販売している開発ボートとは配置が違っている.そもそもピン数が違うみたい.

 

------- Pin Name ------- ------ Pin Name ------
EN D23
VP D22
VN TX0
D34 RX0
D35 D21
D32 D19
D33 D18
D25 D5
D26 TX2
D27 RX2
D14 D4
D12 D2
D13 D15
GND GND
VIN 3.3V

Arduinoへボード情報を追加する.

Arduino IDEへESP8266のボード情報を追加しただけではESP32のボード情報は何も追加されなかった.ESP8266と同じようにどこかのURLを指定するのかと思ったが,次のようにして開発環境を追加するとうまく言った.なお,以下の操作はESP32(ESP-WROOM-32)でLチカの丸パクリです.

  1. https://github.com/espressif/arduino-esp32にアクセスし,右上にあるClone or Downloadをクリックし,出てきたメニューのDownloadZIPを選択するとダウンロードのダイアログが出てくるので,「ファイルに保存」を選択する.
  2. ダウンロードしたファイルを展開するとarduino-esp32-masterというフォルダの中にcores,doc,libraries,tools,variantsなどのフォルダといくつかのファイルが作られる.
  3. 解凍により得られたフォルダ,ファイルなどをC:/Program Files(x86)/Arduino/hardware/espressif/esp32/にコピーする.(上の参考ページとちょっと違ってる)
  4. esp32/toolsの中にあるget.exeをダブルクリックして実行する.何をしてるのかはよくわからない.

以上でArduino IDEのインストールは終了

Lチカ

ハードウエアと開発環境の準備ができたので,まず,プログラムの書き込みができることを確認する.ありきたりにボードについているLEDを点滅させるLチカで確認する.

ブレークアウトボードにはUSBシリアル変換チップが搭載されているので,ボードとパソコンをUSBケーブルで接続すればそのまま電源も供給される.ただし,ESP32は大飯ぐらいらしいので,Wifiを使うときには外部から電源を供給したほうがいいらしい.デバイスマネージャで確認すると,このボードにはSiliconLabsのCP210xが搭載されているようなのでCP210xのVCPドライバをインストールしておく.CP210xのWindows10用のドライバは昔探したときはなかったように記憶しているんだけど,いま見たらちゃんとWiodows10もサポートしてますね.
とにかく,ボードをUSBケーブルで接続して,デバイスマネージャを立ち上げるとポート(COMとLPT)の項目にSilicon Labs CP210x何とか(COM8)のように表示される.COM8かどうかはパソコンの状態による.
Arduino IDEを立ち上げて,ファイル→スケッチ例→01:Basics→Blinkを選択する.
Arduino 1.8.1のスケッチ例のBlinkのソースにはLED_BUILTINが定義されていないので,プログラムの最初の方で,
#define LED_BUILTIN 2
と定義する.

#define LED_BUILTIN 2 // この定義を追加する
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

ツールからボードESP32を選択,シリアルポートは前にデバイスマネージャで表示されたポート(COM8など)を選択
横向き→アイコン(マイコンボードに書き込む)をクリックする.書き込みが始まる前に,ボード上のBootスイッチとENスイッチを同時に押し,先にENを放し,コンパイルが終わって書き込みが始まったらBootを放す.Bootは書き込み中に放さなくともよくて,書き込みが始まるときに押された状態であればいいみたいだ.たぶんこれでいいはず.

WiFi通信

WiFi経由でLEDを点滅させてみる.

まず最初にWiFiルータを用意しておき,DHCPなどが使えるようにしておく.

スケッチの例にSimpleWiFiServerのという使用例があるので,まずこれを使ってみる.

ファイル→スケッチの例→(ESP32 Dev Modulesのスケッチ例の下にある)WiFi→SimpleWiFiServerを選択する

プログラムの最初の方に#define LED_BUILTIN 2を追加する.(今使っている開発ボードのLEDはポート2に接続されているため)

接続したいWiFiアクセスポイントのssidとそのパスワードを設定する.

プログラムの終りの方にあるdigitalWrite関数内のポート番号をLED_BUILTINへ変更する.print分のメッセージの中にもポート番号が書いてあるが面倒くさいので直していない.

 

 

#define LED_BUILTIN 2

#include 

const char* ssid     = "ROBOTPOINT";
const char* password = "K23456789012";

WiFiServer server(80);

void setup()
{
    Serial.begin(115200);
    pinMode(LED_BUILTIN, OUTPUT);      // set the LED pin mode

    delay(10);

    // We start by connecting to a WiFi network

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

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

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
    server.begin();

}

int value = 0;

void loop(){
 WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Clickhereturn the LED on pin 5 on");
            client.print("Clickhereturn the LED on pin 5 off");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(LED_BUILTIN, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(LED_BUILTIN, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

このプログラムをコンパイルして実行すると,まずアクセスポイントに接続してDHCPからIPアドレスを受け取り,仮想シリアルポートにその情報を書き出す.この出力を見るためにツール→シリアルモニタを選択し,シリアルコンソールを開くと次のようなメッセージを見ることができる.

 

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0008,len:8
load:0x3fff0010,len:1848
load:0x40078000,len:6800
load:0x40080000,len:252
entry 0x40080034


Connecting toROBOTPOINT
....
WiFi connected
IP address: 
192.168.0.143
new client

この中のIP address:の次の行に取得したIPアドレスが表示されるので,メモしておく.

アクセスポイントのネットワークに接続されているパソコンでブラウザを立ち上げ,Locationにhttp://192.168.0.143/と入力すると次のように表示される.

onの方をクリックするとLEDが光り,offをクロックすると消灯する.

 

電源どうする?
 

ネット情報をあさっていると,ESP32の消費電流は大きいのでWiFiなどの無線インターフェースを使うときにはUSBではなく,別に電源を用意したほうがいいという記事を見かける.平均電流は大丈夫だが,ピーク電流が大きいらしい.電源電圧は3.3Vらしいのでなんとかスイッチングで3.3Vのステップダウンコンバータを作ろう.

I2CインターフェースのLCD表示器

秋月電子で扱っているACM1602NI-FLW-FBW-M01を接続して何か表示させてみよう.

今回はこのLCDを3.3Vで使用するが,5V電源でも規格内に収まっている.ピン接続は次の通り.

          1 2 3 4 5 6 7                                    
Vss Vdd V0  SCL SDA BL+ BL-

シリアル通信

GPSで受け取った位置情報をWiFiで送信

I2C通信でIMUからのデータを取り込む

I2C使用上の注意点が書いてあった.これによるとI2Cで使用するピンを自由に指定できるらしい.どのピンを指定できるのかとデータシートを見てみたらAny GPIOと書いてあった.どのGPIOでも割り当てることができるようだ.

 

 

 

 

 

 

最終更新:2017年03月29日 15:29
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。