rpine lab Tech Blog

趣味のプログラミング(Web系・バックエンド)や自宅ラボ(Homelab)構築・マイコンを使った電子工作などを雑多に扱った技術ブログです。

CH32V003マイコンの汎用実験基板を設計・実装する

CH32V003マイコンの汎用実験基板を設計・実装する
目次

概要

以前このブログで紹介した安価なマイコン、CH32V003の汎用実験基板を作りました。

KiCadで設計した基板をJLCPCBに発注して製造しました。基板の発注方法は別記事(🏭Arrow icon of a page linkKiCadで設計したマイコン基板2種をJLCPCBに発注する)で紹介しているので、この記事では基板設計と部品のはんだ付け、動作確認を紹介します。

基板の仕様

  • マイコン:CH32V003F4P6
  • 形状:9ピンのピンヘッダー × 2列(列間隔600 mil・15.24 mm)
    • USBやユーザーLEDに割り当てたピン以外を引き出し
    • ESP32-S3の小型格安マイコンボード(ESP32-S3 Super Mini)と同じサイズを目指して作成
    • ユニバーサル基板やブレッドボードに挿して使用可能
  • USB通信:rv003usbを使ったソフトウェアUSB用に、D+(PD3)・D−(PD4)と、D−のプルアップをPD5で制御する回路を接続(詳細は次回の記事で解説)
  • 書き込み・デバッグ:デバッガー接続用のピンソケット(SWIO・GND・3.3 V)を基板上に配置
    • 直接WCH-Linkを挿し込んでデバッグ可能
  • マイコン電源:USB Type-Cの5 Vをリニアレギュレータで降圧した3.3 Vを使用
  • ユーザーLED:PD0(Hで点灯)
  • ユーザーボタン:PD2(負論理・外付けプルアップ)
  • リセットボタン:NRST(PD7)

主要な使用部品

使用部品は主にDigiKeyと秋月電子で調達しました。

  • RISC-Vマイコン:CH32V003F4P6(WCH)
  • 小型の表面実装タクトスイッチ(リセット・ユーザーボタン用):B3U-1000P(Aratas)
    • 入手先:DigiKey
    • 寸法:3.00 mm × 2.50 mm
    • 小さいタクトスイッチを選んだら、マイコンよりも単価が高くなってしまいました。寸法が近い別のスイッチを探す予定です。
  • USB Type-Cコネクタ:UJ20-C-H-G-SMT-2A-P16-TR(Same Sky)
  • リニア(三端子)レギュレータ:SL6206-33NR(Shenzhen Slkormicro Semicon Co., Ltd.)

基板設計

KiCad 10を使って基板を設計しました。

回路図

回路は基本的に使う部品のデータシートに載っている推奨回路(応用回路例)をもとに設計します。今回の基板では主に次の箇所をデータシートや仕様に沿って決めています。

  • マイコン
    • データシートの電源回路例(Figure 3-1 Typical circuit for conventional power supply)に合わせて、電源ピン(VDD-VSS間)の近くにパスコン(0.1 µF)を置く
    • データシートの外部リセット回路例(Figure 3-5 Typical circuit of external reset pin)に合わせて、NRSTピンとGNDの間に0.1 µFのコンデンサを置く
  • リニアレギュレータ:入力側と出力側にコンデンサ(1 µF)を入れる
  • USB周辺回路:rv003usbのREADMEの参考回路に合わせる(詳細は次回の記事で解説)
CH32V003汎用実験基板の回路図
CH32V003汎用実験基板の回路図

※回路図のレギュレータのピン配置は実際に使ったSL6206-33NRと異なります(後述)。

基板レイアウト

基板表面
基板表面
基板裏面
基板裏面

ブレッドボードに挿さるように、ピンヘッダー間の幅を2.54 mmピッチの倍数である15.24 mm(600 mil)にし、それに合わせて基板の外形サイズを決めます。外形が決まったら、あとは部品と配線を頑張って詰め込みます。

サイズの都合上、表面だけでは部品を配置しきれないため、レギュレータやUSB周りの抵抗などは裏面に配置しています。

デザインルールはJLCPCBの製造基準(参考)に概ね則っています。電源線は0.75 mm、その他の信号線は0.25 mmの線幅で配線しています。KiCadの設定等は別記事(🏭Arrow icon of a page linkKiCadで設計したマイコン基板2種をJLCPCBに発注する)も併せて参照してください。

また、KiCadのイメージ コンバーターにロゴのPNGファイルを読み込ませることで、シルクスクリーンのロゴを作成できます。

イメージ コンバーターにロゴの画像を読み込ませてシルクスクリーンを作成
イメージ コンバーターにロゴの画像を読み込ませてシルクスクリーンを作成

ある程度配置が完了したら、「表示」→「3D ビューアー」(Alt + 3 キー)から基板の3Dモデルを確認できます。

KiCadで表示した3Dモデル
KiCadで表示した3Dモデル

部品の実装

使用する道具

基板実装セットアップ
基板実装セットアップ
  • はんだごて

    FNIRSI HS-02A

    USB PD給電のはんだごてです。細かく温度を設定でき、使っていないときはスリープし、手に持つとすぐに復帰するので便利です。

  • 糸はんだ:鉛入りはんだ0.65 mm・0.3 mmの2種類

    太さの異なるはんだを2種類用意しましたが、今回は0.65 mmのはんだだけで十分でした。

  • はんだ吸取り線

    表面実装部品の手はんだでは、細かいピンに付いた余分なはんだやブリッジを取り除くために使います。

  • 基板用フラックス

    はんだを長時間融かしていると、糸はんだに含まれるフラックスが飛んでしまいます。はんだの形が整わなかったり表面がくすんだりしたら、フラックスを補充します。

  • 電子工作用耐熱シリコンマット・工作マット

    机を焦がさないように敷きます。

はんだ付けの順序

基板実装準備(基板・USB Type-Cコネクタ・マイコンのみ)
基板実装準備(基板・USB Type-Cコネクタ・マイコンのみ)

マイコン(TSSOP20パッケージ)、USB Type-Cコネクタ、表面の残りの部品、裏面の部品(リニアレギュレータなど)の順に実装します。

TSSOP20のはんだ付け

マイコンのはんだ付け(右上のピンだけ固定)
マイコンのはんだ付け(右上のピンだけ固定)

最初に1か所のパッドにはんだを載せ、マイコンのピンを1本だけはんだ付けして固定します。その後、はんだを載せたこて先をピンの横から当て、滑らせながら残りのピンをはんだ付けします。

ピン同士がブリッジした場合は、余分なはんだをこて先に移すか吸取り線で吸い取り、フラックスを塗って再度こて先を当てて整えます。

USB Type-Cコネクタのはんだ付け

USB Type-Cコネクタのはんだ付け
USB Type-Cコネクタのはんだ付け

逆作用ピンセットでコネクタを押さえながら、マイコンと同様に、はんだを載せたこて先を端子に沿って滑らせてはんだ付けします。ピッチが狭いため、ブリッジする前提で多めにはんだを盛り、後から余分なはんだをはんだ吸取り線で取り除きます。

マイコンと違ってピンがあまり外に出ていないため、今回の部品の中で手はんだが一番難しかったです。

その他表面実装部品のはんだ付け

今回の基板ではチップ抵抗やコンデンサに主に1608サイズ(1.6 mm × 0.8 mm・インチ表記0603)を採用しています。このサイズなら手はんだでも問題なく付けられました。

  1. 基板の片側のパッドにはんだを盛る
  2. ピンセットで部品をつかみ、パッドに盛ったはんだを融かしながら片側を仮付けする
  3. 部品が浮いていたら上から押さえながらはんだを融かして基板に密着させる
  4. もう片側にはんだを流してはんだ付けする
  5. 最初に付けた側を融かして本はんだ付けする
実装した裏面(※レギュレータが斜めになっている理由は後述)
実装した裏面(※レギュレータが斜めになっている理由は後述)

通電前の確認

テスターの導通チェックモードを使って、電源ピンとグラウンドが導通していないか、マイコンなどの隣り合っているピン同士が導通してしまっていないか(はんだブリッジの疑い)などを確認します。

電源投入テスト

可変電源を使って電源投入テスト(ここでは3.3 Vピンに直接3.3 Vを入力)
可変電源を使って電源投入テスト(ここでは3.3 Vピンに直接3.3 Vを入力)

段階的に電源を投入して、基板のショートや電源回路(レギュレータ)の動作を確認します。電源装置にはPD電源を使えるポータブルな定電圧定電流可変電源(Alientek DP100)を使い、短絡時の電流を抑えるため電流制限値を100 mAに設定しています。

まず3.3 Vピンへ直接3.3 Vを入力し、電源装置の電流値から過電流やショートが起きていないか確認します。

次に5 Vピンへ5 Vを入力し、リニアレギュレータの出力電圧(3.3 Vピン)をテスターで測定すると、想定した3.3 Vではなく4 V台の値が出ていました。

設計ミス:リニアレギュレータのピン配置

購入したリニアレギュレータのデータシートを確認すると、KiCadの回路図シンボルとピンの割り当てが異なっていました。

汎用の回路図シンボルを使うときはデータシートとピンの割り当てを照合する必要がありますが、その照合を忘れていました。

回路上のピン配置(1: Vin 2: Vout 3: GND)
回路上のピン配置(1: Vin 2: Vout 3: GND)
購入したレギュレータ(SL6206-33NR)のデータシート(1: GND 2: VOUT 3: VDD[入力])
購入したレギュレータ(SL6206-33NR)のデータシート(1: GND 2: VOUT 3: VDD[入力])

1番ピンと3番ピンが入れ替わっていたため、ピンを逆向きに曲げて裏返し、45度傾けた状態で取り付けることで事なきを得ました(真似しないでください)。上の「実装した裏面」の写真で取り付けた様子が分かります。

取り付け直した後に測定すると、3.3 Vの出力を確認できました。なお、修正前のテストでマイコンに4 V台の電圧がかかりましたが、CH32V003は定格で5 V動作にも対応しているため壊れずに済みました。

3.3 Vの出力テスト
3.3 Vの出力テスト

2枚目以降を実装する際は、回路図と同じピン配置のリニアレギュレータを別途用意して使う予定です(秋月電子のAP7375を確保済み)。

動作確認

開発環境

以前の記事で扱ったIDEのMounRiver Studio Ⅱを開発環境に利用します。

セットアップ方法などは以下の記事を参照してください。

今回の基板には公式デバッガーのWCH-Linkを直接挿し込める3ピンのピンソケットを配置しています。

ピンソケットにはSWIO(デバッグ信号線)、GND、3.3 V(マイコン電源)をこの順に並べています。WCH-Linkのコネクタの一部と同じ並びなので、写真のように直接挿し込んで書き込みやデバッグができます。

WCH-Linkを直接基板に挿し込んでデバッグする様子
WCH-Linkを直接基板に挿し込んでデバッグする様子

テストプログラム

サンプルプログラム(プロジェクト作成時のテンプレート)を改造して、Lチカとボタン入力の簡単なテストプログラムを作成します。以下のコードはボタン入力テスト用の状態で、if 文のコメントアウトを切り替えることでLチカ単体のテストにも使えます。

static uint8_t cnt = 0;

void UserPins_Init (void) {
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOD, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init (GPIOD, &GPIO_InitStructure);  // UserLED
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init (GPIOD, &GPIO_InitStructure);  // UserBtn
}

int main (void) {
    NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1);
    SystemCoreClockUpdate();
    Delay_Init();
#if (SDI_PRINT == SDI_PR_OPEN)
    SDI_Printf_Enable();
#else
    // USART_Printf_Init (115200);
#endif

    UserPins_Init();
    GPIO_SetBits (GPIOD, GPIO_Pin_0);

    printf ("SystemClk:%d\r\n", SystemCoreClock);
    printf ("ChipID:%08x\r\n", DBGMCU_GetCHIPID());

    while (1) {
        uint8_t btnState = GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_2);
        printf("Cnt:%03d", cnt);
        printf(" Btn:%d", btnState);

        // if (cnt & 0x1) { // Lチカテスト
        if (!btnState) { // ボタン入力テスト
            GPIO_SetBits (GPIOD, GPIO_Pin_0);
            printf(" LED:On\n");
        } else {
            GPIO_ResetBits (GPIOD, GPIO_Pin_0);
            printf(" LED:Off\n");
        }

        cnt++;
        Delay_Ms(200);
    }
}
テストプログラム main.c(抜粋、冒頭の#includeなどは省略)

Lチカ

LEDを基板に配置してマイコンのPD0ピンに接続しているので、GPIOを使って光らせてみます。

Lチカを試すときはif (cnt & 0x1)の行のコメントを外し、if (!btnState)の行をコメントアウトします。LEDは約0.4秒周期で点滅します。

基板上のLEDを点滅させている様子
基板上のLEDを点滅させている様子

ボタン入力

基板上のユーザーボタンをGPIOで読み取り、押されている間だけLEDを点灯させます。

あわせてSDI printf機能を使い、読み取ったボタンとLEDの状態をデバッグ出力で確認します。

Cnt:011 Btn:1 LED:Off
Cnt:012 Btn:1 LED:Off
Cnt:013 Btn:1 LED:Off
Cnt:014 Btn:1 LED:Off
Cnt:015 Btn:0 LED:On // 押した時だけOn
Cnt:016 Btn:0 LED:On
Cnt:017 Btn:0 LED:On
Cnt:018 Btn:0 LED:On
Cnt:019 Btn:1 LED:Off
Cnt:020 Btn:1 LED:Off
Cnt:021 Btn:1 LED:Off
Cnt:022 Btn:1 LED:Off
Cnt:023 Btn:1 LED:Off
デバッグ出力

まとめ

CH32V003の汎用実験基板をKiCadで設計してJLCPCBで製造し、手はんだで実装したうえで動作を確認しました。

電源投入テストではリニアレギュレータのピン配置ミスが見つかりましたが、部品の向きを変えて取り付けることで動作させられました。

次回はこの基板に載せたUSB回路とrv003usbを使い、ソフトウェアUSBでPCと接続します。

参考サイト

この記事が役に立ったら是非ご支援をお願いします!

支援する

※Squareの決済ページに移動します