$2 IoT ボタン→LED プロジェクト — CH32V003 (UIAPduino Pro Micro) を USB HID デバイスとして、押しボタンと LED を MQTT でつなぐ。
┌──────────────────────────────────────────────────────────┐
│ CH32V003 (UIAPduino Pro Micro) │
│ │
│ ┌──────┐ ┌───────────────┐ │
│ │ SW1 │───→│ main.c │──→ USB HID (feature report)│
│ │ NRST │ │ RSTSCKR[27] │ Byte[0]=ReportID(0xAA) │
│ │reset │ │ detect@boot │ Byte[1]=btn_event │
│ └──────┘ │ │ Byte[2]=led_state │
│ │ │←── USB HID set_feature │
│ ┌──────┐ │ │ Byte[3]=led_cmd │
│ │ LED │←───│ GPIO output │ │
│ │ PD4 │ │ OnBoard LED │ │
│ └──────┘ └───────────────┘ │
└──────────────────────────────────────────────────────────┘
│ ▲
HID get│ │HID set
feature│ │feature
report │ │report
▼ │
┌──────────────────────────────────────────────────────────┐
│ Python Bridge (host/bridge.py) │
│ │
│ hidapi ─→ read btn_state ─→ MQTT pub "uiap/btn" │
│ hidapi ←─ write led_cmd ←─ MQTT sub "uiap/led" │
│ │
│ $ mosquitto_pub -t uiap/led -m 1 → LED ON │
│ $ mosquitto_pub -t uiap/led -m 0 → LED OFF │
│ $ mosquitto_sub -t uiap/btn ← ボタン状態 │
└──────────────────────────────────────────────────────────┘
| 方向 | 経路 | 内容 |
|---|---|---|
| センサー (Sub) | BTN → CH32V003 → HID → bridge → MQTT uiap/btn |
ボタン押下状態 |
| アクチュエーター (Pub) | MQTT uiap/led → bridge → HID → CH32V003 → LED |
LED ON/OFF |
追加部品は不要。基板実装のリセットスイッチ (SW1 = NRST) をボタン入力として使う:
UIAPduino Pro Micro CH32V003
┌─────────────────────────┐
│ │
│ SW1 (NRST) ─── 内蔵 SW │ ← 押すとチップリセット
│ PD4 (LED) ─── 内蔵 LED │ ← オンボード
│ USB Type-C ─── 内蔵 │
└─────────────────────────┘
- ボタン押下 = NRST に LOW → チップリセット → 起動時に RSTSCKR.NRSTRSTF を検出
- USB HID 接続のみ必要(シリアル不要)
uiap-sensor-hid/
├── firmware/
│ ├── src/main.c # ファームウェア (btn → HID → LED)
│ ├── usb_config.h # USB HID descriptor
│ ├── funconfig.h # ch32fun 設定
│ └── Makefile # make 一発
├── host/
│ ├── bridge.py # Python HID ↔ MQTT ブリッジ
│ └── requirements.txt # hidapi, paho-mqtt
├── arch.md # 構成図 (これ)
├── README.md
└── KANBAN.md
# firmware
git clone https://github.com/cnlohr/rv003usb.git
cd firmware
make RV003USB_PATH=../rv003usb
minichlink -w firmware.bin # 書き込み待機モードで
# host
cd host
pip install -r requirements.txt
python bridge.py
# 別ターミナルで制御
mosquitto_pub -h broker.hivemq.com -t uiap/led -m 1 # LED ON
mosquitto_pub -h broker.hivemq.com -t uiap/led -m 0 # LED OFF
mosquitto_sub -h broker.hivemq.com -t uiap/btn # ボタン監視MIT — based on rv003usb by cnlohr