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チカの丸パクリです.
以上で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
と定義する.
ツールからボード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でも割り当てることができるようだ.