「Rubyで電子工作をやってみたい」——そう思っても、
高価なボード、複雑なセットアップ、専用ソフト…
とハードルを感じていませんか?
UIAPruby は、そのハードルをぐっと下げます。
数百円のマイコン UIAPduino(CH32V003ベース)と、
手持ちのChrome/Edgeブラウザだけ。
普段書いているRubyの文法でLEDを光らせ、ブザーを鳴らし、ボタンで制御できます。
ブラウザ内の @ruby/prism でコードを解析し、
独自の軽量バイトコード(.uap)に変換。
WebHIDでSDカードへ直接転送し、マイコン上のTinyVMが実行します。
インストール不要・クラウド不要。すべてブラウザの中で完結。
Rubyist が電子工作へ踏み出す入口を、
Wakayama.rb
が作りました。
🔧 必要なハードウェア
- UIAPduino SD版(CH32V003、v1.2.3以降推奨)
- MicroSDカード(FAT32フォーマット)
- USBケーブル(Micro-B または Type-C)
- LED / タクトスイッチ / ブザーなど(実験用)
💻 必要なソフトウェア
- Google Chrome または Microsoft Edge(最新版)
- このページ — WebHID対応ブラウザのみ動作
- Arduino IDE(スケッチ初回書き込み時のみ)
- UIAP_HID ボードパッケージ v1.2.3以降
⚡ クイックスタート(4ステップ)
-
1
UIAPrubyRunner スケッチを書き込む(初回のみ)
下の「9. UIAPduino スケッチ」からコードをコピー/ダウンロードして、 Arduino IDEでUIAPduinoに書き込みます。
FQBN:UIAP_HID:ch32v:CH32V003:pnum=V14,usb=webhid,opt=oslto -
2
Rubyコードを書く
エディタにRubyコードを入力します。サンプルボタンですぐ試せます。
例:led = GPIO.new(2, GPIO::OUT)→ D2ピンをLED出力に設定
loop do led.toggle; sleep(0.5); end→ 0.5秒ごとに点滅 -
3
「コンパイル」ボタンを押す
ブラウザ内でRubyコードをAST解析し、TinyVM用.uapバイトコードへ変換します。
✓ OK と表示されれば生成完了です。 命令数・サイズ・推定実行時間も確認できます。 -
4
デバイスに接続 → SDカードに送信 → RUN
USBケーブルでUIAPduinoを接続し「デバイスに接続」をクリック。 「📤 SDカードに送信」でSCRIPT.UAPを転送し、 「▶ RUN」で実行開始。Device Logに実行状況が表示されます。
💡 ファイル名をSCRIPT.UAPにしておくと、次回以降はUSB接続しなくても 電源投入と同時に自動実行されます。単体動作させる際に便利です。
UIAPduino SD 版 対応ピン一覧
| Arduinoピン番号 | CH32V003ポート | PWM | ADC | 用途・備考 | UIAPruby記法 |
|---|---|---|---|---|---|
| 2 | PC0 | ✅ | — | LED出力(基板上LED) | GPIO.new(2, GPIO::OUT) |
| 3 | PC1 | — | — | SDA (I2C — 未対応) / HC-SR04 TRIG | Ultrasonic.new(3, 4) |
| 4 | PC2 | — | — | SCL (I2C — 未対応) / HC-SR04 ECHO | Ultrasonic.new(3, 4) |
| 5 | PC3 | ✅ | — | PWMブザー(圧電ブザー推奨) | PWM.new(5) |
| 11 | PD1 | — | — | タクトスイッチ(PULL_UP使用) | GPIO.new(11, GPIO::IN | GPIO::PULL_UP) |
| 0, 1, 12, 15, 16 | PA1/PA2/PD2/PD5/PD6 | — | ✅ | アナログ入力(ADC対応ピン) | ADC.new(0) 〜 |
| 6 | PC4 | ✅* | ✅* | ⚠ SDカード SS専用 — 使用不可 | — |
| 7 / 8 / 9 | PC5 / PC6 / PC7 | — | — | ⚠ SDカード SCK/MOSI/MISO専用 — 使用不可 | — |
ピン6はPWM・ADC対応ですが、SDカード搭載版では使用不可です(* 印)。
UIAPruby v1 — Ruby構文を @ruby/prism でAST解析し、UIAPduino TinyVM用 UAP1 バイトコードへ変換します。
UIAPduino 上では Ruby VM を実行しません。
require "name" または require_relative "name" で読み込めます。
⚠ D7(SCK) D8(MOSI) D9(MISO) D6(SS) は SD カード SPI 専用のため GPIO に使用できません。
USB 接続・RUN ボタン操作なしで単体動作するので、完成したスクリプトの運用に便利です。
ファイルヘッダー(8 バイト)
TinyVM 命令セット v1(リトルエンディアン)
レジスタ R0–R3 は int32_t。Q16.8 固定小数: 1.0=256, 0.5=128。
GPIO / PWM
| Ruby 記法 | 変換後命令 | Phase |
|---|---|---|
led = GPIO.new(2, GPIO::OUT) | GPIO_MODE pin=2 OUTPUT | 1 |
button = GPIO.new(11, GPIO::IN | GPIO::PULL_UP) | GPIO_MODE pin=9 INPUT_PULLUP | 1 |
led.on / led.high / led.write(1) | GPIO_WRITE pin, 1 | 1 |
led.off / led.low / led.write(0) | GPIO_WRITE pin, 0 | 1 |
led.toggle | GPIO_TOGGLE pin | 1 |
buzzer = PWM.new(5) | GPIO_MODE pin=5 OUTPUT | 1 |
buzzer.frequency(440) | PWM_FREQ pin, 440 | 1 |
buzzer.off / buzzer.frequency(0) | PWM_FREQ pin, 0 | 1 |
buzzer.tone(440, 0.2) | PWM_FREQ 440 → WAIT_MS 200 → PWM_FREQ 0 | 1 |
button.low? / button.high? | GPIO_READ pin, R0 + JNZ/JZ | 2 |
sleep(0.2) / wait_ms(200) | WAIT_MS 200 | 1 |
print / puts / p / putc | PRINT_STR | 3 |
raise "msg" / raise unless cond | PRINT_STR + HALT | 4 |
def name … end | インライン展開 | 5 |
break / next | JMP loop_end / loop_start | 6 |
g = 0.1 * 0.5 / Q16.8 演算 | LOAD_Q16 + MUL_Q16 … | 7 |
require_relative "path" | compile-time include | 8 |
sensor = ADC.new(0) ピン: 0,1,12,15,16 | — (初期化なし) | ADC |
puts sensor.read / print sensor.read | ADC_READ pin,R0 + PRINT_REG | ADC |
sonar = Ultrasonic.new(3, 4) 任意のGPIOピン | GPIO_MODE trig OUT + GPIO_MODE echo IN | US |
puts sonar.read / print sonar.read | ULTRASONIC_READ trig,echo,R0 + PRINT_REG | US |
FQBN: UIAP_HID:ch32v:CH32V003:pnum=V14,usb=webhid,opt=oslto