📑 เนื้อหาในบทความ
คำนำ
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 รุ่นก่อนหน้า:
| คุณสมบัติ | CH32V003 | CH32V006 | ข้อดี |
|---|---|---|---|
| Flash Memory | 16KB | 32KB ⬆️ | พื้นที่โปรแกรมเพิ่ม 2 เท่า |
| SRAM | 2KB | 4KB ⬆️ | RAM เพิ่ม 2 เท่า |
| GPIO Pins | 16 pins | 22 pins ⬆️ | เชื่อมต่ออุปกรณ์ได้มากขึ้น |
| I/O Voltage | 5V only | 3.3V/5V ⬆️ | ยืดหยุ่นกว่ามาก |
| USB Connector | Micro-USB | USB-C ⬆️ | ทันสมัยและใช้งานง่าย |
| ADC Channels | 7 channels | 9 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ดาวน์โหลด WCH-LinkE Utility
ดาวน์โหลดจากเว็บไซต์ WCH หรือ GitHub repository ของ WeAct Studio โปรแกรมนี้ใช้สำหรับ flash firmware ลง CH32V006
- 2ติดตั้ง Driver
ติดตั้ง USB driver สำหรับ WCH-LinkE programmer ตามคู่มือที่แนบมากับโปรแกรม
- 3ติดตั้ง Toolchain
ดาวน์โหลดและติดตั้ง RISC-V toolchain จาก WCH หรือใช้ open-source toolchain เช่น CH32Fun สำหรับ Linux
- 4ติดตั้ง IDE (Optional)
คุณสามารถใช้ VS Code, PlatformIO, หรือ MounRiver Studio (IDE อย่างเป็นทางการจาก WCH)
สำหรับ Linux
- 1ติดตั้ง CH32Fun
git clone https://github.com/cnlohr/ch32fun.git cd ch32fun make installCH32Fun เป็น open-source toolchain สำหรับ CH32V003/006 ที่ใช้งานได้ดีบน Linux
- 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-LinkE | CH32V006 | หมายเหตุ |
|---|---|---|
| 3V3 | 3.3V | Power supply |
| GND | GND | Ground |
| SWDIO | PA13 / SWDIO | Data line |
| SWCLK | PA14 / SWCLK | Clock 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
- • อ่านค่าหลายครั้งแล้วเฉลี่ยเพื่อความแม่นยำ
แหล่งข้อมูลเพิ่มเติม
📚 Official Resources
🛠️ Tools & Libraries
สรุป
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 ได้เลย!