Contents
先日見物に行ったNT東京2025でUIAPduino Pro Micro CH32V003というマイコンボードを拝見して、とても気配りが効いたボードなのに感銘を受けました。いただいたボードを使ってみたところ、若干のはまりどころがあったので、これはレポート記事を書かねばという使命感に駆られ、ここにエントリをしたためることにしました。
UIAPduino Pro Micro CH32V003とは
UIAPduino Pro Micro CH32V003は何かということは、NT東京2025の出展者紹介に簡潔明瞭に書かれています。
USB接続のオープンソースCH32V003開発ボードです。Arduino IDEやch32funに対応します。USBホスト保護ヒューズを備えており、CH32V003のHIDデバイスを実証できます。
以下、私にとって興味があるポイントを上げます。
- 安価なマイコンとして有名なCH32V003が手軽に使える。
- 入手した状態でArduinoとして使えるブートローダーが書かれている。
- 5V・3.3Vどちらにも対応できる。(基板上のジャンパカットで変更)
- 安い (スイッチサイエンス価格で290円/1枚(税込み)
- 開発が日本の方。日本語で相談できるコミュニティもある。
CH32V003は安くていいと聞いていたのですが、文献を読むとArduinoとして使おうとすると少々手間がかかりそうです。そこにこれだけ安価に、すぐに使えるボードが出回ってくれるのは大変ありがたいわけです。
ESP32のように通信機能はありませんが、通信を伴わないちょっとした用途に使うのに良さそうです。非常に安価なので、これだったら大量に入手してプロジェクトごとに埋め殺しにしてしまっても惜しくないと思います。
UIAPduino Pro Micro CH32V003の情報・入手方法

公式サイト(日本語)に一通りのドキュメント、入手先が載っているのでそちらを見るのがいいでしょう。購入はスイッチサイエンスの通販が手軽です。また、開発者のUIAPさんが精力的に国内各地のイベントを回られているので、そちらで譲っていただくのもいいと思います。
- UIAPduino Pro Micro CH32V003 V1.4 (公式サイト)
- X(Twitter) @UIAP_akari (イベント参加情報など)
- UIAPduino Pro Micro CH32V003 V1.4 (スイッチサイエンスでの委託販売)
UIAPduino Pro Micro CH32V003の注意点
以下は、UIAPduino Pro Micro CH32V003 v1.4 (v1.41)をArduino環境で利用する前提で書いています。バージョンアップなどによって改善される可能性があります。
また、UIAPduino(ボード)由来の制限、CH32V003(チップ)由来の制限を区別せずに書いています。
USBにシリアルモニタが出ていない
Arduinoというとシリアルモニタがあるのが当たり前のような気がしますが、UIAPduino Pro Micro CH32V003にはありません。つまり、Arduino IDEとSerial.print(“…”)による動作確認やデバッグが行えないということです。
シリアルポート(UART)自体はPin1, Pin2に出ているので、適当なUSB-Serialを接続すればSerial.print(“…”)などでアクセスできます。
Windowsでのデバイスマネージャで見つけにくい
オリジナルのArduinoはUSBで接続するとWindowsからシリアルポートで見えますが、UIAPduino Pro Micro CH32V003はHIDデバイスとして認識されます。デバイスマネージャでは他のデバイスに紛れてしまい、見つけられません。(「接続順」に切り替えればなんとかわかりますが……)

Windows11の場合、デバイスマネージャではなく、「設定」→「Bluetoothとデバイス」→「デバイス」の「その他のデバイス」の中に、「32V003」と表示されるので、こちらを頼りに見る方がいいでしょう。

Windowsでデバイスの認識に失敗した場合
Windowsの悪癖ですが、USBポートにデバイスを接続した際に認識に失敗することがあります。この状態に陥ると、デバイスをポートから抜き差ししても再認識しなくなってしまいます。

この場合、「設定」→「Bluetoothとデバイス」→「デバイス」の「その他のデバイス」にある「不明なUSBデバイス (ポートのリセットの失敗)」や「不明なUSBデバイス (デバイス記述し要求の失敗)」を削除したあと、デバイスマネージャーで「ハードウェア変更のスキャン」を実行すると、再認識に成功するようです。


デバイスマネージャーで「不明なUSBデバイス」を「アンインストール」しても再認識できないようです。面倒ですが、2カ所で操作する必要があると思われます。
メモリが足りない
これはそもそもCH32V003の仕様ですが、最近のArduinoに使われるチップと比べると圧倒的にメモリが少ないです。
| Borad | Chip | Flash | SRAM |
|---|---|---|---|
| UIAPduino Pro Micro CH32V003 | CH32V003 | 16kB | 2kB |
| Arduino UNO R3 | ATmega328P | 32kB | 2kB |
| Raspberry Pi Pico | RP2040 | 2MB | 264kB |
| Seeed Studio XIAO ESP32C3 | ESP32-C3 | 4MB | 400kB |
とくにSRAM(実行時のメインメモリ)が2kBしかないのが厳しいです。Arduino的にはSRAMには変数の内容が配置され、大きめの配列を置くとSRAMが不足します。SRAMのサイズだけならArduino UNO R3 (ATmega328P)と同じですが、ATmega328PであればPROGMEMを使うことでデータをFlash側に配置できます。CH32V003ではそれができないので、よりメモリがシビアになります。
これが顕著に出るのが、OLEDのような表示デバイスを利用するときです。(次章)
UIAPduino Pro Micro CH32V003 で OLED SSD1306を使う
前述の通り、UIAPduino Pro Micro CH32V003ではシリアルモニタがUSBで使えないこともあり、何らかの表示デバイスが欲しくなります。手軽に使える表示デバイスとして、キャラクタ表示の液晶や、小型のOLEDがよく使われます。特に最近は入手性の良さもあってSSD1306ベースのOLEDがよく使われます。
ArduinoにもSSD1306を駆動するためのライブラリがいくつもありますが、CH32V003で使おうとすると、メモリ不足で利用できないものがほとんどです。そもそもSSD1306は128×64のモノクロ表示ですが、画面いっぱいに表示するバッファを取るだけで128*64/8=1024=1kB、つまりSRAMの半分を消費してしまいます。実際、UIAPduino Pro Micro CH32V003の公式サイトで紹介されているCH32V003開発ガイドブック-Arduino抜粋版でも、128×64の半分(縦32dot)でないと動作しないと書かれています。
Arduinoではなく、ch32funという開発環境では1kBのバッファをとっても動作ができるようですが、慣れたArduinoで開発したい。ということで、バッファを取らずに直接SSD1306を操作するライブラリを探してみました。
SSD1306Ascii
省メモリのSSD1306ライブラリもいくつかありますが、特定のアーキテクチャに依存した実装をしているものが多く、そのままではCH32V003では動きませんでした。いくつか試したところ、SSD1306AsciiであればCH32V003でも修正なしに動かすことができました。
- SSD1306Ascii (Arduino docs)
- greiman / SSD1306Ascii (github)
SSD1306Asciiは、バッファを取らずに動作する代わりに、基本的にはテキスト表示しかできません。ただ、その他のバッファなし・テキスト表示のみのライブラリと比べると、フォントが充実しています。その他の特徴はこんな感じです。
- バッファ未使用・SRAM節約
- テキストのみ表示可能 (グラフィック不可)
- フォントが豊富 (46種類…一部は数字のみ)
- SSH1106(少し大きめのOLED)にも対応 ※動作未確認
- 移植性が高い (CPUアーキテクチャ非依存)
exampleに入っているHelloWorldWire.inoを、UIAPduino Pro Micro CH32V003向けにコンパイルしたところ、メモリ消費量はこんな感じでした。
最大16384バイトのフラッシュメモリのうち、スケッチが14268バイト(87%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が764バイト(37%)を使っていて、ローカル変数で1284バイト使うことができます。
かなりメモリ(SRAM)の消費が抑えられていることがわかります。一方、Flashの消費はそこそこです。HelloWorldWire.inoは5×7のフォントしか使っていませんが、使うフォントを増やすとFlashの消費が一気に増えるので注意が必要です。

このデモは5×7フォントとArial_bold_14フォントを使っています。exampleのFontSamplesWire.inoを修正してArial_bold_14だけを残しましたが、これでメモリ消費は次の通りでした。
最大16384バイトのフラッシュメモリのうち、スケッチが15892バイト(96%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が780バイト(38%)を使っていて、ローカル変数で1268バイト使うことができます。
そもそもCH32V003のFlashに収まらないフォントもあるので全部が使えるわけではありませんが。それでも5×7以外のフォントが使えるというのは格好をつけるのにはよいものです。活用してみたいと思います。



