RMC-RA4M1の環境を(無理やり)VSCode+PlatformIOで構築する

# 1. はじめに
実はプライベートで[Hondaエコマイレッジチャレンジ](https://global.honda/jp/emc/)（通称：エコラン。1L相当のガソリンで航続距離を競う競技）に参加しており、Honda製の50cc魔改造エンジンを制御するためのECUをArduinoUnoR4 MINIMAで自作しています。

自分が参加する前の2022年までは既に離脱したメンバーによるPICを用いた自作ECUを使用していたのですが、電子回路・制御プログラムを触れるメンバーがおらずマイナートラブルの解消にも目途が立っていない状態でした。
同じ社内のメンバーから誘われて自分が参加した2023年からは当時販売開始になったばかりの[ArduinoUnoR4](https://www.renesas.com/ja/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ra-partners/arduino-uno-r4)を用いた自作のECUの開発にチャレンジし、2024年には実際に鈴鹿大会@鈴鹿サーキットと全国大会@モビリティリゾートもてぎにて実走しています。
残念ながら2024年はマシントラブルで完走には至っていないのですが、ECU起因のトラブルはなくなったので着手した甲斐はありました。

ただ、2023年に開発を開始した当初から追加した機能が多く、早晩UnoR4ではI/Oやフットプリントが厳しくなりそうなので、2025年からはUnoR4互換ボードの[RMC-RA4M1](https://www2.himdx.net/mcr/product/download.html#ra4m1)の使用を予定しています。

# 2. RMC-RA4M1について
RMC-RA4M1については下記ブログを参照ください。

https://ameblo.jp/ogura-castle/entry-12864231681.html

https://me-yoh.com/substitute-arduino-uno-r4-3

このRMC-RA4M1、もともとは[マイコンカーラリー](https://j-mcr.net/index.html)という高校・工業高校を対象にしたミニ四駆のようなモデルカーを自動制御してゴールするまでの時間を競う競技用に販売されているマイコンボードのようです。
MCUはルネサスの純正RA4M1の100ピン仕様なので品質や供給能力は問題ないと思いますし、フットプリントや端子はArduinoUnoR4 Minima/WiFiに準拠しているのでShield基板もUno用のものが使用できる可能性が高いです。
所謂互換ボードというやつですね。

ただ、開発にあたっての最大の問題は
**ArduinoIDEには対応しているのにVSCode+PlatformIOには未対応(2025.1.2現在)**
ということです。

厳密にいうとArduinoUnoR4 Minimaにも存在するI/O・機能を使用する分には問題ないのですが、追加のI/OやRMC-RA4M1に搭載されたmicroSDコネクタなどを使用しようとするとC/C++のコンパイル時にエラーが発生します。

Arduinoのライブラリのバージョン互換問題を解消できるVSCode+PlatformIOの組み合わせからは離れたくないので、なんとかしてRMC-RA4M1をVSCode+PlatformIOで使えるようにします。

:::note alert
**今後、公式にRMC-RA4M1もVSCode+PlatformIOで使用できるようになるかもしれませんが、現時点では公式から対応方法のアナウンスはないので自己責任でお願いします。**
:::

# 3. 環境構築とコンパイル・書き込みまで

:::note warn
VSCodeとPlatformIOのセットアップは完了しており、ArduinoUnoR4 MINIMAで開発ができるようプロジェクトも作成できている前提で話を進めます。
また、**[RMC-R4M1(rev.2.0)基板 実習マニュアル.pdf](https://j-mcr.net/download/rmc_ra4m1_rev20_zisyu.pdf)のP.14 3.6.ArduinoIDEでプログラムを書き込む**までは 実施してファームウェアの書き込みと最低限の動作確認までは済ませておいてください。
:::


## 3.1. パッケージファイルの入手
PlatformIOで使用するパッケージファイルは、特に変更していなければ```C:\Users\{ユーザー名}\.platformio\packages```になっていると思いますので、このディレクトリで下記の```git```コマンドを実行します。

```powershell
C:\Users\{ユーザー名}\.platformio\packages>
git clone https://github.com/todateman/framework-arduinorenesas-uno-mcr_rev20.git -b 1.1.1
```

これは公式で用意されているRMC-RA4M1のArduinoIDE用ボードマネージャーファイル [arduinocore-renesas_uno_mcr_rev20-1.1.1.tar.bz2](https://j-mcr.net/arduino_mcr/arduinocore-renesas_uno_mcr_rev20-1.1.1.tar.bz2)[^1] をplatformio用のArduinoUnoR4ライブラリ [platformio/framework-arduinorenesas-uno](https://registry.platformio.org/tools/platformio/framework-arduinorenesas-uno) を参考に```framework-arduinorenesas-uno```のフォーマットで修正したものです。
一応、公式のライブラリはバージョンが1.1.1扱いになっているようなので、gitにも同じファイルで上書きしてタグをつけておきました。

https://github.com/todateman/framework-arduinorenesas-uno-mcr_rev20

[^1]: [RMC-R4M1(rev.2.0)基板 実習マニュアル.pdf](https://j-mcr.net/download/rmc_ra4m1_rev20_zisyu.pdf)のP.10にArduinoIDEに追記するボードマネージャーのURL: https://j-mcr.net/arduino_mcr/rmc_ra4m1_rev20_install.json の記載があります。
このjsonファイルを開くと、arduinocore-renesas_uno_mcr_rev20-1.1.1.tar.bz2のダウンロードURLが分かります。

https://github.com/todateman/framework-arduinorenesas-uno-mcr_rev20/commit/a094156af5aa9487aafb31c893a1da3cfc6dd1a9 を見てもらえればどこが変わったのかわかりますが、内容は吟味せず```arduinocore-renesas_uno_mcr_rev20-1.1.1.tar.bz2```側のファイルで一律上書きしているので、RMC-RA4M1専用として扱った方が無難だと思います。

## 3.2. platformio.iniの書き換え

```git clone```ができたら、プロジェクトのディレクトリ内にある```platformio.ini```ファイルをこのように書き換えます。
※ArduinoUnoR4 MINIMAとボードを切り替えて併用したい場合は書き換えではなく追記してください。

```diff:platformio.ini
- [env:uno_r4_minima]
- platform = renesas-ra
- board = uno_r4_minima
- monitor_speed = 115200
- framework = arduino

+ [env:rmc_ra4m1_20]
+ platform = https://github.com/todateman/platform-renesas-ra.git
+ platform_packages = framework-arduinorenesas-uno@symlink://C:\Users\{ユーザー名}\.platformio\packages\framework-arduinorenesas-uno-mcr_rev20
+ board = rmc_ra4m1_20
+ monitor_speed = 115200
+ framework = arduino
```

```
platform = https://github.com/todateman/platform-renesas-ra.git
```
は公式のプラットフォーム```https://github.com/platformio/platform-renesas-ra.git```をベースに、RMC-RA4M1でもコンパイルできるよう
- ```‎boards/rmc_ra4m1_20.json```を新規に作成
- ‎```builder/frameworks/fsp.py```に追記
- ‎```builder/platform.py```に追記

したものを自分のアカウントでフォークしたものです。
プルリクエストを出しているのでいずれは本家に反映されるかもしれませんが、それまではこのリポジトリを使用してください。

https://github.com/todateman/platform-renesas-ra

なお、```‎boards/rmc_ra4m1_20.json```の作成にあたっては下記を参考にしました。

https://docs.platformio.org/en/latest/platforms/creating_board.html

https://qiita.com/WhiteGrouse/items/10c36e382efd2872d267

```
platform_packages = framework-arduinorenesas-uno@symlink://C:\Users\{ユーザー名}\.platformio\packages\framework-arduinorenesas-uno-mcr_rev20
```
は3.1.でgit cloneしたパッケージファイルを無理やり```framework-arduinorenesas-uno```として使用できるように、リンクを張っています。
この方法は下記を参考にしました。

https://community.platformio.org/t/how-update-a-package-used-by-platform/36733



なお、 https://docs.platformio.org/en/stable/projectconf/sections/env/options/platform/platform_packages.html#projectconf-env-platform-packages に倣って```platformio.ini```に直接
```
platform_packages = framework-arduinorenesas-uno-mcr_rev20 @ https://github.com/todateman/framework-arduinorenesas-uno-mcr_rev20.git
```
と記述しないのは、シンボリックリンクを使用していないためArduinoUnoR4 MINIMA/WiFi用の```framework-arduinorenesas-uno```の方を使用しようとしてしまい、コンパイルに失敗してしまうからです。

正直、3.1.の```git clone```は個別に実施するのは面倒なので、どなたかいい方法があれば教えてください。


## 3.3. コンパイル・書き込み
ここまでできればVSCode+PlatformIOで```env:rmc_ra4m1_20```を選択すればRMC-RA4M1に対してコンパイル・書き込みができるはずです。
最初に```env:rmc_ra4m1_20```を選択した時には環境構築に時間がかかるかもしれませんが、2回目以降は早く終わると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360166/d606dd9d-e2e0-2ba0-3e62-f71de6684296.png)

以上です。

## 4. おまけ(framework-arduinorenesas-unoライブラリへの統合

[3.1. パッケージファイルの入手](#31-パッケージファイルの入手)で触れたplatformio用のArduinoUnoR4ライブラリ [platformio/framework-arduinorenesas-uno](https://registry.platformio.org/tools/platformio/framework-arduinorenesas-uno) はgithubのリポジトリ[ArduinoCore-renesas](https://registry.platformio.org/tools/platformio/framework-arduinorenesas-uno)が2025.1.2時点で1.3.2まで進んでいるので、今回のRMC-R4M1対応も本家の1.3.2に準拠することで考えています。
既にプルリクエストは出していますが、もし同様の環境で使用されたい方は

```powershell
C:\Users\{ユーザー名}\.platformio\packages>
git clone -c core.symlinks=true --recursive https://github.com/todateman/framework-arduinorenesas-uno-mcr_rev20.git -b useSymlink
```

で試してください。

ライブラリなどは本家1.3.2のまま触っていないので、RMC-RA4M1以外のボードとも互換性があるはずです。
注意点として、このライブラリではシンボリックリンクを使用しているので```core.symlinks=true```のオプションを使用すること、他のgithubリポジトリを入れ子で使用しているので、```--recursive```のオプションを有効にして入れ子のgitリポジトリも同時に取得するようにしてください。
また、ブランチ名指定のため``` -b useSymlink```のオプションもお忘れなく。

もしこのブランチでエラーが出る場合は、ArduinoCore-APIやシンボリックリンクの有効化が必要なあります。
ArduinoCore-APIのgithubは https://github.com/arduino/ArduinoCore-API です。
```C:\Users\{ユーザー名}\.platformio\packages```のディレクトリで```git clone```してください。

シンボリックリンクの有効化に関して、windowsならば下記の記事を参考にしてください。

https://qiita.com/ucho/items/c5ea0beb8acf2f1e4772