PlatformIOにM5Stamp Picoのボード定義を追加してみた

筆者はマイコン初心者です。普段は趣味でプログラミングをしています。
開発環境として、Arduino IDEのBeta版はVSCodeベースになって従来のものより使いやすくなっています。ですが、普段使っているVisual StudioやJetBrains製品と比べると使いにくく感じたため、VSCodeをそのまま使えるPlatformIOに移行しようと決心しました。
この記事では、PlatformIOへStamp Picoのボード定義を追加する手順を説明します。

# Stamp Picoの対応状況(2021/09/07)
| 環境 | バージョン | 状況 |
|:-:|:-:|:-:|
| UIFlow Web     | Beta | 〇 |
| UIFlow Desktop | 1.0.17 | × |
| Arduino IDE    |  | 〇 |
| PlatformIO     |  | × |

残念ながらPlatformIOの対応ボードにStamp Picoは追加されていませんでした。
Stamp PicoはM5Stack Atomの機能縮小版で、プログラムの読み書きに使用するピンは同じなので、M5Stack Atomのボードを選択しても良いのですが、若干ピン配列の定義が異なっていたのが気になりボード定義を追加することにしました。

ところで、Arduino IDEの設定で指定する追加ボード定義に関して、M5Stack公式のものがStamp Picoに対応しているのですが、どうやらファイルサイズがおかしいようです。m5stack-1.0.9.zipのファイルサイズが35882376となっていますが、正しくは35882437です。私はgistに修正したものを置いて読み込ませました。
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

# 定義の追加手順
PlatformIOはインストールしてある前提で進めます。また、プラットフォームとしてEspressif32をインストールしておいてください。
また、インストールされているディレクトリを`{PIODIR}`で表します。
インストール時に特に設定していなければ`%UserProfile%\.platformio`です。

## 1. Espressif32にボード定義を追加
`{PIODIR}\platforms\espressif32\boards`に`stamp-pico.json`を追加します。

```json:stamp-pico.json
{
  "build": {
    "arduino":{
      "ldscript": "esp32_out.ld"
    },
    "core": "esp32",
    "extra_flags": "-DARDUINO_STAMP_PICO",
    "f_cpu": "240000000L",
    "f_flash": "40000000L",
    "flash_mode": "dio",
    "mcu": "esp32",
    "variant": "stamp_pico"
  },
  "connectivity": [
    "wifi",
    "bluetooth",
    "ethernet",
    "can"
  ],
  "frameworks": [
    "arduino",
    "espidf"
  ],
  "name": "STAMP-PICO",
  "upload": {
    "flash_size": "4MB",
    "maximum_ram_size": 327680,
    "maximum_size": 4194304,
    "require_upload_port": true,
    "speed": 1500000
  },
  "url": "http://www.m5stack.com",
  "vendor": "M5Stack"
}
```
## 2. ピン配列定義の追加
`{PIODIR}\packages\framework-arduinoespressif32\variants`に`stamp_pico`というディレクトリを作成し、その中に`pins_arduino.h`を追加します。

```c++:pins_arduino.h
#ifndef Pins_Arduino_h
#define Pins_Arduino_h

#include <stdint.h>

#define EXTERNAL_NUM_INTERRUPTS 16
#define NUM_DIGITAL_PINS        40
#define NUM_ANALOG_INPUTS       16

#define analogInputToDigitalPin(p)  (((p)<20)?(esp32_adc2gpio[(p)]):-1)
#define digitalPinToInterrupt(p)    (((p)<40)?(p):-1)
#define digitalPinHasPWM(p)         (p < 34)

static const uint8_t TX = 1;
static const uint8_t RX = 3;

static const uint8_t SDA = 21;
static const uint8_t SCL = 22;

static const uint8_t SS    = 19;
static const uint8_t MOSI  = 26;
static const uint8_t MISO  = 36;
static const uint8_t SCK   = 18;

static const uint8_t G21 = 21;
static const uint8_t G22 = 22;
static const uint8_t G19 = 19;
static const uint8_t G26 = 26;
static const uint8_t G36 = 36;
static const uint8_t G18 = 18;
static const uint8_t G25 = 25;
static const uint8_t G32 = 32;
static const uint8_t G33 = 33;
static const uint8_t G1 = 1;
static const uint8_t G3 = 3;
static const uint8_t G0 = 0;

static const uint8_t DAC1 = 25;
static const uint8_t DAC2 = 26;

static const uint8_t ADC1 = 32;
static const uint8_t ADC2 = 33;
static const uint8_t ADC3 = 36;

#endif /* Pins_Arduino_h */
```

# まとめ
以上でPlatformIOのボード定義の追加は完了です。M5Stackから発売されているESP32 Downloaderで接続しておけばDownloadモードなども気にせず書き込めます。

__筆者はマイコン初心者なので、修正する箇所などあれば教えてください！！__

今回、正式にPlatformIOでサポートされるまで待ちきれず自分でボード定義を追加しましたが、実はプルリクは送っていません。PlatformIOの更新以前にarduino-esp32が更新されていないため、まずはそちらを待ってからになるからです。M5StackのGitHubも確認しましたが、Stamp Picoに関する更新はほぼ皆無です。もっと言えばM5StackのArduinoIDE向けドキュメントの[Quick Start](https://docs.m5stack.com/en/arduino/arduino_development)にまだStamp Picoの解説が追加されてなかったりします。。。