はじめに
WCHのCH32V003を搭載し、290円で販売されているUIAPduino Pro Microに Mac(M1 Mac mini) のArduinoIDEで書き込めたので、手順をメモしておきます。
UIAPduino Pro Micro CH32V003 V1.4
この公式ガイドによると
「Macでは動作確認できていません。」
となっています。
書き込み時のエラー対応
デフォルトでの書き込みエラー
MacのArduinoIDEからのデフォルト状態での書き込みでは、以下のエラーになります。
"~/Library/Arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/minichlink" -w "~/Library/Caches/arduino/sketches/8B9CA5C16058A00FD3C3047815DEA2CA/Blink.ino.bin"
flash Failed uploading: cannot execute upload tool:
fork/exec ~/Library/Arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/minichlink:
exec format error
これは minichlink の実行ファイルが Mac で実行できない形式という意味です。
minichlink をM1 Macでビルドする
以下の手順に従い作業をします。
まず、RISC-V Toolchainのツールチェーンをインストールします。
UIAPduino用のリポジトリをクローンします。
git clone https://github.com/YuukiUmeta-UIAP/ch32fun.git
pkg-config をインストールします
brew install pkg-config
libusb をインストールします
brew install libusb
minichlinkのフォルダに移動してmakeします。
cd ch32fun/minichlink
make
生成されたminichlikをArduinoIDEのツールチェーンにコピーします。
cp minichlink ~/Library/Arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/
この状態でArduinoIDEから書き込みをするとエラーが出ます。
VID:0x1209, PID:0xb003
Error: Could not initialize any supported programmers
これは 書き込みツール(Programmer)が見つからない というエラーです。
UIAPduino Pro Microに書き込まれているFirmwareのVID/PIDを調べる
UIAPduinoをリセットボタンを押しながら接続し、以下のコマンドで認識されているUSBデバイスを調べます
ioreg -p IOUSB -n "V-USB" -l | grep -E "idVendor|idProduct"
筆者の環境でのUIAPduinoが返しているIDは以下の通りです。
| "idProduct" = 47107
| "idVendor" = 4617
Vendor ID: 4617(16進数で 0x1209)
Product ID: 47107(16進数で 0xb803)
minichlink が標準で探しているPIDは 0xb003 ですが、UIAPduinoは 0xb803 になっています。
このために、ツールが見つけられずにエラーを出しています。
minichlikのソースコードを修正する
まず、現在のminichlikでUIAPduinoを認識できるか確認します。
sudo ./minichlink -c 0x1209b803 -a
確認結果
VID:0x1209, PID:0xb803
Halting Boot Countdown
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 8f-a8-ab-cd-f7-7d-bc-08
Read protection: disabled
Interface Setup
VID/PIDを指定したら認識できる事が確認できましたので、ソースコードのPIDを 0xb803 に修正します。
55行目
// original
else if( strcmp( specpgm, "b003boot" ) == 0 )
dev = TryInit_B003Fun(SimpleReadNumberInt(init_hints->serial_port, 0x1209b003));
// modified for UIAPduino Pro Micro CH32V003 V1.4 with CH-Link PID 0xb803
else if( strcmp( specpgm, "b003boot" ) == 0 )
dev = TryInit_B003Fun(SimpleReadNumberInt(init_hints->serial_port, 0x1209b803));
74行目
// original
else if ((dev = TryInit_B003Fun(SimpleReadNumberInt(init_hints->serial_port, 0x1209b003))))
{
fprintf( stderr, "Found B003Fun Bootloader\n" );
}
// modified for UIAPduino Pro Micro CH32V003 V1.4 with CH-Link PID 0xb803
else if ((dev = TryInit_B003Fun(SimpleReadNumberInt(init_hints->serial_port, 0x1209b803))))
{
fprintf( stderr, "Found B003Fun Bootloader\n" );
}
修正後にminichlinkのフォルダに移動してmakeします。
cd ch32fun/minichlink
make
生成されたminichlikをArduinoIDEのツールチェーンにコピーします。
cp minichlink ~/Library/Arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/
ArduinoIDEでの実行結果
"/Arduino/Arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/minichlink" -w "/Users/xxxxx/Library/Caches/arduino/sketches/10B0F6453A1BA759C5184DF91929EA1E/Blink.ino.bin" flash
VID:0x1209, PID:0xb803
Found B003Fun Bootloader
Detected CH32V003
Flash Storage: 16 kB
Part UUID: 8f-a8-ab-cd-f7-7d-bc-08
Read protection: disabled
..........................Halting Boot Countdown
Interface Setup
Writing imageImage written.
.
無事書き込みができました。
修正版のソースコードとminichlinkのバイナリーファイル
修正版は以下のリポジトリにおいてあります。
追記
UIAPduinoのカスタムブートローダーを修正する方法
UIAPduino自体のPIDはカスタムブートローダーの42行目で0xb803に設定されているので、こちらを修正するという方法でも可能です。ただし、ブートローダーの書き換えは少し面倒な作業となりますので、minichlinkを修正する方が安全です。
UIAPduinoのボード設定を修正する方法
ArduinoIDEの platform.txt の minichlink への引数を追加してVID/PIDを指定するという方法もあります。
## /Arduino15/packages/UIAP/hardware/ch32v/1.0.42/platform.txt
## 修正前
tools.minichlink.upload.pattern="{path}{cmd}" -w "{build.path}/{build.project_name}.bin" flash
## 修正後
tools.minichlink.upload.pattern="{path}{cmd}" -c 0x1209b803 -w "{build.path}/{build.project_name}.bin" flash
まとめ
これで無事にM1 MacのAuruinoIDEから UIAPduino Pro Micro が使えるようになりました。