CH32V203K8T6をbootloaderでarduinoから使う方法
ch55xduinoとch32のarduinoのGPIO
CH32V用のプログラムを,リファレンスマニュアルを見ながら書いていたら,同じ会社のCH55xとは,GPIOの仕様がかなり違うことに気がついた. 機能としてはCH32Vの方が多いが,使い勝手はCH55xの方が良い気がする.
arduinoにWCHサポートを入れてCH32Vのプログラムを書く場合には,pinModeとして INPUT,INPUT_PULLUP,INPUT_PULLDOWN,INPUT_ANALOG,OUTPUT,OUTPUT_OD,OUTPUT_AF_PP,OUTPUT_AF_ODが指定できる. マニュアルの等価回路を見ると,出力modeのときには入力は無効で,INPUTとINPUT_ANALOGのときには出力は無効のようである. INPUT_PULLUPとINPUT_PULLDOWNは出力の値によって区別されているので,そのどちらかにしてからdigitalWriteをすると,modeをこれらの間で変えることが出来ると予想される. その動作は確認していないが.
ch55xduinoでCH55xのプログラムを書く場合には, INPUT,INPUT_PULLUP,OUTPUT,OUTPUT_ODとpinModeで指定できるmodeの種類は少なくなっている. 出力modeのときでも,入力は有効であり,INPUT_PULLUP modeのときには,出力は有効である. INPUT以外にしておけば,GPIOを入出力の両方で使うことが出来るのである.
arduinoでプログラムをしていると,マイコンの種類をあまり意識しないで使うことができる場合も多いが,これらのマイコンのGPIOを使うときには,細かな違いを意識した方が良いだろう.
ch32funでCH32V003を使ってみた
pcbエディタのみでプリント基板の設計
プリント基板の設計にはkicadを使っているが,複雑な回路を作るのには便利なのだが,逆に簡単な回路用の基板を設計するが面倒であると感じていた. kicadでは,まず回路図を書いてから,netlistを作って,pcbの配置を決めるのだが,単純な回路の場合には,回路図を書かずにいきなりpcbを作った方が楽な場合がある. 他にも,マイコンを使うときには,ピンの入れ替えができるので,回路図の段階ではどのピンを使うかを決めずに,pcb上でピンを決めた方が良い場合もある. さらに,使うICが回路図エディタのライブラリに無い場合には,外部のライブラリを探すか自分で作らなければならないが,データシートを見ながらpcb上で配線をどう繋げば良いかを考えるのは難しくない.
これまでは仕方なく回路図を書いてからpcbの設計をしていたが,回路図を書かずにpcbエディタだけを使って基板の設計をする方法が分かったので,そのやり方を書いておく. ます,pcbエディタを起動する. 原点はplace - drill/place file originで決めて置くと良い. 基板の外形はEdge.Cutsのレイヤーを選んでdraw lineで描く. そして,必要な部品をplace - place footprintsで配置して,それらの端子を配線で結べば良い. 配線で結ぶときに,netlistが無いので繋げないこともあったが,その場合には配線の設定でAllow DRC violationsとすると,繋げるようになる. 実は,このやり方がpcbエディアの本来の使い方なのかも知れないが,kicadの使い方を調べると回路図から始めるやり方しか見つからなかったので,これまで知らなかった.
マイコンの配線をするときには,回路図を作って,pcbエディタで配置を決めて,配線の取り回しが悪い場合には,回路図に戻ってピンを入れ替えて,またpcbエディタに戻るということを繰り返さなければならなかったが,pcbエディタのみで出来れば,効率化される. ユニバーサル基板上に部品を載せて,データシートを見ながらハンダ付けをする感じで配線を考えられて,訂正も出来るので,良い感じである. この方法でいくつかの基板を設計してみたが,やり方に少し慣れてきた. でも,配線の誤りが無いかは目でしっかりとチェックしなければならない. pcbエディタで配線した情報から,逆にnetlistを作って,回路図にするとかが出来れば,間違いのチェックも出来て良いのでは無いかと考えてしまう.
WCH社のマイコンでUSBデバイス
WCH社のマイコンで単純なUSBデバイスを作るときに,どのICを使うと便利かを考えてみた. まず,WCH社の代表的なマイコンは,CH55xシリーズとCH32シリーズに大きく分けられる. これらはCPUのコアなどに違いがあるのだが,USBデバイスを作るハードという観点では,電源の違いが大きい. CH55xシリーズでは,コンデンサを付ければ3.3Vを作ってくれるので,ピンが一つ減ってしまうが,マイコン以外に余分な部品無しでUSBを扱える. 一方,CH32シリーズでは,USBの5Vから三端子レギュレータなどで3.3Vを作って,それをマイコンの電源として使わなければならない.
秋月で入手可能なWCH社の安価なICについて,USBを使う時の機能などについて比較して,表にまとめてみた. ピン数の少ないものは省いたが,似た型番のものとほぼ同じ性能と考えれば良い. データシートなどを見て,まとめたものなので,ミスなどはあるかもしれないが,ご容赦いただきたい. このpin数のところではUSBのデータ線の2本を引いてある. この表の中のデータ以外にも,細かい違いもあるので,私が理解している範囲で説明したい.
| IC | CH552T | CH559T | CH559L | CH32V203K8T6 | CH32V305FBP6 | CH32V003F4P6 |
| 価格(円) | 70 | 180 | 150 | 120 | 250 | 50 |
| pin数 | 20 | 20 | 48 | 32 | 20 | 20 |
| GPIO数 | 16-2 | 16-2 | 40 | 26-2 | 17-2 | 18-2 |
| flash | 16k | 64k | 64k | 64k | 128k | 16k |
| RAM | 256+1k | 256+6k | 256+6k | 20k | 32k | 2k |
| default clock | 6M | 12M | 12M | 8M | 8M | 24M |
| USB version | 2.0FS | 2.0FS | 2.0FS | 2.0FS | 2.0HS | 1.1LS |
| EP番号 | 0-4 | 0-4 | 0-4 | 0-15 | 0-15 | 0-2? |
| EP size | 64 | 64 | 64 | 合計512 | 1024 | 8? |
先日,CH552を使ってUSBデバイスを作ってみたが,ICとコンデンサ二つとUSBコネクタだけでUSB機器が作れて,クセはあるが有用なICだと感じた. 同じCH55xには,より高性能なCH559もあり,ほぼ同様の使い方ができるだろう. これらのマイコンは,MCS51と互換性のあるコアを使っており,フリーのコンパイラが限定されるために,C言語は使えるが,C++が使えない. Arduinoでは,ch55xduinoを組み込むことで使うことができる.
32bitマイコンであるCH32では,高性能なものはUSBを扱う機能が組み込まれている. 最も安価なCH32V003では,それ自体にはUSBを扱う機能は無いのだが,rv003usbを使うとLow SpeedでUSBを使えるようになる. CH32V003F4P6については,rv003usbを使う場合について表中に書いてあるが,まだ理解できていない部分も多いので,間違っているかも知れない. これらのマイコンは,CH32Vサポートを組み込むと,Arduinoからも使えるようになる. 当然,C++も使える. 特に,USB機能のあるマイコンは,TinyUSBライブラリを使ってプログラムすることができる.
まとめると,その目的に応じて,以下のようにマイコンを選択すると良いと思う. 安く少ない部品点数でUSBデバイスを作りたいときには,CH55xをch55xduinoから使うと良いだろう. プログラムにはコア特有のクセがあり,C言語で書かないといけないが,モードを切り替えればUSBからプログラムを書き込めるので,楽である. とにかく安く作りたいときには,CH32V003+rv003usbが選択肢として考えられる. コンパイル環境を整えたり,rv003usbをある程度理解する必要があるが,Low Speedで良い場合には十分に使えると思う. そうでなければ,USB機能のあるCH32Vを使うと良いだろう. ArduinoでのTinyUSBの使い方に関する文章が少ないが,例を参考にすれば,比較的短いコードで,プログラムを書くことができる.
raspberry pi picoの搭載されているRP2040やRP2350も,非常に安価に売られていることに気がついた. このICはUSB1.1のLow Speedには対応しているらしいが,リードピンの無いパッケージなので半田付けが非常に難しいらしい. 一方,このICを搭載したマイコンボードとしては,raspberry pi picoはサイズが大きいのでこれまで使おうとは思っていなかったが,非常に小型のRP2040-ZeroやRP2350-Zeroというものも発売されている. 小型のマイコンボードなら,今後使う候補として考えていこうと思う.