激安RISC-VチップCH32V003を動かす
秋月電子のHPを見ていたところ、40円の中華製MCUが売り出されていることに気づきました。1個40円なのでPICやAVRの最小機種と変わらない内容かと思いながら仕様を見てビックリ、RISC-Vの32ビットコアの16kBフラッシュを持つものでした。開発環境も使い慣れたarduinoIDEに対応しているとのことで、数個買って試すことにしました。
プログラムの書き込みには1-wire serial debug interface(SDI)という1本の線で読み書きする専用のインタフェースを使っており、WCH-LinkEという書き込み器が安価に売られています。
arduinoIDEで動かしてみる
8ピンのCH32V003J4M6(40円税込)と20ピンのCH32V003F4P6(50円税込)の2種類を買ってきました。合わせてピッチ変換基板と細ピンヘッダも買ってきました。写真1はピッチ変換基板に載せた様子です。
またファームウェアの書き込みには同じく秋月電子で売っているWCH-LinkEという書き込み器(750円税込)を使います。さらにブレッドボードで扱えるように接続コードを写真2のように作りました。上の3本線の方は書き込み用(3V3、GND、SWDIO)、下の2本線の方はシリアル用(RX、TX)です。
これとジャンパーコードを使ってPCに写真3、4のように接続してハード的な書き込み環境は完成します。
WCH-LinkEに対応した書き込みソフトWCH-LinkUtilityのインストールとarduinoIDEへのボードの追加はこのページを参考にさせてもらいました。
WCH-LinkUtilityでチップが図1の赤枠のように認識されることを確認した後、arduinoIDEの環境設定を行い、Lチカのスケッチをダウンロードして動作確認を行います。
次に、ボードマネジャ「CH32 MCU EVT Boards by WCH ver.1.0.3」を使用し、各ポートのデジタルI/Oを使用したLチカ、スイッチ入力を試しました。図2、図3に赤枠で示す各ポートのデジタルI/Oが利用できること、また20ピンのものではUARTの送受信ができることを確認しました。アナログポートに電圧を加えてADCの出力をシリアル出力しPC上で確認することも試しましたが、動作を確認できませんでした。
気づいた問題点として、8ピンチップでSWIOとして使用しているピン(8番ピン)をPD1としてプログラムするとその後ファームウェアの書き換えができなくなることです。SWIOのピンはI/Oに使用せずデバッグ用にあけておいた方がよいようです。
WCH-LinkEのファームウェア更新失敗からのリカバリ
WCH-LinkUtilityを使っていると時々「ファームウェア更新が必要です」のようなメッセージが出てきます。これを信じて「更新する」を選んだところ、更新に失敗し、WCH-LinkEがPCから認識されなくなりました。WCH-LinkUtilityのHelpメニューにあるマニュアル「WCH-LinkUserManual-EN.pdf」によると、もう一台WCH-LinkEがないと復旧できないようです。
仕方なくもう一台秋月で入手してマニュアルの「6.3 WCH-LinkUtility offline update (2-wire approach to offline update)」にある手順で復旧を試してみました。この際、復旧対象のWCH-LinkE密閉ケースの中のスイッチIAPを押しながらUSBコネクタに接続し電源を入れる必要があり、写真5の赤丸のようにケースにスイッチをつまようじで押せる穴をあけました。写真6のようにマニュアルに沿って配線、電源を入れ書き込みモードになると復旧対象のWCH-LinkE(図で右側のもの)では青LEDが点滅します。書き込むファームウェアは\WCH-LinkUtility\Firmware_Linkにある「WCH-LinkE-APP-IAP.bin」を選択します。穴あきケースになってしまいましたが、何とか復旧できました。
ゲームをダウンロード
arduinoでの開発ではないですが、以下のGitHubに8ピンのCH32V003を使用した面白い応用例があり、実行ファイルも公開されていましたので、どれ程のものができるのかさっそく試してみました(写真7)。
https://github.com/wagiminator/CH32V003-GameConsole
0.96inchの128×64ドット有機ELディスプレイにゲームを表示させ、5つのキーで動かすものです。昔懐かしいインベーダやテトリスなどの作例がありました。ハードウェアも単純で、8ピンという少ないピン数でもゲームを制御できるようによく考えられています。ADCに加わる電圧でどのキーが押されたかを識別するようになっています(回路図は図4、https://github.com/wagiminator/CH32V003-GameConsole/blob/main/hardware/GameConsole_schematic.pdfから引用)。
ただしADCに加わる電圧を作り出す抵抗値は手持ちの関係からE6系列の抵抗の組み合わせで実現できるように再設計しました。
- 2kΩ→2.2kΩ
- 20kΩ→22kΩ
- 3.9kΩ→2.2kΩの2本直列で4.4kΩ
- 8.2kΩ→4.7kΩの2本直列で9.4kΩ
ゲームの動きもなかなかスムーズで40円マイコンでここまでできるのかと驚きでした。