USB PD電源から特定の電圧を出力できて、ブレッドボードにさせるアダプタを作った

USB PD Exporer

tl;dr

  • USB PD 仕様の電源に対して、CC ラインで通信することで、特定の電圧を出力刺せることができるよ
  • USB PD の電力利用(Sink)側用の IC がいくつか出ているよ。WCH からの CH224 が出ていて、設定を変えればできるよ。
  • 逆電防止や、スイッチ機能に、Pch-MOSFET を付加したよ。この辺りは、じがへるつさんの『Type-C 電子工作クックブック』を参考にしたよ。

時々欲しい 9V、それは USB PD 電源にあるのに

電子工作で遊んでいると、5V は USB から簡単に取り出すことができますが、時々 9V が欲しいシーンがあります。9V は、USB PD 電源では CC ラインにて電源通信すること供給することができます。USB PD IC を使って簡単に取り出すことができたら便利だなと思っていました。

それは USB PD トリガーケーブルと呼ばれて、既に多くが商品化されています。

じがへるつさんの『Type-C 電子工作クックブック』にて、USB 電源の利用(Sink)側のコントローラ IC を利用して、電圧を取り出す解説がありました。せっかくなので、これをトライしてみたく、コントローラ IC を入手して作ってみようと思いました。

booth.pm

USB PD Sink コントローラとして CH224 を使う

私のブログに高頻度に登場している WCH 社ですが、こちらから USB PD Sink コントローラ IC、CH224 が出ていることを見つけました。秋月電子通商でも購入することができます。1 個 100 円です。

akizukidenshi.com

Aliexpress 上の WCH の公式ショップでも USD 11.97/20pcs で購入することができます。

20Pcs/Lot CH224 USB PD Sink Support 4V~22V OVA OTA - AliExpress

https://www.aliexpress.com/item/1005004331079912.html

ピンアウトは以下の通りです。

CH224Kピンアウト(データシートより)

CFG1-3 を特定の値にすることで、出力電圧を制御できます。

出力電圧(データシートより)

この CFG1-3 の設定には、はんだごてで設定するジャンパをつけておきました。後で切り替えられるようにスイッチにすることもできますが、スペースを節約したいのと、必要な電圧の種類だけ数生産したり、はんだごてを使えば良いと思い、そのようにしました。

逆電流防止と、ロードスイッチに、Pch-MOSFET を付加する

逆電防止にはダイオードをつければ良いですが、じがへるつさんの『Type-C 電子工作クックブック』にて、Pch MOSFET を利用して同時にロードスイッチとする解説がありました。これを取り入れてみたいと思いました。

CH224 は、期待の電圧になったかどうかを示す Power Good 機能があります。PG ピンが Low になったときが、期待の電圧が得られている状態になります。よって、この PG を流せば Pch MOSFET で作ったロードスイッチに流せば、目的の電圧になるまで、ダウンストリームには供給されなくなります。

これに加えて、ロッキングスイッチを使い、ダウンストリームへの供給を制御できるようにしました。

ロッキングスイッチとロードスイッチの回路図

ロッキングスイッチ

出力インターフェイス

任意のプラグを接続しやすいユーロブロックと、DC ジャックを用意しました。これで任意のデバイスに電圧を供給できます。

なるべく VDD と GND をを太くする

配線にあたっては、VDD を太くしたいと思いました。そもそも利用している USB ソケットが VDD 2A なので、それ以上は流せません。

2A を流すための配線幅を調べると 1mm と出てきました。多くの所はベタで 1mm 以上確保しつつ、1mm で配線するようにしました。

2A 流すために、ビア径を調べると、0.8mm で 1.2A の記述を見つけました。0.8mm のビアを 4 つつけておきました。

回路図、KiCad ファイルは GitHub にて公開中

制作した KiCad ファイルおよび、回路図は GitHub にて公開しています。チップ抵抗と、USB ソケット以外は、秋月でも手に入るものを利用しています。

github.com

回路図(Kicanvas)

https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2F74th%2Fusb-pd-exporter%2Fblob%2F1.0.1%2Fusb_pd_exporter.kicad_sch

Booth にてキットとして販売中

こちらはキットとして Booth にて販売を開始しました。

74th.booth.pm

一方

そろそろ安定化電源を買う頃合いかもしれない。。。

ch32v003funでCH32V003を便利に開発している話

tl;dr

  • ch32v003fun は、コミュニティの CH32V003 用の開発ライブラリ、および開発環境だよ。
  • 開発ライブラリと言っても、基本的にリファレンスマニュアル見ながらレジスタを操作するもので、各ペリフェラルを使いやすくするようなものではないよ。
  • でも examples が豊富で、やりたいことの example があればコピペで動かすことができるよ。
  • GPIO、NeoPixel用のライブラリもあるよ。
  • WCH-LinkE の SWDIO 経由でプリントデバッグできるのが割と便利だよ。

CH32V003 とは

CH32V は STM32 のペリフェラルRISC-V に移植したような MCU です。CH32V003 はその中でも 40 円から買えて安い上に、GPIO x18、ADC x8ch、Timer x4、UART、I2C、SPI など豊富なペリフェラルがあります。5V 電源でも使えるため、100n、1u の 2 つのコンデンサを組み込めば動いているように思っています。

akizukidenshi.com

私は Aliexpress 上の公式ショップで、50pcs 単位で購入しています。すると送料が USB 5 ほどかかりますが、1 個あたり USB 0.1~0.12 くらいになります。

50Pcs/Lot CH32V003 Industrial-grade MCU, RISC-V2A, Single-wire Serial Debug Interface, System Frequency 48MHz - AliExpress

https://www.aliexpress.com/item/1005005036714708.html

私にとっては、制御したいならとりあえず組み込んどけ、といえるマイコンになっています。既にいかに組み込んだことを記事にしました。

74th.hateblo.jp

74th.hateblo.jp

ch32v003fun とは

CH32V003 の開発環境、ライブラリには、現在 3 種類あります。

公式 SDK は、開発環境に MountReverStudio を使う必要があり、さらに容量が大きいため、16kB しかない CH32V003 には少し辛いです。Arduino はまだサポートされているペリフェラルが少ないです。

一方 ch32v003fun は、コミュニティでメンテナンスされている開発ライブラリ、開発環境です。以前の記事でも紹介しましたが、改めて書くと以下となります。

  • 基本的にマクロで実装されているため、プログラムの容量のオーバーヘッドが少ない。
  • ペリフェラルを抽象化するようなものではなく、直接レジスタを操作することが基本である。
  • ビルドするための Makefile、WCH-LinkE 経由で書き込むためのプログラム(minichlink)も提供されている。
  • 直接レジスタを操作する実装例が多く、ペリフェラルの操作自体はコピペで動くことが多い。
  • SWDIO 経由で print デバッグができたり、デバッグ実行できたり、開発を便利にする機能が用意されている。

つまり、MCU のリファレンスマニュアルから使い方を覚えて操作する、というのが基本です。リファレンスマニュアルは以下からダウンロードできます。

CH32V003リファレンスマニュアル

www.wch-ic.com

開発の始め方

ch32v003fun のための gcc などのツールチェインの準備方法はリポジトリwiki を参照してください。

https://github.com/cnlohr/ch32v003fun/wiki/Installation

WCH-LinkE を通して書き込むためのプログラム minichlink は、ch32v003fun リポジトリ内の minichlink ディレクトリでmakeこまんどを実行することで作成されます。

まず、ch32v003fun リポジトリ内にあるライブラリのディレクトリ(ch32v003fun)をワークスペースにコピーしてきます。

さらに Ch32v003fun リポジトリ内の examples/template の中身をコピーしてきます。

template.c、template.h のファイル名を作りたいプログラム名(例えば usb_rebooter.c)に変更します。

Makefile を編集します。

  • TARGET にプログラム名に変更する
  • CH32V003FUN を、ch32v003fun のコピーしたライブラリのディレクトリを指定する
  • MINICHLINK にビルドした minichlink のパスを指定する(私の場合は、PATH の通ったところにコピー済み)
  • includeをコピーした ch32v003fun 内の ch32v003fun.mk に変更する

変更前

all : flash

TARGET:=template
CH32V003FUN:=../../ch32v003fun

include ../../ch32v003fun/ch32v003fun.mk

flash : cv_flash
clean : cv_clean

変更後

all : flash

CH32V003FUN=./ch32v003fun
MINICHLINK=minichlink
TARGET:=usb_rebooter

include ./ch32v003fun/ch32v003fun.mk

flash : cv_flash
clean : cv_clean

なお、コードの作成を ch32v003fun の examples ディレクトリ内に新しくディレクトリを作って行った場合、TARGET だけを書き換えれば良いです。

これで、コマンドmakeを実行すると、プログラム名の bin ファイル(ファームウェアイメージ)が作成され、さらに minichlink を使って書き込みまで行われます。

ch32v003fun でいつも最初にすること

SystemInit()関数を呼ぶ

まず ch32v003fun の SystemInit()関数を呼びます。template ディレクトリをコピーしたのであれば、既に実装されていると思います。ここでは主にメインクロックの設定がされています。

#include "ch32v003fun.h"
#include <stdio.h>

int main()
{
    SystemInit();
}

ペリフェラルを有効にする

次に、各ペリフェラルへのクロックの設定を行います。CH32V003 等のマイコンでは、ペリフェラル毎にクロックを接続するか否かを設定して、使わないペリフェラルへのクロックを提供しないことで電力を節約しています。

この設定はRCC->APB1PCENRRCC->APB2PCENRに行います。examples にあるコードの最初の方に、RCC->APB2PCENR |= ...という行が含まれていると思いますが、それです。

I2C など利用したいペリフェラルの examples のコードを見てみて、そのコードをコピーして使うと良いです。

私が I2C と GPIOA、C、D を利用したい時には、以下のようにしていました。基本的に examples からコピーしています。

#include "ch32v003fun.h"
#include <stdio.h>

void init_rcc(void)
{
    RCC->APB2PCENR |= RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD;
    RCC->APB1PCENR |= RCC_APB1Periph_I2C1;
}

int main()
{
    SystemInit();
    init_rcc();
}

ペリフェラルの初期化をする

GPIO を含むペリフェラルの利用には、設定と、有効化が必要です。これらはレジスタに対して行います。

examples には、そのコード例が多く載っています。例えば、GPIO D0 をアウトプットにしたい場合、以下ようなコードをコピペします。

// GPIO D0 Push-Pull
GPIOD->CFGLR &= ~(0xf<<(4*0));
GPIOD->CFGLR |= (GPIO_Speed_10MHz | GPIO_CNF_OUT_PP)<<(4*0);

上記にある GPIO->CFGLR などの仕様はリファレンスマニュアルを見るほかありません。

しかし、利用したいペリフェラルのサンプルが examples にあるならばそれをコピーしてこれば動くようになります。実際に動いたコードであるため、動く間に必要な設定が足りていないということがないのがありがたいです。さらに、コード中には多くのコメントが残されており、そこで何をしようとしているのか読み解きやすくなっています。

くわえて、レジスタを直接操作しているため、ch32v003fun のアップデートで使えなくなることが基本的にないといえるのもありがたいです。

以上が初期化で、あとは処理の実装

以上初期化の部分を説明してきました。

その後の GPIO などの操作も、レジスタを操作することを基本としているため、リファレンスマニュアルを読んで、examples から動くコードを理解して、機能を実装していきます。

最初は抽象化されていないので扱いにくく感じますが、処理自体は高速ですし、リファレンスマニュアル以上のブラックボックスはないので、気に入っています。

というか、公式 SDK のサンプルプログラムが若干質が低い(動かないことがあるし、PR を受け付ける体制ではなさそう)のに比べると、多くの人が触っているため安心感があり、これで良いなーと感じています。

ch32v003fun のよいところとして、printf で出力した内容を WCH-LinkE の SWDIO を通して見ることができる機能が含まれています。これはデフォルトで有効になっており、WCH-LinkE を接続の上、以下のコマンドで表示することができます。

minichlink -T

SOP-8 の CH32V003J4M6 では UART TX と SWDIO のピンが共通のため、UART TX でプリントデバッグしようとすると SWDIO で書き込めなくなる罠があるなか、SWDIO1 つでプリントデバッグできるのはありがたいですね。

なお、UART TX で printf で出力することもできるように funconfig.h を設定することもできます。

ch32v003fun の便利ライブラリ

ch32v003fun にはいくつかの便利なライブラリが含まれています。あくまで、ch32v003fun 本体ではなく、extralibs という位置づけです。

GPIO の操作

GPIO の初期化と、read、write を簡単にできるようにするライブラリがあります。

https://github.com/cnlohr/ch32v003fun/blob/master/extralibs/ch32v003_GPIO_branchless.h

このヘッダーファイルを ch32v003fun の中に入れておきます。

GPIO の初期化は以下のように記述できるようになります。

#include "ch32v003_GPIO_branchless.h"

#define LED_PIN GPIOv_from_PORT_PIN(GPIO_port_D, 4)
#define SELECT_U1_PIN GPIOv_from_PORT_PIN(GPIO_port_A, 1)
#define SELECT_U2_PIN GPIOv_from_PORT_PIN(GPIO_port_A, 2)
#define SELECT_U3_PIN GPIOv_from_PORT_PIN(GPIO_port_D, 0)
#define SELECT_U4_PIN GPIOv_from_PORT_PIN(GPIO_port_C, 0)
#define BTN1_PIN GPIOv_from_PORT_PIN(GPIO_port_D, 2)
#define BTN2_PIN GPIOv_from_PORT_PIN(GPIO_port_C, 7)
#define BTN3_PIN GPIOv_from_PORT_PIN(GPIO_port_C, 6)
#define BTN4_PIN GPIOv_from_PORT_PIN(GPIO_port_C, 5)

void init_gpio()
{
    // 各GPIOの有効化
    GPIO_port_enable(GPIO_port_A);
    GPIO_port_enable(GPIO_port_C);
    GPIO_port_enable(GPIO_port_D);
    // 各ピンの設定
    GPIO_pinMode(LED_PIN, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
    GPIO_pinMode(SELECT_U1_PIN, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
    GPIO_pinMode(SELECT_U2_PIN, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
    GPIO_pinMode(SELECT_U3_PIN, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
    GPIO_pinMode(SELECT_U4_PIN, GPIO_pinMode_O_pushPull, GPIO_Speed_10MHz);
    GPIO_pinMode(BTN1_PIN, GPIO_pinMode_I_pullDown, GPIO_Speed_10MHz);
    GPIO_pinMode(BTN2_PIN, GPIO_pinMode_I_pullDown, GPIO_Speed_10MHz);
    GPIO_pinMode(BTN3_PIN, GPIO_pinMode_I_pullDown, GPIO_Speed_10MHz);
    GPIO_pinMode(BTN4_PIN, GPIO_pinMode_I_pullDown, GPIO_Speed_10MHz);
}

そして、操作するコードは以下のようになります。

if (GPIO_digitalRead(BTN1_PIN) == high)
{
    GPIO_digitalWrite(SELECT_U1_PIN, high);
    GPIO_digitalWrite(SELECT_U2_PIN, low);
    GPIO_digitalWrite(SELECT_U3_PIN, low);
    GPIO_digitalWrite(SELECT_U4_PIN, low);
}

レジスタを扱わずに、Arduino と名称を同じようにしているため、簡単に操作できるようになります。

ただし、この関数自体は、関数ではなくマクロで実装されています。そのため、引数に変数を入れようとすると動かなかったりしますので、注意が必要です。

NeoPixel、WS2812B の点灯

NeoPixel は SPI を使うと簡単に制御できることが知られています。そのための、SPI および DMA の設定をまとめてあるのが、以下のヘッダーファイルになります。

https://github.com/cnlohr/ch32v003fun/blob/master/extralibs/ws2812b_dma_spi_led_driver.h

使い方は、example を参照してください。

https://github.com/cnlohr/ch32v003fun/tree/8b05efb3d8254084cc1eabf40d54b32319cf1219/examples/ws2812bdemo

ちなみに、私の場合は CPU を 100%使ってやってしまえば良いと思い、以下のようなコードを利用して WS2812B を点灯させています。

https://github.com/74th/relay-switch-usbhub/blob/main/main-firmware/gpio_neopixel.h

funconfig.h は何に使う?

ch32v003fun に設定を施すためのファイル funconfig.h があります。しかし、基本的にいじる必要はありません。私の場合は、以下のケースで利用しています。

  • UART TX を printf の出力にしたい
  • 内蔵発振器のクロックを下げて、電力を節約したい

私は主に UART TX で printf で出力するために使っていましたが、SWDIO 経由でできることがわかり、あまり使わなくなりました。

使いにくいですが、使いやすくて使っています!

抽象化されておらずレジスタを直接取り扱うのは、やることが多く難しいです。 ですが、一切のミドルレイヤを挟まないため、リファレンスマニュアルだけを頼りにすればよく、CH32v003 だけを使うのであれば十分なように見えます。

そして、実際に動かすことができたコードが examples に集まっているため、まず動くコードを見てから自分でできることを確認しつつ実装していく、マイコン開発にはちょうど良いように感じています。

今後、CH32V003 開発を Rust や TinyGo 等で実装したくなったとしても、最終的にはレジスタ操作をすることには変わらないので、レジスタの使い方を ch32v003fun から学ぶことにもなりそうです。

CH32V003 を使ったキットを販売中

CH32V003をProMicro化した開発ボードをboothで販売しています。

74th.booth.pm

また、Relay Switch USB 2.0 Hubには、リレーの制御と、リモート操作盤の制御にCH32V003を使っています。

74th.booth.pm

Relayを使って、USB切り替え機能付きUSB Hubを安価に作った

tl;dr

  • CH334を使うと、レギュレータなしの5V電源と、数個のコンデンサだけで、USB 2.0 Hubを作ることができるよ。
  • USBの切り替え機能もつけたくて、リレーを使ってDM/DPを繋ぎ替えてみたけれど、動いたよ。本来は、USB切り替えICを使うべきだよ。
  • リレーの制御にはCH32V003を使ったよ。5V電源を使うと、GPIOも5Vが出るので、5Vリレーを制御するのに便利だったよ。
  • ディスプレイの裏にUSB Hubをおきつつ、ディスプレイの上に操作盤を置きたくて、CH32V003同士をGroveケーブルで繋いで、I2Cで通信する構成にしたよ

課題感

それまでは市販の2ホスト切り替え機能付きUSB 3.0 Hubを使っていました。主に自作PCとMacBookProにおいて、キーボード、マウス、トラックパッドの接続を切り替えるために使っていました。しかし、課題がありました。

  • SBC(OrangePi+、VisionFive2)など、3つ目の接続が必要になることがあり、そのたびにUSBを接続し直すのが面倒だった。
  • ボタンが装置にしか付いておらず、ケーブルがたくさん刺さった装置を手の届く位置に置く必要があった。
  • LEDでどちらのホストが有効か表示できるが、同じ色のLEDのため、装置に書かれている文字を読まないと、どちらに繋がっているかわからなかった。
  • USB 3.0に対応しているが、メインはキーボード、マウス、トラックパッドの切り替えであり、2.0 どころか 1.0 でほとんど動作していた。
  • USB Type-Aプラグが付いており、USB Type-Cが使えないのが、若干不満だった。

このために、装置のスイッチ部分の配線に改造を加えてディスプレイの端からアクセスできるようにしたり、LEDを取り替えて色を変えて使いやすいようにしていました。

しかし、3つのデバイスを切り替えたいシーンだけはどうすることもできませんでした。

USB 2.0 Hub ならば作れるのか試してみたかった

USB 2.0 Hub ならば、安価にICが出回っていることを知りました。

FE1.1sというもので、LCSCや、aitendo、Aliexpressで購入することができます。

www.lcsc.com

インターネット上でもいくつかアマチュアの作例を見つけることができます。ただ、若干データシートが簡素で不安を覚えました。

12MbpsのUSB 1.0ならば自作キーボードやマイコン開発ボードで作っていたため、問題なく作れると思っています。ただし、USB 2.0は480Mbpsもあり、DM/DPの作動回路をきちんと作らないと通信できなさそうに見えました。しかし、ものは試しと作ってみることにしました。

WCH の USB HubコントローラICである CH334 を使う

また、RISC-VマイコンCH32Vシリーズや、USBシリアル変換ICのCH340などでよく使っているWCHからも、USB 2.0 HubコントローラICが出ているのを見つけました。Aliexpressでも購入することができます。

www.wch-ic.com

CH334 industrial grade 4 port USB2.0 high-speed HUB controller 10Pcs/lot - AliExpress

https://www.aliexpress.com/item/1005005274221376.html

価格もCH334Rが10個 USD 4.83 (送料込み)と高くはありません。

CH334はレギュレータも付属しており、5Vを供給して、数個のコンデンサをつければ動くようです。

CH334のデータシートには、なんと周辺回路の回路図まで載っています。これに従って作ってみれば、とりあえず動くものが実現できそうに思えました。

CH334データシートより

USBホストの切り替えにリレーを使ってみる

USBホストの切り替えはどうすれば良いのか調べてみると、アマチュアの作例を以下の3つを見つけました。

  • カニカルリレーを使う
  • アナログスイッチIC(74HC4066)を使う
  • USB信号専用の切り替えICを使う

ネットで検索すると、アマチュアの作例で、メカニカルリレーを使った例、アナログスイッチICを使った例が見つかります。

Stackoverflowで、どのような接続をしたら良いか質問しているページを見つけました。そこでの指摘は、USB信号専用の切り替えICを使うべき、というものでした。

USB信号専用の切り替えICで安価なものは、2ポート切り替えのものが多いことがわかりました。4 ポートにしたいがために、高価はIC使うならば、完成品買った方が良いかと思い、トライしてみたいとは思いませんでした。

www.mouser.jp

そのため、動かなかったらそれでいいやと思いつつ、メカニカルリレーを使った方式を試しに作ってみることにしました。

リレーには2回路入っていて、秋月で買える5Vの941H-2C-5Dを使うことにしました。

akizukidenshi.com

USBデバイス、USBホストのポートの電源保護にCH214K、CH217Kを使う

CH334のデータシートの作例には、USBデバイスポートの電源保護にCH217が、USBホストポートの電源保護にCH214が使われていました。CH214、CH217は以前紹介したUSB電源保護ICです。

74th.hateblo.jp

CH214は500mAの電流を流せるダイオード、リセッタブルフューズとして動作します。CH217は2.7Aまでの指定した電流を流せ、リセッタブルフューズとして動作し、さらに低い電圧しか供給できない場合に、デバイスを壊さないように電流を遮断する機能を持ちます。この2つのICも、AliexpressのWCH公式ショップで購入できるため、取り入れることにしました。

今後作るものも、USBデバイスの電源保護にはCH217を入れるようにしています。

リレーの制御にCH32V003を使う、リモートコントローラとしてもCH32V003を使う

リレーの制御にはCH32V003を使うことにしました。CH32V003は5V電源でも使うことができ、その場合にはGPIOは5Vで動作するため、5Vリレーを制御できます。

そして、当初から作ろうと思っていた機構、離れた位置にコントローラを置けるようにするそのMCUとしてもCH32V003を使うつもりでした。 USBハブ上のCH32V003をI2Cマスター、リモートコントローラのCH32V003をI2Cスレーブとして構築し、Groveケーブルで繋ぎました。

CH32V003をI2Cマスター、スレーブとして使う方法は、ch32v003funを使ってこの機会に確立しました。私が動かしていたコードは以下にあります。

github.com

github.com

構成図を簡単に書くと、下記のようになります。

加えて、今接続しているUSBホストをRGBLEDのWS2812Bで表現しようと思ったため、その制御にもCH32V003を使いました。

で、上手くいったのか?

上手くいきました! 試しに2つ組み立ててみて、両方とも問題なく動作しました。

USB経由でSSDのイメージの書き込みを行ってみましたが、USB2.0で認識し、特に異常なく動くことができました。

ということで、USB2.0であればリレーでもスイッチ制御ができました。

そして、リモートスイッチ部分はディスプレイの上に設置しました。

KicadファイルはGitHubで公開中

今回作ったもののKiCadファイルはGitHub上にアップロードしています。

github.com

GitHubに公開状態で上げておくと、Kicanvasで見ることができて便利です。

回路図 Kicanvas

https://kicanvas.org/?github=https%3A%2F%2Fgithub.com%2F74th%2Frelay-switch-usbhub%2Fblob%2Fmain%2F1.0.1%2Fpcb%2Fusb_relay_hub.kicad_sch

動くことは保証できないけれど、boothにてキット販売中

Relayを使って作った物であり、私の環境では動きましたが、本当に誰の環境でも動くかどうか保証することは難しいと思い、そのような同人商品として Booth で販売中です。 自作PC、MacBookPro、OrangePi5+に接続していますが、特に問題なく期待通り動作しています。 よろしければトライしてみてください。

74th.booth.pm