M5Stack Core2 for AWS

# はじめに

昨年M5Stackで [FreeRTOSを動かしてみた記事](https://qiita.com/fukuebiz/items/54f765d12c084ceea392) をQiitaに投稿した後、M5StackでFreeRTOSを動かしてみる人が増えた気がします。AWSのIoT/FreeRTOSワークショップでもM5Stackが使われることもありました。M5Stackは安価に上手にパッケージングされていて、誰でも気軽に使うことができる本当に便利なデバイスです。

そして先日、M5Stack Core2 for AWS - ESP32 IoT開発キット が発売されました。M5Stack BASICはIoTやFreeRTOSの勉強用には便利なものでしたが、メモリが512Kだったり、使いこなすにはちょっと不足を感じる点がありましたが、M5Stack Core2 for AWS - ESP32 IoT開発キット はいくつかの面でパワーアップされています。

初日、M5Stack Core2 for AWS - ESP32 IoT開発キット は30分くらいで売り切れてしまいましたが、幸い購入できましたので簡単にレポートさせて頂きます。

# M5Stack Core2 for AWS - ESP32 IoT開発キット

シンプルなパッケージで送られてきました。本体、USB-Cケーブル、レンチが入っています。スイッチを入れるとロゴが表示されて起動音が鳴ります。その後AWS IoT EdukitページのQRコードが表示されて、本体の横に配置されたLEDが点灯します。

出荷時のファームウェアは [こちら](https://github.com/m5stack/Core2-for-AWS-IoT-EduKit/tree/master/Core2-for-AWS-IoT-EduKit-Factory-Firmware) のようです。

接続には SiLabs CP210x drivers が必要ですが、以前M5Stackを使用していればすでにインストールされています。Tera Termでシリアル接続してみると、次のようなメッセージが表示されます。

```
ets Jul 29 2019 12:21:46

rst:0x1 (POWERON_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:4
load:0x3fff0034,len:7600
ho 0 tail 12 room 4
load:0x40078000,len:15348
load:0x40080400,len:4888
entry 0x400806a4
I (31) boot: ESP-IDF v4.2-beta1-227-gf0e87c933a 2nd stage bootloader
I (31) boot: compile time 10:30:21
I (31) boot: chip revision: 3
I (36) boot_comm: chip revision: 3, min. bootloader chip revision: 0
I (43) qio_mode: Enabling default flash chip QIO
I (48) boot.esp32: SPI Speed      : 80MHz
I (53) boot.esp32: SPI Mode       : QIO
I (57) boot.esp32: SPI Flash Size : 16MB
I (62) boot: Enabling RNG early entropy source...
I (67) boot: Partition Table:
I (71) boot: ## Label            Usage          Type ST Offset   Length
I (78) boot:  0 nvs              WiFi data        01 02 00011000 00006000
I (86) boot:  1 phy_init         RF data          01 01 00017000 00001000
I (93) boot:  2 factory          factory app      00 00 00020000 00100000
I (101) boot: End of partition table
I (105) boot_comm: chip revision: 3, min. application chip revision: 0
I (112) esp_image: segment 0: paddr=0x00020020 vaddr=0x3f400020 size=0x5eb6c (387948) map
I (255) esp_image: segment 1: paddr=0x0007eb94 vaddr=0x3ffb0000 size=0x01484 (  5252) load
I (258) esp_image: segment 2: paddr=0x00080020 vaddr=0x400d0020 size=0x41e70 (269936) map
I (356) esp_image: segment 3: paddr=0x000c1e98 vaddr=0x3ffb1484 size=0x00ff4 (  4084) load
I (357) esp_image: segment 4: paddr=0x000c2e94 vaddr=0x40080000 size=0x00404 (  1028) load
I (363) esp_image: segment 5: paddr=0x000c32a0 vaddr=0x40080404 size=0x11b30 ( 72496) load
I (410) boot: Loaded app from partition at offset 0x20000
I (410) boot: Disabling RNG early entropy source...
I (411) psram: This chip is ESP32-D0WD
I (416) spiram: Found 64MBit SPI RAM device
I (420) spiram: SPI RAM mode: flash 80m sram 80m
I (425) spiram: PSRAM initialized, cache is in low/high (2-core) mode.
I (433) cpu_start: Pro cpu up.
I (436) cpu_start: Application information:
I (441) cpu_start: Project name:     core2forAWS-default-firmware
I (448) cpu_start: App version:      2b790e5-dirty
I (453) cpu_start: Compile time:     Nov 17 2020 10:30:15
I (459) cpu_start: ELF file SHA256:  cb6c82cca7492871...
I (465) cpu_start: ESP-IDF:          v4.2-beta1-227-gf0e87c933a
I (472) cpu_start: Starting app cpu, entry point is 0x40081dac
I (0) cpu_start: App cpu up.
I (975) spiram: SPI SRAM memory test OK
I (975) heap_init: Initializing. RAM available for dynamic allocation:
I (976) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (982) heap_init: At 3FFC7730 len 000188D0 (98 KiB): DRAM
I (988) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (994) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (1001) heap_init: At 40091F34 len 0000E0CC (56 KiB): IRAM
I (1007) cpu_start: Pro cpu start user code
I (1012) spiram: Adding pool of 4096K of external SPI memory to heap allocator
I (1032) spi_flash: detected chip: generic
I (1032) spi_flash: flash io: qio
I (1032) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
I (1045) spiram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (1063) atecc608a:  Seeding the random number generator...
I (1064) atecc608a:  ok
I (1086) atecc608a: Initializing ATECC608a secure element
I (1086) atecc608a: ok
I (1086) atecc608a: Checking data zone lock status...
I (1108) atecc608a: ok: locked
I (1108) atecc608a: Get the device info (type)...
I (1126) atecc608a: ok: 60 02
I (1126) core2forAWS: Firmware Version: 1.0.0
I (2740) I2S: DMA Malloc info, datalen=blocksize=256, dma_buf_count=2
I (2740) I2S: PLL_D2: Req RATE: 44100, real rate: 44642.000, BITS: 16, CLKM: 14, BCK: 8, MCLK: 11289966.924, SCLK: 1428544.000000, diva: 64, divb: 11
I (2750) I2S: PLL_D2: Req RATE: 44100, real rate: 44642.000, BITS: 16, CLKM: 14, BCK: 8, MCLK: 11289966.924, SCLK: 1428544.000000, diva: 64, divb: 11
I (2769) main: **************************************

I (2770) main: Device Serial: 0123xxxxxxxxxxxxxx

I (2776) main: **************************************


```

# ワークショップ

AWSから [ワークショップのドキュメント](https://edukit.workshop.aws) が公開されています。内容は次のようなものです。IoTの自習ができるようになっています。

1. Getting Started - 動作確認とWiFiのプロビジョニング
2. Blinky Hello World - 開発環境(ESP-IDF)とAWS IoT Coreのセットアップ
3. Smart Thermostat - AWS IoT Coreの基礎知識
4. Smart Spaces - AWS IoTと機械学習の基礎知識
5. Intro to Alexa for IoT - Alexa for IoTデモ

残念ながら、FreeRTOSは登場しません。


# Getting Started

起動の確認ができたので、[ワークショップのドキュメント](https://edukit.workshop.aws) を参考に開発環境を準備します。

- SiLabs CP210x drivers

 M5StackをPCにシリアル接続するためにドライバーをインストールします。このドライバーはM5Stack BASICなどと同じなので、すでにM5Stackを使用している人は改めてインストールする必要はありません。

- Visual Studio Code + PlatformIO

Visual Studio Codeに加えてさまざまな開発ボートをサポートするPlatformIOを使用します

- ESP RainMaker

スマホからデバイスを設定するためのESP RainMakerをAndroid/iOSのアプリストアからインストールします

- ソースコードのクローン

M5Stack Core2 for AWS IoT EduKit 用に提供されている学習用のソースコードをGitHubからクローンします。

```sh:
git clone https://github.com/m5stack/Core2-for-AWS-IoT-EduKit.git
```

Windows PCの場合、PlatformIOのデフォルトのプロジェクトのフォルダー C:\Users\<ユーザー>\Documents\PlatformIO\Projects 下だとパス名が長すぎるというエラーでクローンできませんでした。その場合は C:\ の直下にフォルダーを作成するなどしてください。

- USBケーブル接続、電源投入

- PlatformIOでGetting-Startedプロジェクトを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/27afd8e9-51fd-c59e-d1a9-c27aa2e64dfd.png)

- シリアルポートの調整

platformio.iniに記載されたシリアルポートをPCのOSに合わせて調整します。Windowsであればデフォルトで指定されたupload_portを消すか、; でコメントにします。

```ini:platformio.ini
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter, extra scripting
;   Upload options: custom port, speed and extra flags
;   Library options: dependencies, extra library storages
;
; Please visit documentation for the other options and examples
; http://docs.platformio.org/page/projectconf.html

[env:core2foraws]
platform = espressif32@2.1.0
framework = espidf
board = esp32dev
;upload_port = /dev/cu.SLAB_USBtoUART

monitor_speed = 115200
board_build.partitions = partitions_4MB_sec.csv

board_build.embed_txtfiles = 
  components/esp_rainmaker/server_certs/mqtt_server.crt
  components/esp_rainmaker/server_certs/claim_service_server.crt
  components/esp_rainmaker/server_certs/ota_server.crt
```
- ビルド

PlatformIOでビルドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/99e2f8fa-367c-95e1-f5be-84c9d6cb63cb.png)

- ファームウェアの書き込み

作成されたファームウェアをM5Stack Core2に書き込みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/a2433b33-036d-a1b9-4961-bd08567b14f6.png)

MonitorにQRコードが表示されます。スマホにインストールしたRainMakerアプリから、Add Deviceをクリックして、QRコードを読み取ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/6b1d9856-780b-9c73-8fcb-7635d2a6050e.png)

接続できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/84c229d2-1daa-1b9e-b27f-18b2502cd068.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555397/6c2e8cfc-ec65-42dd-7139-7dba96bbeb44.png)


# 参考

1. [M5StackでAmazon FreeRTOSを使用する　１](https://qiita.com/fukuebiz/items/54f765d12c084ceea392)
1. [M5StackでAmazon FreeRTOSを使用する　２](https://qiita.com/fukuebiz/items/3b803912bf51b1f46d79)
1. [M5StackでAmazon FreeRTOSを使用する　３](https://qiita.com/fukuebiz/items/732296b84e68a1a08d41)
1. [M5StackでAmazon FreeRTOSを使用する４（SDカード編）](https://qiita.com/fukuebiz/items/e7010b1d84131e93a0a3)
1. [M5StackでAmazon FreeRTOSを使用する５（shadow編）](https://qiita.com/fukuebiz/items/7b3d9d8185d183f2bd5b)
1. [M5StackでAmazon FreeRTOSを使用する６（OTA編）](https://qiita.com/fukuebiz/items/69bfb16592490bae4bf2)
1. [M5StackでAmazon FreeRTOSを使用する７（Greengrass編）](https://qiita.com/fukuebiz/items/6aac48ef7132a60398d6)