サポートページ
主な特徴は以下の通りです。
- 安い
- 電源が3~5Vで動作
- RAM 2kB、Code FLASH 16kBと小さい
- STM32系を模したPeripheralで、機能も豊富
- Timer、GPIO、UART、I2C、SPI、ADC、PWM、DMA、WDTなど
- USBで書き込みが可能
CH32V003開発ガイドブック-Arduino抜粋版
本書掲載サンプルコード
シリアル通信
Arduinoで開発しようとすると、USB接続してもシリアル通信が使えません。
開発途中でマイコンの状況を見たいと思ってもシリアルモニターに出力できません。
これは不便なので、別途にシリアル通信できるようにしました。

void setup() {
Serial.begin(115200);
Serial.println("LED: ON");
RX、TX、GNDを接続したらいつものようにシリアルモニターが利用できます。
赤外線リモコン
赤外線リモコンでLEDのON/OFFできるものをAIにお願いしてプログラムしてもらいました。
便利というか考える機能が衰えますねw
赤マーカーは、利用するリモコンによって変更してください。

#include <Arduino.h>
const int IR_PIN = 3; // 赤外線センサー
const int LED_PIN = 2; // LEDピン
void setup() {
Serial.begin(115200);
pinMode(IR_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // 初期状態は消灯
Serial.println("IR Control Ready: 0xFF7A85->ON / 0xFF52AD->OFF");
}
uint32_t countState(int state) {
uint32_t count = 0;
while (digitalRead(IR_PIN) == state) {
asm("nop");
count++;
if (count > 2000000) return 0;
}
return count;
}
void loop() {
if (digitalRead(IR_PIN) == LOW) {
// 1. キャリブレーション(リーダー部計測)
countState(LOW);
uint32_t leaderHigh = countState(HIGH);
if (leaderHigh == 0) return;
uint32_t threshold = leaderHigh / 3;
uint32_t result = 0;
int bitCount = 0;
// 2. 32bitデコード
for (int i = 0; i < 32; i++) {
if (countState(LOW) == 0) break;
uint32_t offCount = countState(HIGH);
if (offCount == 0) break;
result <<= 1;
if (offCount > threshold) {
result |= 1;
}
bitCount++;
}
// 3. 判定とアクション
if (bitCount >= 32) {
Serial.print("Received HEX: 0x");
Serial.println(result, HEX);
if (result == 0xFF7A85) {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED: ON");
}
else if (result == 0xFF52AD) {
digitalWrite(LED_PIN, LOW);
Serial.println("LED: OFF");
}
}
delay(500); // 連続動作防止
}
}
