CH32V003に書き込みができる安価なライターを製作

tl;dr

  • CH32シリーズの書き込みには、DAPLinkは使えず、WCH-LinkEを使う必要があるよ
  • 激安マイコンCH32V003には、bitbangでUSBプロトコルを実装したrv003usbがあるよ
  • ch32fun中のプログラマソフトウェアminichlink向けの、rv003usbで実装したプログラマファームウェアRVSWDIO Programmerが公開されているよ
  • RVSWDIO Programmerを使うための基板を起こしたところ、ちゃんと動いたよ。超安価なプログラマができたよ
  • ただ、日本だとWCH-LinkEが気軽に秋月で買えるので、そちらを使った方が確実だよ

CH32シリーズを書き込むには

CH32シリーズは、WCHが提供する安価な32bit RISC-V MCUです。 筆者はCH32V003を様々な電子工作に組み込んできました。

CH32シリーズのファームウェアの書き込みには、WCH-LinkEという専用のプログラマが必要です。 ただし、USBデバイス機能がついたCH32V203の場合にはUSB経由で書き込めます。 USB機能のないCH32V003の場合にはやはり必要です。

ARMのSWDとは異なっているようで、DAPLink等のARM用のプログラマは利用できません。

USBデバイスのないCH32V003にUSBデバイスの実装がある

CH32V003はCH32Vシリーズで最も安価なMCUです。 USBデバイスペリフェラルはありませんが、rv003usbというbitbangでUSBプロトコルを実装したOSSがあります。 これを使うと、CH32V003でUSBデバイスとして機能させられます。

これは、UIAPduinoのブートローダにも使われており、UIAPduinoはUSB経由でファームウェアが書き込めるようになっています。

rv003usbでCH32シリーズのプログラマを実装したRVSWDIO Programmer

rv003usbのリポジトリ中に含まれているコードにRVSWDIO Programmer(正確にはREADME.mdには、ch32v003 programmer for WCH V- and X- chipsと書かれていますが、このプロジェクトディレクトリ名にあたるRVSWDIO Programmerを以下で記載します)があります。 これは、CH32シリーズのプログラマソフトウェアであるminichlinkでCH32シリーズに書き込めるようにするファームウェアです。

github.com

これを使えば、安価にCH32シリーズのプログラマを作れます。

RVSWDIO Programmerを使う基板を製作

RVSWDIO Programmerを使う基板を製作しました。 KiCadデータは以下で公開しています。

github.com

ch32funのプロジェクトをビルドして書き込んでみたところ、問題なく動作しました。

元のプログラマのWCH-LinkEには接続先MCUの電源のスイッチ機能があります。 RVSWDIO Programmerにもこの制御機能が含まれています。 接続先MCUの電源のスイッチにCH217を入れて、RVSWDIO ProgrammerからCH217のENピンを制御することで機能させることができました。

最初、RVSWDIO ProgrammerはUSBが接続された初期状態では、この制御ピンがフローティング状態になっており、接続しただけではMCUに電源が供給されませんでした。実際に書き込みコマンドを実行したり minichlink -3を実行すると電源ONになりました。

また、CH217のENピンはActive Lowなのですが、RVSWDIO Programmerの初期状態ではActive Highで制御するようになっており、RVSWDIO Programmer中の定義を逆に設定しました。

#define POWER_ON 0
#define POWER_OFF 1

使い方

次にこれの使い方です。

接続は、CH32V003とRVSWDIO ProgrammerのSWDIOとGNDを繋ぐだけです。

PC上で、書き込み時に、minichlinkを使うように設定する必要があります。

ch32funであればminichlinkを使うようになっているため、そのまま使えます。 WCH-LinkEの利用が前提になっているMounRiverStudio(公式SDK)やArduinoIDE(Arduino Core CH32)では、このRVSWDIO Programmerを使うことはできません。 PlatformIOであれば、アップロードコマンド(upload_protocol)を変更できるため、以下のように変更しておきます。

[env]
platform = https://github.com/Community-PIO-CH32V/platform-ch32v.git
framework = ch32v003fun
# minichlinkを指定する
upload_protocol = minichlink
monitor_speed = 115200
board_build.core = ch32v003

[env:genericCH32V003F4P6]
board = genericCH32V003F4P6

PlatformIOであれば、利用するフレームワークArduino/公式SDK/ch32funから選べるので、幅広く使えるでしょう。

ただし、PlatformIOのシリアルモニタは利用できないため、ターミナル上で以下のコマンドを実行する必要があります。

minichlink -T

なお、筆者の場合は、開発フレームワークとしてch32funをメインに使っていて、ch32funのMakefileが利用できるので、PlatformIOは利用していません。

とはいえWCH-LinkEを使った方が良い

RVSWDIO Programmerを使い、安価なCH32Vシリーズのプログラマを作れました。 しかし、公式プログラマWCH-LinkE自体は秋月電子通商で千円程度で安価に販売されていたり、WCH公式のショップがAliexpressにあって安価に購入できるため、WCH-LinkEを利用する方がツールの幅も広く、問題が起きることも少なく便利ではあるでしょう。

新刊『CH32V003開発ガイドブック』を技術書典18で頒布します

ebook.png

2025/06/02 追記

Boothでの販売ページを追加しました

74th.booth.pm

tl;dr

  • CH32V003は、安価だけど機能が豊富なマイコンで、筆者は電子工作にめっちゃ使っているよ
  • CH32V003の知らない機能を使い尽くしたくて、書籍の執筆を始めたよ
  • 書籍には、Arduino/公式SDK/ch32fun/レジスタ操作での実装方法をそれぞれ載せていて、初心者はArduinoから、上級者はレジスタ操作を理解して進める構成にしているよ
  • 各Peripheralの使い方は、Arduino/公式SDK/レジスタ操作で、GPIO/Timer/DMA/ADC/PWM/UART/I2C/SPI/WDT/省エネルギーモードなどをそれぞれ解説しているよ
  • おまけとして本書の知識をLLMに与えられるMCP Serverを作成したよ
  • 書籍は、5/31からオンライン開催、6/1にオフライン開催がある技術書典18で頒布するよ

紹介するCH32V003とは

CH32V003は安価ながら多機能なWCH社が販売する32bit RISC-Vマイコンです。 秋月電子通商でも40円で扱われ、公式ショップでも単価25円ほどで購入できます。

WatchdogTimerや、省エネルギーモードなど、使い方を知りませんでしたが、この書籍で試すことで使えるようになり、実際にプロダクトにも組み込みました。

筆者のCH32V003との関わりと執筆動機

筆者はCH32V003を、電子工作の製作に頻繁に組み込むようになりました。

以下の制作物にも簡単な制御にCH32V003を使っています。

安価であるため単純な機能を使うだけでも十分効果的なのですが、 さらにマイコンの様々な機能を使い尽くしたいと思い、この書籍を執筆しました。

本書の内容

この書籍では、CH32V003の開発に必要な知識をまとめています。 基礎知識として、購入方法から最小限の回路などを解説します。 ファームウェアの開発に必要な機材や、開発環境の使い方を説明します。 MCUは多くの機能を持っており、MCUの機能としての解説と、Arduino、公式SDK、ch32fun、レジスタ操作での実装方法も解説します。

これ一冊でCH32V003に必要な開発を網羅的に得られる内容になっています。

目次

目次は以下となっています。

  • まえがき
  • 1.CH32V003の魅力と基礎知識
    • 1.1.CH32V003とは
    • 1.2.CH32V003のMCU単体の入手方法
    • 1.3.最小限の回路
    • 1.4.ファームウェア開発の方法
    • 1.5.ひとまず動く開発ボードが欲しい
    • 1.6.CH32V003開発で知っておくと良いこと
    • 1.7.後継、類似モデル
  • 2.Arduinoでの開発
  • 3.WCH SDKでの開発
    • 3.1.MounRiver Studio 2を使った環境セットアップ
    • 3.2.ソースコードの構成
    • 3.3.MounRiver Studioでのビルドと書き込み
    • 3.4.MounRiver Studioでのダウンロード設定
    • 3.5.SDI-Printによるログ出力
    • 3.6.PlatformIOを使った環境セットアップ
    • 3.7.PlatformIOでのビルドと書き込み
    • 3.8.PlatformIOでのSDI-Printの有効化
  • 4.ch32funでの開発とレジスタ操作
    • 4.1.ch32funとは
    • 4.2.開発環境の構築
    • 4.3.プロジェクトのセットアップ
    • 4.4.ビルド、書き込み、デバッグプリント
    • 4.5.ch32funの最低限のコード
    • 4.6.extralibsを使う
    • 4.7.VS Codeで補完を効かせるには
    • 4.8.PlatformIOを使う
    • 4.9.レジスタ操作の基礎
    • 4.10.rv003usbとは
  • 5.GPIO
  • 6.TimerとDMA
    • 6.1.TimerとDMAとは
    • 6.2.WCH SDKでTimerを使う
    • 6.3.レジスタ操作でTimerを使う
    • 6.4.DMAを使った7セグLEDのダイナミック点灯とは
    • 6.5.WCH SDKでDMAを使う
    • 6.6.レジスタ操作でDMAを使う
  • 7.PWM
  • 8.ADC
    • 8.1.CH32V003のADC
    • 8.2.サンプルコードの回路
    • 8.3.Arduino
    • 8.4.ch32fun
    • 8.5.WCH SDKで1回ADCを変換する
    • 8.6.DMAを用いた連続ADC変換
    • 8.7.レジスタ直接操作による単発ADC変換
    • 8.8.レジスタ直接操作によるDMAを用いた連続ADC変換
  • 9.UART
  • 10.I2Cマスター
  • 11.I2C スレーブ
    • 11.1.I2C通信のメッセージボックス実装
    • 11.2.Arduino
    • 11.3.ch32fun
    • 11.4.WCH SDK
    • 11.5.レジスタ操作
    • 11.6.筆者の実例
  • 12.SPI
  • 13.Watchdog Timer
    • 13.1.CH32V003のWDT
    • 13.2.WCH SDK
    • 13.3.レジスタ操作
    • 13.4.筆者の組み込みの実例
  • 14.省エネルギーモード
    • 14.1.CH32V003の省エネルギーモード
    • 14.2.スリープモード WCH SDK
    • 14.3.スリープモード レジスタ操作
    • 14.4.スタンバイモード WCH SDK
    • 14.5.スタンバイモード レジスタ操作
    • 14.6.スリープモード、スタンバイモードのLチカの消費電力
  • 15.NeoPixelとOLED SSD1306の制御
    • 15.1.NeoPixel
    • 15.2.OLED SSD1306
  • 16.その他の機能
    • NRST、SWIOピンを使用する
    • ユーザ情報を格納するOption Byte
    • Rustでの開発環境の構築
  • 17.筆者の製作
  • 18.本書のMCP Serverを使おう
  • おわりに
    • 著者

技術書典18に出典

5/31からオンライン開催、6/1にオフライン開催がある技術書典18に出展します。 オフライン会場のブースは「え01」です。

オフライン会場では、CH32V003の開発ボードも販売したり、実際に作ったものを展示したりします。

ぜひお立ち寄りください。

Boothでも継続的に販売中

技術書典イベント終了後も Booth にて販売しております。 在庫がある限り、物理書籍もこちらで購入できるようにしております。

74th.booth.pm

おまけ MCP Server を作った

本書で作ったサンプルコード、解説書をLLMに読ませれば実装ができるようになるのではないかと思い、本書の内容をレスポンスとして返すMCP Serverを作成しました。 フリーソフトで公開しています。 今後ブログでも紹介します。

https://github.com/74th/ch32v003-guidebook-mcpserver

天下一キーボードわいわい会 vol.8 に参加したよ

自作キーボードわいわい会とは

自作キーボードの作品を、見たり見せたりするイベントです。 見るだけでも良く、参加の敷居が低いイベントです。 数多くの自慢の作品が並べられ、自作キーボード製作の熱が感じられる面白いイベントとなっています。

まだまだ新しいトライをされたキーボードが展示されており、デザインと機能が上手く統合されていて、このようなアイディアもあったのかと興味を引かれるものが多いです。

私自身、Vol.4から参加しており、5回目の参加となりました。

パネルディスカッションイベント「それはそう」に登壇

イベント中のパネルディスカッションイベント「それはそう」に、ごはんださん、KaKKさんとともに、パネラーとして参加しました。 ポインターバイスと統合された未来のキーボードについてや、AIとの迎合でどうキーボードは変わるのかをお話しさせていただきました。

YouTube上に動画が残っております。

www.youtube.com

私の話した部分をかいつまむと以下のような内容です。

  • ポインターバイスをキーボードに統合するか、キーボードの外に置くか
    • 物理操作の安定性から、統合しないと難しい話をさせていただきました。他のパネラーの方も挟んだりいろいろ考えられていました。
  • これからのキーボードにソフトウェア、ハードウェアで求められることは何か
    • ポインターバイスがマウスに縛られていて、ホイール操作などで不満があることをお話ししました。
    • BLE化で電源の構築が難しい話に、M5Stackなどのモジュールをくみあわせる道もあるのではとお話ししました。
  • AIとの迎合でどうキーボードは変わるのか
    • AIへの指示は、音声よりは、キーボードの方がBSができることでキーボードの方が早く入力できそう。
    • AIはタイポなども鑑みてくれるので、ひらがなだけでも伝わるため、漢字変換せずにひらすら入力する世界にもなってくるのではないか。
    • AIをキーボードに搭載する形では、AIスタックチャンをキーボードに棲まわせたらいいな。
  • 次の天キーまでに起こるキーボードの世界の変化の予想
    • 機能の観点でモジュールとして組み込む世界がもっと進むのではないか。

展示したキーボード

SparrowDialとSparrowS v3を、触れる形で展示しました。

my.jpg

キータイプから、人差し指をさっと動かすことでポインターバイスが利用できるのを体験してもらうことができました。

今回展示したキーボードは例によって私のBoothショップでも販売しています。

過去にブログ記事でコンセプトや、製作過程をまとめた記事を作っています。

気になったキーボード

ここからは、私が気になったキーボードを紹介します。 紹介した以外にも様々な素敵なキーボードがありました。 あくまで私の観点で惹かれたものを紹介します。

GqE8xZabQAAV7k2.jpeg

よっぴさんのAZPOCKETを触らせてもらいました。 本当に薄い、というかペラいです。 それでいて、打鍵感も悪くなく、素敵に思いました。

sekigaisen.jpeg

赤外線で通信するキーボードと、赤外線を受け取るセンサーバー。 実用レベルで動作して、流石だと思いました。

oyayubi-stick.jpeg

KaKK(ゴリラボ)さんのTrackey。 触って見ると丁度親指に収まる感じでした。

minimal.jpeg

金属筐体、シンプルに美しく思いました。 レイヤーマップの説明も、使うのが想像できてありがたかったです。

center-trackball.jpeg

中央に大きなトラックボールを備えたキーボード。 自分の右手人差し指でさっと触るコンセプトに近く、この位置良いなと思いました。

shikakui.jpeg

異様な存在感を放つ、全てが四角いキーボード。 キーボードという概念をSFの世界に置いたような、強烈な印象を受けました。

migite-elgo.jpeg

右手側だけをAlice配列敵に曲げた、エルゴノミクスを意識されたキーボード。 このちょっとした曲がりで、効果あるとされたのが、良いアイディアだと思いました。

joystick-adjast.jpeg

左手のジョイスティックに、トラックボールの加速、減速を割り当てているのが面白いと思いました。 こういう操作性を工夫する試みは、体験してみたくなります。

choc-setsudan.jpeg

縦の幅を狭めたキーボード。 私自身も、もっとスイッチの縦幅は小さくて良いと思ったことがあり、目を引きました。 独自にスイッチを作らねばならないと思っていたのですが、ChocV1スイッチを切断して利用するという発想が打鍵感を損なわず、非常に良いアイディアだと思いました。

usui-minimal.jpeg

薄いスイッチを使ったミニマルかつ一体感のある感じで素敵に思いました。 ちょっと見えている小型トラックボードにも実用性を感じます。

red.jpeg

赤色で統一されて、ケースの塗装も一つの世界観があって素敵でした。

omuken.jpeg

ミニマルで、金属筐体と妥協ない作りで素敵でした。 ケーブルもない、無線で左右分割の世界を極めた感じがありました。

toumei.jpeg

既製品だと思いますが、透明なキーボード。 見たことがないもので、透明なのに異様な存在感を放っていました。

pentate.jpeg

エンティングをペン立てとして空間を利用するキーボード。 部屋にあったら当然のように便利ひ存在してそうで、素敵でした。

akekon.jpeg

全てをサイレントにしたアケコン。 レバーを触って見ましたが、ガチャガチャではなく、コツコツとした音がして、良いなとなりました。

apple-pencil.jpeg

ApplePencilを立てられるキーボード。 卓上文具と一体化している感じが素敵でした。

他のこと

switch-senkyo.jpeg

キースイッチ総選挙という、スイッチの推薦投票イベントが行われていました。

switch-senkyo2.jpeg

こちらの Sillyworks x Gateron Type R Tactile Switch が、とてもトラベルがスムーズかつ、滑らかな山のタクタイルスイッチで、驚きました。

名札をデコれるシールが配布されていました。 「タクタイル」「リニア」のどちらが好きかを主張できるシールの他に、任意のことが書けるシールもありました。 私は「Durockスイッチ推し」と思わず書いてしまいました。

恒例の抽選会では、ありがたいことに「Chosfox ランダムキースイッチ」が当たりました。

Chosfoxのお店は度々利用させていただいています。 この日もChosfoxキーボードケースに入れてキーボードを持ってきていました。

中身はWHITE FOX ASISと思われます。 HiFiサウンドとあるとおり、ボトムまで推したときにカカッと小気味よい音が鳴るスイッチで、早速キーボードに組み込んで楽しんでいます。

なお、5回のイベント参加で3回も当選しているのですが、毎回スイッチが当たっていますw

  • HHKB静電容量スイッチキーホルダ
  • Glouriousスイッチサンプル(中身はGateron)
  • Chosfox WHITE FOX ASIS

まとめ

冒頭の通り、実用性とデザインを兼ね備えたキーボードに、様々なアイディアが詰まっていて、それを一気に体験することができる非常に楽しいイベントでした! 開催ありがとうございました! また、次回の開催も楽しみにしています。