290円マイコン基板 UIAPduino Pro Micro CH32V003

290円マイコン基板 UIAPduino Pro Micro CH32V003

2026年4月20日

サポートページ

主な特徴は以下の通りです。

  • 安い
  • 電源が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); // 連続動作防止
  }
}