180【UIAPduino】printf を実装するにょ【290円マイコン基板】
UIAPduino(CH32V003)をUSBだけでPythonから出力を見る方法
USBケーブル1本だけで、追加のハードウェアなしにPythonからUIAPduinoの出力を確認する方法です。
背景
UIAPduino(CH32V003)はUSB HIDデバイスとして動作するため、通常のSerial.print()によるUSBシリアル通信(CDC)が使えません。また、Arduino IDEのシリアルモニタも使えません。
そこで、rv003usbライブラリのdemo_terminalを使い、USB HID経由でPythonから出力を受け取る方法を紹介します。
必要なもの
- UIAPduino Pro Micro CH32V003
- USBケーブルのみ(追加ハード不要)
- Windows + WSL2(Ubuntu 22.04)
手順
1. WSL側の準備
sudo apt update
sudo apt install -y gcc-riscv64-unknown-elf libnewlib-dev libudev-dev libusb-1.0-0-dev
pip install hidapi
2. rv003usbをクローン・ビルド
cd ~
git clone --recurse-submodules https://github.com/YuukiUmeta-UIAP/rv003usb.git
cd rv003usb/demo_terminal
demo_terminal.c の以下の行をコメントアウトします。この行があるとデバッガ接続待ちで止まってしまいます。
sed -i 's/while (!DidDebuggerAttach());/\/\/while (!DidDebuggerAttach());/' demo_terminal.c
ビルドしてWindowsにコピーします。
make
cp demo_terminal.bin /mnt/c/Users/ユーザー名/demo_terminal.bin
3. UIAPduinoに書き込み
ボタンを押しながらUSBを挿し、すぐにPowerShellで実行します。
& "C:\Users\ユーザー名\AppData\Local\Arduino15\packages\UIAP\tools\minichlink-2982dfd\1.0.0\minichlink.exe" -w "C:\Users\ユーザー名\demo_terminal.bin" flash -b
成功すると以下のように表示されます。
Found UIAPduino Pro Micro CH32V003 V1.4 Bootloader
Halting Boot Countdown
Interface Setup
Image written.
Booting
4. USBをWSLにアタッチ
書き込み後、UIAPduinoを一度抜いて普通に挿し直します(ボタンなし)。
管理者PowerShellで確認します。
usbipd list
1209:d003 のBUSIDを確認して:
usbipd bind --busid X-X
usbipd attach --wsl --busid X-X
WSL側で認識されているか確認します。
lsusb | grep 1209
# Bus 001 Device 005: ID 1209:d003 Generic RV003 Custom Device
5. Pythonで読む
import subprocess
proc = subprocess.Popen(
['../ch32v003fun/minichlink/minichlink', '-kT', '-c', '0x1209d003'],
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
text=True
)
for line in proc.stdout:
print(line, end='', flush=True)
実行すると以下のようにカウントアップが表示されます。
-1133[]
+1134
-1135[]
+1136
...
6. 自分のコードでprintfを使う
demo_terminal.c の while(1) の中を書き換えるだけです。
while(1) {
printf("count: %lu\n", count++);
Delay_Ms(1000);
}
変更したら以下の手順を繰り返します。
makeでビルドcp demo_terminal.bin /mnt/c/Users/ユーザー名/demo_terminal.binでコピー- PowerShellでボタン押しながら書き込み
- 普通に挿し直してWSLにアタッチ
- Pythonで受信
仕組み
rv003usbのdemo_terminalはCH32V003内蔵のDebug Module(DM)のDMDATA0/1レジスタを経由してprintfの出力をUSB HIDパケットとして送信します。minichlink -kTコマンドがそのHIDパケットを受け取ってターミナルに表示します。PythonはそのminichiinkをサブプロセスとしてSTDOUTを読み取ります。
注意点
- UIAPduinoをWSLにアタッチするには
usbipdが必要です(管理者権限が必要) - 書き込みのたびに「ボタン押しながら挿す→Windowsで書き込み→普通に挿し直す→WSLにアタッチ」の手順が必要です
demo_terminalはFlash 26.93%、RAM 4.88%と軽量です
参考
投稿者の人気記事





-
chrmlinux03
さんが
前の水曜日の13:17
に
編集
をしました。
(メッセージ: 初版)
-
chrmlinux03
さんが
前の水曜日の13:18
に
編集
をしました。
ログインしてコメントを投稿する