บทความ: CH32V006 ไมโครคอนโทรลเลอร์ RISC-V ราคา $2 ฉบับสมบูรณ์ 2026

เจาะลึก CH32V006 ไมโครคอนโทรลเลอร์ RISC-V รุ่นล่าสุดจาก WCH ที่มาพร้อมคุณสมบัติที่เหนือกว่า CH32V003 ราคาเพียง $2 สำหรับบอร์ด WeAct Mini Core พร้อมวิธีการเริ่มต้นใช้งานจากศูนย์ถึงการเขียนโปรแกรมแรก

📅 10 เมษายน 2026⏱️ 18 นาที🎯 Beginner-Intermediate
CH32V006RISC-VWCHWeActMicrocontrollerOpen Source

คำนำ

CH32V006 เป็นไมโครคอนโทรลเลอร์ RISC-V 32-bit รุ่นล่าสุดจาก WCH (WinChipHead) ที่เปิดตัวในปี 2024 และบอร์ดพัฒนา WeAct CH32V006F8U6 Mini Core เพิ่งวางจำหน่ายในเดือนเมษายน 2026 ด้วยราคาเพียง $2 (ประมาณ 70 บาท) ทำให้เป็นหนึ่งในไมโครคอนโทรลเลอร์ RISC-V ที่เข้าถึงได้ง่ายที่สุดในตลาด

CH32V006 เป็นการอัปเกรดจาก CH32V003 ยอดนิยม ที่มาพร้อมกับหน่วยความจำมากขึ้น, GPIO เพิ่มเติม, และความยืดหยุ่นในการใช้งานที่ดีกว่า ด้วยการรองรับทั้ง 3.3V และ 5V I/O ทำให้เข้ากันได้กับ sensor และ module ส่วนใหญ่โดยไม่ต้องใช้ level shifter

🎉 ทำไมต้อง CH32V006? นี่คือ RISC-V microcontroller ที่มาพร้อมกับคุณสมบัติครบครันในราคาที่เข้าถึงได้ เหมาะสำหรับการเรียนรู้ RISC-V architecture, สร้างโปรเจกต์ IoT งบประหยัด, หรือทำผลิตภัณฑ์ที่ต้องการต้นทุนต่ำ และด้วย USB-C port ที่ทันสมัย การเชื่อมต่อกับคอมพิวเตอร์ก็ง่ายยิ่งขึ้น

🆕 สิ่งใหม่ใน CH32V006: หน่วยความจำ Flash สองเท่า, RAM เพิ่มขึ้น, GPIO มากขึ้น, และรองรับทั้ง 3.3V และ 5V I/O พร้อม USB-C port ที่ทันสมัย

CH32V006 คืออะไร?

CH32V006 เป็นไมโครคอนโทรลเลอร์ 32-bit ที่ใช้สถาปัตยกรรม RISC-V (RV32EC) จาก WCH ซึ่งเป็นบริษัทจีนที่มีชื่อเสียงด้านการผลิตชิปราคาถูก ชิปนี้ถูกออกแบบมาเพื่อเป็นการอัปเกรดจาก CH32V003 ที่มาพร้อมกับคุณสมบัติที่ดีกว่าในราคาที่ยังคงอยู่ในระดับเดิม

คุณสมบัติหลักของ CH32V006

  • CPU: QingKe RISC-V 32-bit (RV32EC) ที่ 48MHz
  • Memory: 32KB Flash (เพิ่มจาก 16KB), 4KB SRAM (เพิ่มจาก 2KB)
  • I/O: 22 GPIO pins (เพิ่มจาก 16 pins), SPI, I2C, UART
  • USB: USB 2.0 Device พร้อม USB-C connector
  • Timers: 4 ตัวจับเวลาขั้นสูง (Advanced, General, Basic)
  • ADC: 12-bit ADC พร้อมช่องสัญญาณ 9 ช่อง
  • Voltage: 2.0V - 5.5V พร้อม I/O ที่รองรับทั้ง 3.3V และ 5V
  • Price: ~$2 สำหรับบอร์ด WeAct Mini Core (ชิปเดี่ยว ~$0.15)

⚠️ ข้อควรระวัง: แม้ว่าจะรองรับแรงดัน 2.0V - 5.5V แต่ I/O pins แต่ละ pin สามารถตั้งค่าได้ทั้ง 3.3V หรือ 5V โดยการเลือกผ่าน jumper หรือ configuration บนบอร์ด ตรวจสอบ schematic ของบอร์ดของคุณก่อนใช้งาน

คุณสมบัติเด่นของ CH32V006

💰 ราคาเข้าถึงได้

ด้วยราคาเพียง $2 สำหรับบอร์ดพัฒนา CH32V006 เป็นหนึ่งใน RISC-V microcontrollers ที่ราคาเข้าถึงได้ที่สุด ในขณะที่ยังคงฟีเจอร์ครบครัน

🔓 RISC-V Open Architecture

เรียนรู้และทำงานกับสถาปัตยกรรมโอเพนซอร์สที่กำลังเป็นมาตรฐานใหม่ในโลก embedded systems

🔌 รองรับ 3.3V และ 5V I/O

ความยืดหยุ่นสูงสุดด้วยการรองรับทั้ง 3.3V และ 5V I/O ทำให้เข้ากันได้กับ sensor และ module ส่วนใหญ่โดยไม่ต้องใช้ level shifter

🚀 หน่วยความจำเพิ่มขึ้น

32KB Flash และ 4KB SRAM ให้พื้นที่มากขึ้นสำหรับโปรแกรมที่ซับซ้อนและข้อมูลที่มากขึ้น

🔌 USB-C Modern Connector

USB-C port ที่ทันสมัย ทำให้การเชื่อมต่อกับคอมพิวเตอร์และ power supply ง่ายและสะดวกยิ่งขึ้น

📊 GPIO เพิ่มเติม

22 GPIO pins ให้ความยืดหยุ่นในการเชื่อมต่อ sensor, actuator และอุปกรณ์เพิ่มเติมได้มากขึ้น

เปรียบเทียบ: CH32V006 vs CH32V003

ตารางด้านล่างนี้แสดงความแตกต่างระหว่าง CH32V006 รุ่นล่าสุดกับ CH32V003 รุ่นก่อนหน้า:

คุณสมบัติCH32V003CH32V006ข้อดี
Flash Memory16KB32KB ⬆️พื้นที่โปรแกรมเพิ่ม 2 เท่า
SRAM2KB4KB ⬆️RAM เพิ่ม 2 เท่า
GPIO Pins16 pins22 pins ⬆️เชื่อมต่ออุปกรณ์ได้มากขึ้น
I/O Voltage5V only3.3V/5V ⬆️ยืดหยุ่นกว่ามาก
USB ConnectorMicro-USBUSB-C ⬆️ทันสมัยและใช้งานง่าย
ADC Channels7 channels9 channels ⬆️อ่าน sensor ได้มากขึ้น
Price (Board)~$1-1.5~$2ราคาสูงขึ้นเล็กน้อย

💡 คำแนะนำ: หากคุณเริ่มต้นใหม่กับ RISC-V และมีงบจำกัด CH32V003 ยังคงเป็นตัวเลือกที่ดี แต่หากคุณต้องการหน่วยความจำมากขึ้น ความยืดหยุ่นใน I/O voltage และ USB-C ที่ทันสมัย CH32V006 คุ้มค่ากับการลงทุนเพิ่มขึ้นอย่างแน่นอน

อุปกรณ์ที่ต้องใช้

อุปกรณ์พื้นฐาน (จำเป็น)

  • WeAct CH32V006F8U6 Mini Core Board - บอร์ดพัฒนา CH32V006 ราคา ~$2
    รุ่นที่แนะนำ: WeAct CH32V006F8U6 Mini Core
  • WCH-LinkE Programmer - อุปกรณ์สำหรับ flash firmware ราคา ~$3-5
    จำเป็นสำหรับการอัปโหลดโปรแกรมลงบอร์ด
  • USB-C Cable - สายสำหรับเชื่อมต่อบอร์ดกับคอมพิวเตอร์
    บอร์ด CH32V006 ใช้ USB-C connector
  • Dupont Wires (Male-to-Female) - สาย jumper สำหรับต่อ external device
    แนะนำ 40-pin ขึ้นไป

อุปกรณ์เสริม (แนะนำ)

  • 💡
    Breadboard - สำหรับ prototype วงจรชั่วคราว
  • 💡
    LEDs - สำหรับทดสอบ output
  • 💡
    Resistors (220Ω, 1kΩ, 10kΩ) - สำหรับจำกัดกระแสและ pull-up/down
  • 💡
    Potentiometer (10kΩ) - สำหรับทดสอบ analog input
  • 💡
    Push Buttons - สำหรับทดสอบ digital input

การติดตั้งซอฟต์แวร์

สำหรับ Windows

  1. 1
    ดาวน์โหลด WCH-LinkE Utility

    ดาวน์โหลดจากเว็บไซต์ WCH หรือ GitHub repository ของ WeAct Studio โปรแกรมนี้ใช้สำหรับ flash firmware ลง CH32V006

  2. 2
    ติดตั้ง Driver

    ติดตั้ง USB driver สำหรับ WCH-LinkE programmer ตามคู่มือที่แนบมากับโปรแกรม

  3. 3
    ติดตั้ง Toolchain

    ดาวน์โหลดและติดตั้ง RISC-V toolchain จาก WCH หรือใช้ open-source toolchain เช่น CH32Fun สำหรับ Linux

  4. 4
    ติดตั้ง IDE (Optional)

    คุณสามารถใช้ VS Code, PlatformIO, หรือ MounRiver Studio (IDE อย่างเป็นทางการจาก WCH)

สำหรับ Linux

  1. 1
    ติดตั้ง CH32Fun
    git clone https://github.com/cnlohr/ch32fun.git
    cd ch32fun
    make install

    CH32Fun เป็น open-source toolchain สำหรับ CH32V003/006 ที่ใช้งานได้ดีบน Linux

  2. 2
    ติดตั้ง WCH-LinkE tools

    ติดตั้ง mini-chlink หรือใช้ wine เพื่อรัน WCH-LinkE Utility บน Linux

💡 เคล็ดลับ: สำหรับผู้เริ่มต้น แนะนำให้ใช้ MounRiver Studio บน Windows เนื่องจากมี GUI ที่ใช้งานง่ายและมาพร้อมกับตัวอย่างโค้ดมากมาย แต่หากคุณคุ้นเคยกับ command line และต้องการความยืดหยุ่น CH32Fun บน Linux เป็นตัวเลือกที่ดี

การต่อสาย Hardware

การเชื่อมต่อ WCH-LinkE Programmer

การเชื่อมต่อ WCH-LinkE programmer กับ CH32V006 board ทำได้ง่ายดังนี้:

WCH-LinkECH32V006หมายเหตุ
3V33.3VPower supply
GNDGNDGround
SWDIOPA13 / SWDIOData line
SWCLKPA14 / SWCLKClock line

⚠️ ข้อควรระวัง: ตรวจสอบให้แน่ใจว่าได้ต่อสายถูกต้องก่อนเปิดใช้งาน การต่อผิดอาจทำให้บอร์ดเสียหายได้ บอร์ด CH32V006 บางรุ่นอาจมี pin label ที่ต่างกัน ให้ตรวจสอบ schematic ของบอร์ดของคุณ

การตั้งค่า I/O Voltage

หนึ่งในคุณสมบัติที่เด่นที่สุดของ CH32V006 คือการรองรับทั้ง 3.3V และ 5V I/O บนบอร์ด WeAct Mini Core:

  • 3.3V Mode: เหมาะสำหรับ sensor และ module ส่วนใหญ่ที่ใช้ 3.3V
  • 5V Mode: เหมาะสำหรับ sensor และ module รุ่นเก่าที่ใช้ 5V

ตรวจสอบ jumper หรือ configuration บนบอร์ดของคุณเพื่อเลือก I/O voltage ที่ต้องการ บางบอร์ดอาจต้องบัดกรี jumper เพื่อเปลี่ยน voltage mode

โปรแกรมแรก: Blink LED

มาเริ่มต้นด้วยโปรแกรม "Hello World" ของ embedded systems กันเลย - การกระพริบ LED! นี่คือโค้ดง่ายๆ ที่จะทำให้ LED บนบอร์ดกระพริบ

Code: Blink LED

// CH32V006 LED Blink Example
// ทำให้ LED กระพริบทุก 500ms

#include "ch32v00x.h"

// LED pin - เปลี่ยนตามบอร์ดของคุณ
// บอร์ด WeAct Mini Core มี LED บน PC1
#define LED_PIN GPIO_Pin_1
#define LED_PORT GPIOC

void Delay(uint32_t n) {
    // ฟังก์ชัน delay ง่ายๆ โดยใช้ loop
    while(n--) {
        // วน loop ประมาณ 1ms ต่อรอบ (ที่ 48MHz)
        for(volatile uint32_t i = 0; i < 4800; i++);
    }
}

int main(void) {
    // ตั้งค่า GPIO สำหรับ LED
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure = {
        .GPIO_Pin = LED_PIN,
        .GPIO_Mode = GPIO_Mode_Out_PP,  // Push-Pull output
        .GPIO_Speed = GPIO_Speed_50MHz
    };
    GPIO_Init(LED_PORT, &GPIO_InitStructure);

    // Main loop
    while(1) {
        // เปิด LED
        GPIO_SetBits(LED_PORT, LED_PIN);
        Delay(500);  // รอ 500ms
        
        // ปิด LED
        GPIO_ResetBits(LED_PORT, LED_PIN);
        Delay(500);  // รอ 500ms
    }
}

คำอธิบายโค้ด

  • #include "ch32v00x.h": รวม header file สำหรับ CH32V006
  • RCC_APB2PeriphClockCmd: เปิด clock สำหรับ GPIO port C
  • GPIO_Init: ตั้งค่า LED pin เป็น push-pull output
  • GPIO_SetBits/ResetBits: เปิด/ปิด LED
  • Delay: ฟังก์ชัน delay แบบ blocking

✅ หลังจาก compile และ flash: LED บนบอร์ดควรจะกระพริบทุก 500ms หากไม่ทำงาน ตรวจสอบว่าได้ต่อสายถูกต้องและ LED pin ตรงกับบอร์ดของคุณ

ตัวอย่างการใช้ GPIO

ต่อไปเราจะมาเรียนรู้การใช้งาน GPIO ทั้ง input และ output โดยจะทำโปรเจกต์ควบคุม LED ด้วยปุ่มกด

โครงสร้างวงจร

  • LED ต่อกับ PC1 (ผ่านตัวต้านทาน 220Ω)
  • Push button ต่อกับ PA0 พร้อม pull-up resistor (10kΩ)

Code: Button Controls LED

// CH32V006 Button + LED Example
// กดปุ่มเพื่อเปิด/ปิด LED

#include "ch32v00x.h"

#define LED_PIN GPIO_Pin_1
#define LED_PORT GPIOC

#define BUTTON_PIN GPIO_Pin_0
#define BUTTON_PORT GPIOA

// ฟังก์ชัน delay ง่ายๆ
void Delay(uint32_t ms) {
    while(ms--) {
        for(volatile uint32_t i = 0; i < 4800; i++);
    }
}

// ฟังก์ชันอ่านสถานะปุ่ม
uint8_t ReadButton(void) {
    // ปุ่มกด active-low (กด = 0, ไม่กด = 1)
    return GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == 0;
}

int main(void) {
    // เปิด clock สำหรับ GPIO port A และ C
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
    
    // ตั้งค่า LED pin เป็น output
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &GPIO_InitStructure);
    
    // ตั้งค่า Button pin เป็น input พร้อม pull-up
    GPIO_InitStructure.GPIO_Pin = BUTTON_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // Input with Pull-Up
    GPIO_Init(BUTTON_PORT, &GPIO_InitStructure);

    uint8_t lastButtonState = 0;
    uint8_t ledState = 0;
    
    // ปิด LED เริ่มต้น
    GPIO_ResetBits(LED_PORT, LED_PIN);

    // Main loop
    while(1) {
        uint8_t currentButtonState = ReadButton();
        
        // ตรวจจับการกดปุ่ม (falling edge)
        if(currentButtonState && !lastButtonState) {
            // Toggle LED state
            ledState = !ledState;
            if(ledState) {
                GPIO_SetBits(LED_PORT, LED_PIN);
            } else {
                GPIO_ResetBits(LED_PORT, LED_PIN);
            }
            
            // Debounce delay
            Delay(50);
        }
        
        lastButtonState = currentButtonState;
        Delay(10);  // Polling interval
    }
}

แนวคิดสำคัญ

  • GPIO Mode: Output (Push-Pull), Input with Pull-Up
  • Debouncing: Delay 50ms เพื่อป้องกัน bouncing
  • Edge Detection: Toggle เมื่อ detect falling edge

อ่านค่า Analog Sensor

CH32V006 มี ADC 12-bit พร้อม 9 ช่องสัญญาณ ทำให้สามารถอ่านค่า analog sensor ได้หลากหลาย มาดูตัวอย่างการอ่านค่า potentiometer:

Code: Read ADC (Potentiometer)

// CH32V006 ADC Example
// อ่านค่าจาก potentiometer และแสดงผล

#include "ch32v00x.h"
#include <stdio.h>

// Potentiometer ต่อกับ PA1 (ADC channel 1)
#define ADC_PIN GPIO_Pin_1
#define ADC_PORT GPIOA

// LED สำหรับแสดงผล
#define LED_PIN GPIO_Pin_1
#define LED_PORT GPIOC

void Delay(uint32_t ms) {
    while(ms--) {
        for(volatile uint32_t i = 0; i < 4800; i++);
    }
}

// ฟังก์ชันเริ่มต้นใช้งาน ADC
void ADC_Init_Custom(void) {
    // เปิด clock สำหรับ ADC และ GPIOA
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    // ตั้งค่า ADC pin เป็น analog input
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = ADC_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  // Analog Input
    GPIO_Init(ADC_PORT, &GPIO_InitStructure);
    
    // ตั้งค่า ADC
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    
    // ตั้งค่า ADC channel และ sampling time
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_241Cycles);
    
    // เปิด ADC
    ADC_Cmd(ADC1, ENABLE);
    
    // Calibrate ADC
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

// ฟังก์ชันอ่านค่า ADC
uint16_t ADC_Read(uint8_t channel) {
    // ตั้งค่า channel
    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_241Cycles);
    
    // เริ่มการแปลง
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    // รอจนเสร็จสิ้น
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    
    // อ่านค่า
    return ADC_GetConversionValue(ADC1);
}

int main(void) {
    // เปิด clock สำหรับ GPIOC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
    // ตั้งค่า LED pin
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &GPIO_InitStructure);
    
    // เริ่มต้นใช้งาน ADC
    ADC_Init_Custom();
    
    while(1) {
        // อ่านค่าจาก potentiometer (PA1 = ADC Channel 1)
        uint16_t adcValue = ADC_Read(ADC_Channel_1);
        
        // แปลงค่า ADC (0-4095) เป็น PWM duty cycle (0-100)
        // ค่าสูง = LED สว่างขึ้น
        uint16_t brightness = (adcValue * 100) / 4095;
        
        // ควบคุม LED ตามค่า ADC (ง่ายๆ ด้วย delay)
        if(brightness > 50) {
            GPIO_SetBits(LED_PORT, LED_PIN);
            Delay(brightness);
            GPIO_ResetBits(LED_PORT, LED_PIN);
            Delay(100 - brightness);
        } else {
            GPIO_ResetBits(LED_PORT, LED_PIN);
        }
        
        Delay(10);
    }
}

คำอธิบาย

  • ADC Resolution: 12-bit (0-4095)
  • ADC Channels: 9 channels สำหรับอ่าน sensor หลายตัว
  • Calibration: Calibrate ADC ก่อนใช้งานเพื่อความแม่นยำ
  • Application: สามารถใช้อ่าน temperature sensor, light sensor, ฯลฯ

การสื่อสาร UART

UART ใช้สำหรับสื่อสาร serial กับอุปกรณ์อื่นๆ เช่น คอมพิวเตอร์, Bluetooth module, หรือ sensor ที่ใช้ serial:

Code: UART Output

// CH32V006 UART Example
// ส่งข้อความผ่าน UART ที่ 115200 baud

#include "ch32v00x.h"
#include <stdio.h>

#define LED_PIN GPIO_Pin_1
#define LED_PORT GPIOC

// ฟังก์ชัน delay
void Delay(uint32_t ms) {
    while(ms--) {
        for(volatile uint32_t i = 0; i < 4800; i++);
    }
}

// ฟังก์ชันเริ่มต้นใช้งาน UART
void UART_Init_Custom(uint32_t baudrate) {
    // เปิด clock สำหรับ UART1 และ GPIOA
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    // ตั้งค่า TX pin (PA9)
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  // Alternate Function Push-Pull
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // ตั้งค่า RX pin (PA10)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // ตั้งค่า UART
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = baudrate;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);
    
    // เปิด UART
    USART_Cmd(USART1, ENABLE);
}

// ฟังก์ชันส่งข้อมูลผ่าน UART
void UART_SendByte(uint8_t data) {
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    USART_SendData(USART1, data);
}

// ฟังก์ชันส่ง string
void UART_SendString(const char* str) {
    while(*str) {
        UART_SendByte(*str++);
    }
}

// ฟังก์ชัน printf redirect
int fputc(int ch, FILE *f) {
    UART_SendByte((uint8_t)ch);
    return ch;
}

int main(void) {
    // เปิด clock สำหรับ GPIOC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    
    // ตั้งค่า LED pin
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &GPIO_InitStructure);
    
    // เริ่มต้นใช้งาน UART ที่ 115200 baud
    UART_Init_Custom(115200);
    
    // ส่งข้อความเริ่มต้น
    UART_SendString("\r\n=== CH32V006 UART Test ===\r\n");
    UART_SendString("RISC-V Microcontroller @ 48MHz\r\n");
    
    uint32_t counter = 0;
    
    // Main loop
    while(1) {
        // กระพริบ LED
        GPIO_SetBits(LED_PORT, LED_PIN);
        Delay(500);
        GPIO_ResetBits(LED_PORT, LED_PIN);
        Delay(500);
        
        // ส่งข้อความทุก 1 วินาที
        counter++;
        printf("Uptime: %lu seconds\r\n", counter);
    }
}

✅ การใช้งาน: เชื่อมต่อ UART-USB adapter กับ PA9 (TX) และ PA10 (RX) แล้วเปิด serial monitor บนคอมพิวเตอร์ที่ 115200 baud คุณจะเห็นข้อความ "Uptime: X seconds" ทุกๆ วินาที

ไอเดียโปรเจกต์ด้วย CH32V006

🌡️ IoT Temperature Logger

ใช้ DHT22 หรือ DS18B20 sensor วัดอุณหภูมิ และส่งข้อมูลผ่าน UART/USB ไปยังคอมพิวเตอร์เพื่อบันทึกข้อมูล

💡 Smart Light Controller

ควบคุมความสว่าง LED ด้วย potentiometer หรือ button พร้อม auto-off timer

🎮 Game Controller

สร้าง game controller ง่ายๆ ด้วย multiple buttons และส่งข้อมูลผ่าน UART/USB

📊 Battery Monitor

อ่านแรงดันแบตเตอรี่ด้วย voltage divider และแสดงผลด้วย LED bars

🔔 Door Alarm System

ใช้ magnetic reed switch ตรวจจับการเปิดประตู และส่งเสียงเตือนด้วย buzzer

📡 RF Remote Control

ใช้ RF module (433MHz) สร้าง remote control ง่ายๆ สำหรับเปิด/ปิดไฟ

การแก้ปัญหาที่พบบ่อย

❌ บอร์ดไม่ตรวจจับได้

  • • ตรวจสอบการต่อสาย WCH-LinkE (SWDIO, SWCLK, GND, 3V3)
  • • ตรวจสอบว่าได้ติดตั้ง driver อย่างถูกต้อง
  • • ลองเปลี่ยน USB port หรือสาย USB
  • • กดปุ่ม Reset บนบอร์ด

⚠️ Flash ไม่สำเร็จ

  • • ตรวจสอบว่าบอร์ดอยู่ในโหมด programming (ถ้ามี)
  • • ลดความเร็วในการ flash
  • • ตรวจสอบว่าไม่มีโปรแกรมอื่นใช้ port อยู่
  • • ลองตัดกระแสแล้วเริ่มใหม่

❓ LED ไม่ทำงาน

  • • ตรวจสอบว่าต่อ LED ถูกต้อง (anode/cathode)
  • • ต้องมีตัวต้านทานจำกัดกระแส (220Ω-1kΩ)
  • • ตรวจสอบ pin mapping ของบอร์ด
  • • ทดสอบด้วย multimeter ว่ามี output หรือไม่

🔧 ADC ให้ค่าผิดปกติ

  • • Calibrate ADC ก่อนใช้งาน
  • • ตรวจสอบว่า sensor ให้ output ในช่วง 0-3.3V (หรือ 0-5V)
  • • เพิ่ม capacitor (100nF) ข้าง input pin เพื่อกรอง noise
  • • อ่านค่าหลายครั้งแล้วเฉลี่ยเพื่อความแม่นยำ

แหล่งข้อมูลเพิ่มเติม

สรุป

CH32V006 เป็นไมโครคอนโทรลเลอร์ RISC-V ที่น่าสนใจอย่างยิ่งด้วยราคาที่เข้าถึงได้ ($2 สำหรับบอร์ดพัฒนา) คุณสมบัติที่ดีกว่า CH32V003 และความยืดหยุ่นในการใช้งานด้วยการรองรับทั้ง 3.3V และ 5V I/O ทำให้เหมาะสำหรับทั้งผู้เริ่มต้นที่ต้องการเรียนรู้ RISC-V architecture และนักพัฒนาที่ต้องการสร้างโปรเจกต์ IoT งบประหยัด

ด้วยหน่วยความจำ 32KB Flash, 4KB SRAM, 22 GPIO pins, ADC 12-bit, และ USB ที่ใช้งานได้จริง CH32V006 สามารถนำไปใช้สร้างโปรเจกต์ที่หลากหลาย ตั้งแต่ simple automation ไปจนถึง data logger และ IoT devices

🚀 เริ่มต้นใช้งาน CH32V006 วันนี้!

หากคุณกำลังมองหาไมโครคอนโทรลเลอร์ RISC-V ที่ราคาเข้าถึงได้ แต่มาพร้อมกับคุณสมบัติครบครัน CH32V006 เป็นตัวเลือกที่น่าสนใจอย่างยิ่ง ลองสร้างโปรเจกต์แรกของคุณและสำรวจความสามารถของ RISC-V ได้เลย!

บทความที่เกี่ยวข้อง

© 2026 CynoIoT Platform. All rights reserved.

Built with ❤️ for IoT enthusiasts and makers.