UARTで書き込みできるCH32V003開発ボードを作った

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。

この記事の作例もJLCPCBに基板を発注して実現しました。

これは何?

以前CH32V003を使った基板を作って遊びました。今回はその時の知見を活かして、UARTで書き込みできるCH32V003開発ボードを作成してみました。

inajob.hatenablog.jp inajob.hatenablog.jp

仕様

この基板は何か専用の機能を持つものではなく、汎用的な開発基板です。

  • CH32V003F4P6
  • USBコネクタ(フットプリントのテストのため3種)
  • USBシリアル変換IC CH340G
  • RSTスイッチ、BOOTスイッチ
  • 自動リセット回路(ESP32などの回路をまねたもの)
  • WCH-LinkE接続用端子

基板の設計

今回の基板は以前作ったCH32V003の基板とよく似たものですが、USBシリアル変換ICとRSTスイッチ、BOOTスイッチが搭載されているのが特徴です。 また、Arduinoではおなじみの自動リセットの仕組みを実現するための回路も搭載しています。

今回利用するファームウェアは、起動時にPC0の状態を読み取り、LOWであれば書き込みモードに入るという動作をするものです。 これを実現するためにBOOTスイッチを搭載しています。つまり、BOOTスイッチを押しながらRSTスイッチを押すことで書き込みモードに入るということです。

CH32V003のUART書き込みのサンプルは、PC0がHIGHであれば書き込みモードに入るような作りになっていますが、ここではESP32などで良く用いられる自動リセット回路をまねて作る関係でこの動作を変更してLOWであれば書き込みモードに入るという作りに変更しました。

さらにこの基板で特徴的なのは3つのUSBポートです。 これは何か3つに特別な機能がある、というわけではなく、手元にある3種類のUSBソケットの実装練習のためのものです。

3つのうち2つがUSB Type-Cのソケットなので、CC1、CC2ピンのための抵抗も配置します。(この抵抗が無いとType-C -> Type-Cケーブルを使った時に給電されないことが起きるようです)

JLCPCBに発注

今回も発注はJLCPCBです。基板は赤色にしました。また基板の厚さを1mmにしています。

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

動作確認のための実装

CH340GはArduino Nanoのクローンなどでよく利用されているICで、自分もそのような基板を自作したことがあるので、難なく実装できました。 CH32V003F4P6も前回の挑戦ではんだ付けしたことがあったので、こちらも簡単。

MicroUSBコネクタはよく使うのですが、なかなか実装のコツがつかめず、よく接続不良を起こしてしてしまいます。ホットエアーガンを使い今回は(たまたま)一発で動作しました。

ということで、あっという間に実装できました。

自動書き込み回路や、あと2つのUSBコネクタの実装は後回しです。

ブートローダーの準備と、書き込みテスト

CH32V003でさらに遊んでみた - inajob's blogで紹介した74thさんのファームウェアを少し改造して利用しました。 74thさんのものは書き込みモードに入る際にPC0をHIGHにする必要がありましたが、今回はPC0がLOWのときに書き込みモードに変更したものを用意しました。

このファームウェアをWCH-LinkEを使いブートローダー領域に書き込めば準備は完了です。

基板上のMicro USB端子をパソコンとつなげ、BOOTスイッチを押しながら、RSTスイッチを押して書き込みモードにしたのちに、74thさん作のCLIツールを使い適当なプログラムを書き込み、最後にRSTスイッチを押して、実行モードにすれば、書き込んだプログラムが動き始めます。

USBソケットの実験

前述したようにこの基板には3つのUSBソケットのフットプリントがあります。

Micro USB

いつものソケットです。ここまでの実験ではこのソケットを使い接続しています。 このソケット、実装の難易度はそこそこ高く、個人的にははんだごてではうまく実装できず、ホットエアーで実装しています。

いつも使っているのですが、Micro USBということで、稀にコネクタが「もげ」るという事故が起きます。 ということで、そろそろ自分もUSB Type-Cのコネクタを試してみたいなと考えていました。

そこで出てきたのが次の2つのUSB Type-Cソケットです

USB Type-C(スルーホール)

スルーホール型のソケットです。後述の表面実装のものと比べると価格が高いのですが、実装しやすそうだなと思い、今回試してみることにしました。

スルーホール型ではあるのですが、足がそこまで長くないため、一般的な厚さ1.6mmの基板では足が下まで届かないので、はんだ付けが難しいようで、今回は厚さ1mmの基板としました。

スルーホールとはいえ、かなりピンが近くにあるので、はんだ付けは気を遣いましたが、何とかはんだごてで実装し、動作することを確認しました。

USB Type-C(表面実装)

よく見かけるソケットです。ピンの幅が狭く、実装の難易度が高そうに見えます。 はんだごてで実装するとすぐにブリッジ思想だったので、ホットエアーを使って実装しました。

フットプリントは以下の記事を参考にして、いくつかのパッドを長くすることで、はんだ付けしやすいようにしました。

inajob.github.io

心配しましたが、こちらも動作することを確認しました。

自動書き込み回路の動作確認

最後に、ESP32などの開発ボードでよくみられる、トランジスタを2つ使った、自動書き込み回路の動作を確認しました。 この回路は抵抗付きのトランジスタが2つ内蔵されたUMH3Nという部品により実現されます。(この部品は以前ESPboyというオープンソースの携帯ゲーム機を日本用に再設計してみた - inajob's blogで利用したことがありました)

ちょっと小さな部品ですが、これを実装します。

このトランジスタ2つをうまく組み合わせて、USBシリアル変換ICの~DTR, ~RTS信号を、CH32V003のリセット信号と、書き換えモード切替信号(PC0)への入力に変換します。

ESP32などでは書き込みツールがDTR、RTS信号をうまい具合に制御してくれるのですが、今回はそういうツールが無いので、Pythonスクリプトを用意して、書き込みモードへの切り替えの動作を実現しました。

具体的には以下のようなコードで書き込みモードに入ります

import serial
ser = serial.Serial()
ser.port = "COM14" # 利用するポートの番号
ser.baudrate = 115200

# Write mode
ser.setDTR(True)
ser.setRTS(False)
ser.open()
ser.close()

そして以下のようなコードで実行モードに入ります

import serial
ser = serial.Serial()
ser.port = "COM14" # 利用するポートの番号
ser.baudrate = 115200

# Run mode
ser.setDTR(False)
ser.setRTS(True)
ser.open()
ser.close()

これと74thさん作のCLIツールを組み合わせると、Arduino風の書き込み環境となります。

まとめ

ということで、一度ブートローダーを用意してしまえば、後は開発基板のみで書き換えができる基板が完成しました。

まぁ、CH32V003でやるならこの方法ですが、もう一つ上のスペックのCH32V203などではIC単体でUSB書き込み機能を備えているので、あえてCH32V003でここまでする意味はないかもしれませんが、構成例の一つとして、誰かの役に立てば幸いです。

また、自動リセット回路について、CH32V003でも期待通り動くことが確認できました。

おまけとして、3種類のUSBソケットの実装実験が出来ました。ホットエアーガンがあればどのソケットもそこまで難しくなく実装できることが確認できました。

参考

自動リセット回路の動作原理について詳しく説明されています days-of-programming.blogspot.com

前回記事に続き 74th.hateblo.jp