- https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html
- http://mag.switch-science.com/2018/12/21/m5camera-test/
- https://github.com/nkolban/esp32-snippets/blob/master/wifi/fragments/connect_with_static_ip.c
ESP-IDF用MSYS設定手順
- esp32_win32_msys2_environment_and_toolchain-20181001.zipをダウンロード
- zipを解凍して、c:\msys32\へ配置
- c:\msys32\mingw32.exeを起動。ターミナルが起動する。
- "pacman -S vim" を実行
ESP-IDFのセットアップ手順。MSYS環境から次のコマンドを実行する
$ mkdir -p ~/esp
$ cd ~/esp/
$ git clone --recursive https://github.com/espressif/esp-idf.git
※環境変数の設定
$ vi ~/.bashrc
※ 「export IDF_PATH=~/esp/esp-idf/」を設定しておく
$ source ~/.bashrc
※pyhtonに必要なモジュールをインストールしておく
$ python2.7 -m pip install --user -r $IDF_PATH/requirements.txt
esptools.pyを使ってバックアップする。例はCOM4にM5Cameraが接続されている場合の例
$ python $IDF_PATH/components/esptool_py/esptool/esptool.py --chip esp32 --port COM4 --baud 921600 read_flash 0x0000 4194304 ~/esp32-original-backup.bin
※ MSYS環境の場合、COM?でポートを指定する必要あり。/dev/ttyS?で指定すると実行に失敗する…
書き戻す場合は次のコマンドを実行
$ python $IDF_PATH/components/esptool_py/esptool/esptool.py --chip esp32 --port COM4 --baud 921600 write_flash 0 ~/esp32-original-backup.bin
MSYS環境から次のコマンドを実行してソースコードをcloneする
$ cd ~/esp/
$ git clone https://github.com/m5stack/m5stack-cam-psram.git
$ cd m5stack-cam-psram
1/17現在、店頭で販売されているM5Cameraに対応するためにはピンアサインの修正が必要。 main/main.cを次のように修正する。
$ diff -u main/main.c.org main/main.c
--- main/main.c.org 2019-01-17 21:14:16.485605000 +0900
+++ main/main.c 2019-01-17 21:45:21.789814800 +0900
@@ -20,7 +20,7 @@
//M5STACK_CAM PIN Map
#define CAM_PIN_RESET 15 //software reset will be performed
#define CAM_PIN_XCLK 27
-#define CAM_PIN_SIOD 25
+#define CAM_PIN_SIOD 22
#define CAM_PIN_SIOC 23
#define CAM_PIN_D7 19
@@ -32,7 +32,7 @@
#define CAM_PIN_D1 35
#define CAM_PIN_D0 32
-#define CAM_PIN_VSYNC 22
+#define CAM_PIN_VSYNC 25
#define CAM_PIN_HREF 26
#define CAM_PIN_PCLK 21
次の手順でビルドする
$ make menuconfig
※"Serial flasher config"→"Default serial port"から書き込みに使用するシリアルポートを設定しておく
※設定をsaveしてmenuconfigを抜ける
$ make
ビルドが終わったら、PCにM5Cameraを接続し、"make flash"コマンドを実行して書き込みする。
$ make flash
ソースコード中にあるESP_LOGI(...)で出力されるメッセージは、PCにM5Cameraを接続している状態でモニタを起動すると見ることができる。
$ make monitor
モニタ実行中のキーバインドは次の通り。(一部抜粋)
ctrl+] モニタの終了
ctrl+T, ctrl+H ヘルプの表示
ctrl+T, ctrl+R リセット
ctrl+T, ctrl+P 出力の一時停止 (…というよりか、bootloaderへ落ちるコマンド)
ctrl+T, ctrl+Y 出力のON/OFF切り替え
モニタの詳細については、以下URLを参照。
次のようにmain/main.cを修正する。
$ diff -u main/main.c.org main/main.c
--- main/main.c.org 2019-01-17 21:45:21.789814800 +0900
+++ main/main.c 2019-01-17 22:06:08.603979600 +0900
@@ -15,6 +15,8 @@
#include "esp_event_loop.h"
#include "esp_http_server.h"
+#include <lwip/sockets.h>
+
static const char* TAG = "camera";
//M5STACK_CAM PIN Map
@@ -40,10 +42,14 @@
#define CAM_USE_WIFI
-#define ESP_WIFI_SSID "m5stack-cam"
-#define ESP_WIFI_PASS ""
+#define ESP_WIFI_SSID "ssid"
+#define ESP_WIFI_PASS "passowrd"
#define MAX_STA_CONN 1
+#define DEVICE_IP "192.168.1.123"
+#define DEVICE_GW "192.168.1.1"
+#define DEVICE_NETMASK "255.255.255.0"
+
#define PART_BOUNDARY "123456789000000000000987654321"
static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
@@ -233,19 +239,8 @@
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP:
- ESP_LOGI(TAG, "got ip:%s", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
- s_ip_addr = event->event_info.got_ip.ip_info.ip;
- xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT);
- break;
- case SYSTEM_EVENT_AP_STACONNECTED:
- ESP_LOGI(TAG, "station:" MACSTR " join, AID=%d", MAC2STR(event->event_info.sta_connected.mac) ,
- event->event_info.sta_connected.aid);
xEventGroupSetBits(s_wifi_event_group, CONNECTED_BIT);
- break;
- case SYSTEM_EVENT_AP_STADISCONNECTED:
- ESP_LOGI(TAG, "station:" MACSTR "leave, AID=%d", MAC2STR(event->event_info.sta_disconnected.m ac),
- event->event_info.sta_disconnected.aid);
- xEventGroupClearBits(s_wifi_event_group, CONNECTED_BIT);
+ s_ip_addr = event->event_info.got_ip.ip_info.ip;
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
esp_wifi_connect();
@@ -262,30 +257,36 @@
s_wifi_event_group = xEventGroupCreate();
tcpip_adapter_init();
+ tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
+ tcpip_adapter_ip_info_t ipInfo;
+
+ inet_pton(AF_INET, DEVICE_IP, &ipInfo.ip);
+ inet_pton(AF_INET, DEVICE_GW, &ipInfo.gw);
+ inet_pton(AF_INET, DEVICE_NETMASK, &ipInfo.netmask);
+ tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
+
+ s_wifi_event_group = xEventGroupCreate();
+
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
+ ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
+
wifi_config_t wifi_config = {
- .ap = {.ssid = ESP_WIFI_SSID,
- .ssid_len = strlen(ESP_WIFI_SSID),
+ .sta = {.ssid = ESP_WIFI_SSID,
.password = ESP_WIFI_PASS,
- .max_connection = MAX_STA_CONN,
- .authmode = WIFI_AUTH_WPA_WPA2_PSK},
+ },
};
- if (strlen(ESP_WIFI_PASS) == 0) {
- wifi_config.ap.authmode = WIFI_AUTH_OPEN;
- }
- ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
- ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
+ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
+ ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
+ ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE));
- uint8_t addr[4] = {192, 168, 4, 1};
- s_ip_addr = *(ip4_addr_t*)&addr;
-
- ESP_LOGI(TAG, "wifi_init_softap finished.SSID:%s password:%s",
- ESP_WIFI_SSID, ESP_WIFI_PASS);
+ ESP_LOGI(TAG, "Connecting to \"%s\"", wifi_config.sta.ssid);
+ xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);
+ ESP_LOGI(TAG, "Connected");
}
