UIAPduino Pro Micro CH32V003 V1.3Beta
新しいバージョンが利用可能です。
V1.3のマニュアルはメンテナンスされていません。以前のバージョンをお持ちで、新しいバージョンに交換したい場合は、UIAPが最新の製品を発送します。V1.4へ進みましょう!
V1.3はベータ版であり、ハードウェアに欠陥がある可能性があります。既知の問題点:
- プルアップ抵抗R2は回路図通りの3.3Vではなく5Vへ接続されています。
- シルクに見えづらい部分があります。読み取れない場合はボードイメージを参照してください。
- D+(+3.3V)、D-(+3.3V)がUSB規格のHigh論理電位を厳密に満足しません。低すぎます。
- D+(+3.3V)、D-(+3.3V)とマイコンポートとの接続がcnlohr/rv003usbと反対です。
いずれの不具合も致命的ではなく、意図通りに動作するケースが確認されています。
概要
- 24MHzで動作するCH32V003を採用し、Arduino IDEでのコーディングをサポートします。
- 単一のUSB Type-Cで電源供給とプログラムの書き込みを行います。
- USB 2.0 Low-speedデバイスとして動作し、HIDデバイスを作成できます。
- オンボードヒューズでUSBポートを強力に保護します。
- マイクロコントローラの電源は3.3Vまたは5Vから選択できます。
- 高さ2.0mm/ピッチ2.54mmのコンスルーⓇでマウント可能です。(Low-Profile Editionのみ。)
- オープンソースソフトウェアかつオープンソースハードウェアです。
- 永久保証です。
クロック周波数は不具合の暫定対策として24MHzです。将来的に48MHzへ変更されます。
はじめに
LEDを点滅させるプログラム(スケッチ)を書き込み、ボード上でLEDが点滅することを確認します。
手順で示されるまでボードをUSBポートへ接続してはいけません。短絡リスクを低減するためです。
動作確認環境
- OS : Windows 10 / Ubuntu 22.04 LTS
- USBホスト : USB 2.0 Type-A / USB 3.2 Type-C
- Arduino IDE 2.3.2
- USB充電器 : AC充電器(自動判別機能付、USBポート2口、合計最大3.4A)
Windows
前提条件
- Arduino IDEがインストール済みであること
- コマンドプロンプトを起動できること
- ファイル拡張子が表示される設定となっていること
バイナリファイル出力
Arduino IDEを起動し、ファイル -> 基本設定 -> 追加のボードマネージャのURL にhttps://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json
を追記します。ツール -> ボード -> ボードマネージャ でch32
と検索し、CH32 MCU EVT Boards by WCH
の1.0.3
をインストールします。
CH32 MCU EVT Boards by WCH 1.0.4
は不具合でWindowsのArduino IDEへインストールできません。
ツール -> ボード -> CH32 MCU EVT Boards -> CH32V00xを選択します。他の設定項目は全てデフォルトです。ファイル -> スケッチ例 -> 01.Basics -> Blink でLEDを点滅させるサンプルスケッチを開きます。setup()
の前に#define LED_BUILTIN 2
を追記し、Arduinoフォルダへ同名のBlink
で名前をつけて保存します。
// Define on board LED pin before setup()
#define LED_BUILTIN 2
// the setup function runs once when you press reset or power the board
void setup() {
...
スケッチ -> コンパイル済みバイナリをエクスポート と操作し、コンパイル完了
と表示されることを確認します。コンパイル完了
と表示されない場合は手順を見直します。
コンパイルが完了するとスケッチフォルダへバイナリファイルが出力されます。Blink -> build -> WCH.ch32v.CH32V00x_EVT -> Blink.ino.bin がバイナリファイルです。
書き込みの前に
書き込みツールを準備します。GitHubのcnlohr/ch32v003funリポジトリからminichlinkとlibusb-1.0.dllをダウンロード(警告される場合があります)し、任意のフォルダへ保存します。本説明ではDownloads
(設定によってはダウンロード
です)としています。先に出力したバイナリファイルBlink.ino.bin
をツールと同じフォルダへコピーします。
バイナリファイルの書き込み
ボードをパソコンのUSBポートへ接続し、コマンドプロンプトを開きます。
cd Downloads
と入力しEnterキーを押してDownloadsフォルダへ移動します。同様にminichlink.exe -w Blink.ino.bin flash
と入力しEnterキーを押すと書き込みが開始され、Interface Setup
と表示されるのでしばらく待ちます。
Image written
と表示されたら書き込み完了です。
これら煩雑な手順はV1.4以降で改善されます。
動作確認
プログラムを実行するにはAとBの2つの方法があります。
- リセットボタンを押します。(Low-Profile Editionにリセットボタンはありません。)
- パソコンのUSBポートからボードを外し、市販のUSB充電器(ACアダプタ)へ接続します。
どちらか一方の手順でボード中央のオレンジ色ダイオードが1秒ごとに点灯/消灯を繰り返していれば正常動作です。再度プログラムを書き込むにはUSBポートへ挿し直す必要があります。
USBポートへの挿し直しをせずにモード切り替え(シームレススイッチ)する方法もあります。
Linux
Windowsの項目を参考にしてください。
ドキュメント
ピン配置図
Arduino IDEでのポート名称の定義はopenwch/arduino_core_ch32のvariant_CH32V003F4.hとvariant_CH32V003F4.cppを参照しています。
ノート
工場出荷時設定
出荷時にcnlohr/rv003usbのブートローダをカスタムしたものが書き込まれています。
#define SYSTEM_CORE_CLOCK 48000000
#define SYSTEM_CORE_CLOCK 24000000
#define BOOTLOADER_TIMEOUT_PWR 67
#define BOOTLOADER_TIMEOUT_PWR 3
//#define BOOTLOADER_TIMEOUT_USB 0
#define BOOTLOADER_TIMEOUT_USB 0
#define USB_PIN_DP 3 // [0-4] GPIO Number for USB D+ Pin
#define USB_PIN_DM 4 // [0-4] GPIO Number for USB D- Pin
#define USB_PIN_DP 4 // [0-4] GPIO Number for USB D+ Pin
#define USB_PIN_DM 3 // [0-4] GPIO Number for USB D- Pin
#define USB_PIN_DPU 5 // [0-7] GPIO for feeding the 1.5k Pull-Up on USB D- Pin; Comment out if not used / tied to 3V3!
// #define USB_PIN_DPU 5 // [0-7] GPIO for feeding the 1.5k Pull-Up on USB D- Pin; Comment out if not used / tied to 3V3!
シームレススイッチ
書き込み待機モードとプログラム実行モードとをUSBポートへの挿し直しをせずに切り替え(シームレススイッチ)します。これら以外にもシームレススイッチできる仕組みがあるかも知れません。
リセットボタンで
スケッチのsetup()
に4行のコードを追記するとリセットボタンでシームレススイッチします。
// the setup function runs once when you press reset or power the board
void setup() {
if (FLASH->STATR & (1<<14)) NVIC_SystemReset();
SystemReset_StartMode(Start_Mode_BOOT);
pinMode(PD3, OUTPUT);
digitalWrite(PD3, LOW);
...
USBホストで
ボードは、電源ON直後にUSBホストから通信があると書き込み待機モードになり、通信がないとプログラム実行モードになります。USBホストの給電と通信を有効化/無効化すると、物理的な操作をせずにシームレススイッチします。
# This code ran on Raspberry Pi 3 Model B Plus Rev 1.3, Actually.
# For installation, refer to https://github.com/billauer/hubpower
# Go Run-Mode
sudo uhubctl -l 1-1 -p 2 -a 0 # Bus power off
sudo hubpower 1:3 power 2 off # Disable signal from host
sudo uhubctl -l 1-1 -p 2 -a 1 # Bus power on
# Go Boot-Mode
sudo uhubctl -l 1-1 -p 2 -a 0 # Bus power off
sudo hubpower 1:3 power 2 on # Enable signal from host
sudo uhubctl -l 1-1 -p 2 -a 1 # Bus power on
USBホストの給電を有効化/無効化するにはUSBハブがpower switchingに対応している必要があります。
眩しさ防止
夜間のベッドルームなどではLEDが眩しく感じます。ボード内のLEDはジャンプパッドをカットすることで消灯できます。
機能 | 色 | 回路図 | ジャンプ パッド | 備考 |
---|---|---|---|---|
電源オン | 青 | LED1 | CUT1 | |
USB信号 | オレンジ | LED2 | CUT2 | カットすると書き込みできなくなります。 |
内蔵LED | オレンジ | LED3 | パッドなし | V1.4以降でサポートされます。 |
V1.4以降ではCUT2がカットされても書き込み可能のままになる予定です。
アプリケーション例
WS2812Bを光らせる
https://github.com/cnlohr/ch32v003fun/tree/master/examples/ws2812bdemo
Arduinoライブラリ使用
動作したArduinoライブラリとその時のスケッチです。
SevSeg
Show Arduino Sketch
#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment object
void setup() {
byte numDigits = 1;
byte digitPins[] = {1};
byte segmentPins[] = {3, 4, 2, 5, 9, 7, 8, 10};
bool resistorsOnSegments = true; // 'false' means resistors are on digit pins
byte hardwareConfig = COMMON_ANODE; // See README.md for options
bool updateWithDelays = false; // Default 'false' is Recommended
bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
}
void loop() {
sevseg.blank();
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(0, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(1, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(2, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(3, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(4, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(5, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(6, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(7, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(8, 0);
sevseg.refreshDisplay();
delay(1000);
sevseg.setNumber(9, 0);
sevseg.refreshDisplay();
delay(1000);
}
リファレンス
CH32V003
- 32-bit general-purpose RISC-V MCU-CH32V003 - NanjingQinhengMicroelectronics
- GitHub - openwch/ch32v003: CH32V003 is an ultra-cheap RISC-V MCU with 2KB SRAM, 16KB flash, and up to 18 GPIOs that sells for under $0.10
Tips
- 20円マイコン RISC-V CH32V003とは #RISC-V - Qiita
- WCH社のRISC-V搭載CH32シリーズまとめ | Lang-ship
- CH32V003 - fab-wiki
- CH32V003 – inajobのいろいろレビュー
- #29- How to RESET CH32V003 if PD1 is Occupied? - YouTube
- CH32V003J4M6 PD1 SWIO ピン共用問題 Flash eraseでの解決方法 - 宅配おもちゃ病院
- CH32V003 warning - Don't leave SWIO/PD1 floating!
- Help: Reset to bootloader by software or hardware button · Issue #52 · cnlohr/rv003usb
DIY
- Arduino IDE で安価なRISC-VマイコンCH32V003のデジタル出力を試してみた | P.T.A.55
- CH32V003で、UARTで書き込みできるブートローダを書き込んで利用する - @74thの制作ログ
- 40円マイコンCH32V003で、Auto-wakeup(AWU)を使って省電力な動かし方をしてみる #組込み - Qiita
- GitHub - shippoiincho/ch32v003examples: CH32V003 test programs
開発スタック
USBで
Arduino IDEで
- GitHub - openwch/arduino_core_ch32: Core library for CH32duino
- 40円RISC-Vマイコン(CH32V003)をArduino IDEでLチカをしてみました | きょうのかんぱぱ
- 激安RISC-VチップCH32V003を動かす | ELSPINA VEINZ TECH BLOG
- Arduino環境でnanoCH32V003開発ボードを使う | たまねぎブログ
- Arduino環境でBTE32-15(CH32V003)開発ボードを使う | たまねぎブログ
- Clock selection using Arduino IDE menu · Issue #27 · openwch/arduino_core_ch32
- Arduinoでコードからリセットをする方法
Rustで
Pro Micro
- Pro Microとそのバリエーション
- Arduino互換ボード「Pro Micro」の情報まとめ #Arduino - Qiita
- Pro Micro - 5V/16MHz - DEV-12640 - SparkFun Electronics
- SparkFun Qwiic Pro Micro - USB-C (ATmega32U4) - DEV-15795 - SparkFun Electronics
- Qwiic Connect System - SparkFun Electronics
USB
- Document Library | USB-IF
- USB Cheat Sheet
- はじめてのUSB [USB発展の歴史と基礎知識] | テクニカルスクエア | 丸文株式会社
- パケットのフォーマットからプロトコルの詳細まで
- USBの通信プロトコル
- USB Type-C コネクタに必要な終端抵抗 – Community Translated (JA... - Infineon Developer Community
- Replacing Standard USB 3.0/2.0 Connector with Type... - Infineon Developer Community
- pcb - How to connect USB Connector shield? - Electrical Engineering Stack Exchange
- 01signal: Resetting a USB device on Linux (and maybe control its power supply)
謝辞
レビュー
- Yutaro Hiyoshi
- Masashi Yokota
- Yuta Suzuki
提案
- Masashi Sasaki
- Kojo Kimura
- Tomoyuki Dansako
キャラクタデザイン
- Yuto