
話題の290円のマイコンボードUIAPduinoを入手したので、これを使ってビットコインのマイニングに使えないか試してみました。これが無謀なことであることは始める前からわかっていたことですが、あえてやることに意味があるのです。
290円マイコンとは?
いつものようにネットを見ていたら、こんなニュースが流れてきました。
290円てなんだ!? あまりに破格すぎてどうやったらこんな値段で作れるんだと思いましたが、どうやらWCH社のCH32V003という激安マイコンを使っているそうです。
関連記事
1人で1万個量産、290円のマイコンボード「UIAPduino」ーー目指す先は100均の棚
CH32シリーズについては以前から「安いマイコン」という認識は持っていましたが、ボードの状態で290円というのは驚きです。そして更に驚いたのは、それを作っているのが個人で、しかも1人で1万個も量産したとのこと。す、すごい。そんなこんなで290円で何ができるのかなぁと思って、とりあえず3つほど買ってみました。

けっこうしっかり作ってあるマイコンボードです(はんだ付けは私)。USB経由で書き込めるからライターが無くても簡単に扱えます。使用できるGPIOピンもたくさん引き出されています。
まずは定番のLチカ。「光った~」で満足して終わってしまうのがマイコンあるあるなんですが、せっかくなので何か面白いことをやってみようと思いました。
何をして遊ぼうかな?
やるならこのマイコンを限界を追求するようなことがしたいです。複数繫げでクラスター化してなんか処理とかして・・・、あ、マイニングできるんじゃね? でもどう考えてもビットコインをマイニングするのは無理があります。マイコンでマイニングして遊べるのないかなぁと思って探したら、なんとそれ用のコインがありました!
Duino-Coinのマイニング
Duino-Coinというマイコンボードでマイニングする仮想通貨がありました。このページの「Continue without login」を押すと、どんなデバイスでマイニングできるのか一覧が出てきます。やりたかったのはこれだ~、とウキウキしながらオンラインウォレットを作成してログインしようとすると、そんなアカウントはないと言われる。何度やってもだめ。デベロッパーツールでデータのやり取りを見ながらやったら、ウォレット作成の結果はsuccessなのに実際にはウォレットは作られていないようで、なんかサーバーが壊れているようでした。
Discordに入って見てみると開発が止まっていることはなく、そこそこアクティブに活動をしているようでした。しかし本当にそのデバイスを持っていることを証明するために写真を撮って管理者に送らないといけなかったり、申請した台数を超えるマイニングをしたらBANされたり、間違って複数のアカウントを作ったらBANされて残高を返してもらえなかったり、なんか、閉鎖的な運営をしている様子がうかがえました。そうなってしまったのも過去に荒らされたことが原因の一つとしてあるみたいです。子供の砂場でみんな楽しく遊んでたところに、重機の大軍が押し寄せてきてブルジュ・ハリファ(ドバイにある世界一高い建物)を建てられてしまった感じでしょうか。
結局金になるところにはクソみたいな連中が大勢集まってくるので、みんなで仲良く遊んでいたいなら、換金性を排除しないとだめなんですよ。奴らが欲しいのは金。それだけ。マイニングして数字が増えていくのを見ているだけで「楽しい~」と思える人とは全く世界が違うのです。
おっと、だいぶ話がそれてしまいました。いずれにしてもウォレットが作成できないという最初の一歩ができないのだからもう諦めるしかありません。ちなみにDuino-CoinはDUCO-S1という独自のアルゴリズムを採用していて、SHA-1をベースとしたものになっています。非力なマイコンでもSHA-1なら対応可能ということのようですね。
他のアルゴリズムはどうか?
LitecoinやDogecoinに使われているScryptというアルゴリズムができないかChatGPTに聞いてきました。結果はNo。Scryptは大量のメモリアクセスが必要なので、容量的に無理とのことです。それならCPUでマイニングできるXMR (Monero)ならいけるんじゃないかと聞いてみたら、これも同様にメモリ的に無理とのこと。いろいろ調べてみたところ、最終的にはSHA256dならいけそうということになりました。
一周回ってビットコイン!?
SHA256dアルゴリズムというは、ビットコインで採用されている方式です。SHA256を2回行っています。SHA256自体は大したメモリを食わず、CPUの処理もそれほど重くもありません。なんだかんだ言って結局ビットコインでよかったんですね。
ビットコインをマイニングする
ビットコインをマイニングするにはソロマイニングするか、プールに接続してマイニングするかになりますが、いずれにしてもインターネットに接続しなくてはなりません。しかしCH32V003にはインターネットに接続する機能はありません。そこでインターネットに接続するために、M5StackのAtomS3を使用することにしました。
儲かるのか?
全く儲かりません!1円にもなりません。そんなことはどうでもいいんです。マイニングすることが目的です。
ATOMS3単独でマイニングのテスト
まずはAtomS3単独でマイニングできることを確認してから、CH32V003へ機能を移植します。使用したプログラムはこちら。このプログラムは中途半端なところで開発が止まってるので動かないかもしれません。

実行してみたところ、ハッシュレートは20KH/sでした。これはソフトウェアでの計算なので、ハードウェアのmbedtls関数を使えばもう少し早くなります。しかもESP32-S3は2コアあるので、両方合わせれば45KH/sくらいは出そうです。ただ今回の目的はCH32V003でマイニングすることなので、ESP32-S3での実験はここまでにします。
CH32V003との連携方法
CH32V003はインターネットに接続できないので、AtomS3 (ESP32-S3)がインターネットに接続し、I2CでCH32V003と通信することにします。AtomS3ではマイニングはせず、プールとの通信やCH32V003の制御のみを行います。
graph LR プール -->|WiFi| ESP32-S3 ESP32-S3 -->|I2C| j(( )) j --> ch1["CH32V003 (1)"] j --> ch2["CH32V003 (2)"] style j fill:#000,stroke:#000,color:#000
図ではCH32V003が2台接続されています。I2Cは1つのバスに複数のデバイスを接続できるので、このように複数台接続してハッシュパワーを高めます。なんてったって安いですから、どんどん増やしてたくさんマイニングしましょう。実際にマイニングしたところ、2台で2.5KH/sほど出ました。1台 1250H/s 程度です。

そもそもマイニングできるのか?
というのも、ビットコインのハッシュレートは高い時で 1.25ZH/s くらいです。Zという単位はゼタ、10の21乗です。日常生活で見る単位はせいぜいTまでですよね。Tの上はP、Pの上がE、Eの上ががZです。数字で書くとこんな感じ。
世界→ 1,250,000,000,000,000,000,000 H/s
ワイ→ 1,250 H/s
これは草も生えない。。。
そもそもマイニングが成立しないんじゃないかって気がして、ちょっと虚無を感じました。ぽっかりと心に穴が開いたままAliExpressを散策していると…
NMMiner
なんだか香ばしいものが目に留まりました。
「コンピューター愛好家のためのラッキーマイナー ビットコインソロロト NMMiner ハッシュレート 1100KH/s 2.8インチスマートディスプレイ クリプト ESP32 V3.0 DROOM」

ESP32で1100KH/s、ほんまかいな。商品名は1100KH/sなのに画像は1060KH/sだったり987KH/sだったり、商品説明は412KH/sだったりなんかもう滅茶苦茶です。w 逆に面白そうだったので注文してみました。届いたらレポートする予定です。このボードにはESP32-WROOM-32 モジュールが乗っているそうですが、ほんとにESP32でそんなにスピード出るのかちょっと疑問です。先ほどのESP32-S3での結果から想定値は45KH/sくらいで、これを後述する改良を加えても90KH/sくらいです。どう考えてもESP32でこの値は無理な気がするんですよね。表示を偽ってるだけじゃないだろうか…。
NerdMiner_v2
これを調べている過程でNerdMiner_v2というものの存在を知りました。このGitHubページを見ていたら低難易度用のプールがあるそうです。これなら低ハッシュレートのデバイスでもマイニングできるんじゃないか!? やる気を取り戻して先に進むことにしました。
CH32V003でマイニングする
マイニングの仕組みとか方法は全然わからないので、cpuminer-multi を「git cloneして移植して」とAIに頼みました。Composer 2は結構賢くなりましたね。Composer 1.5のときはマイコン系のプログラムはうまくいかないことがあったのですが、2ではかなり良くなったと思います。それでもドツボにはまって抜けられないときはOpus 4.6に助けを求めたりしました。

もっとハッシュスピードを上げられないかなと思い、試しにCodexを入れてGPT-5.4に最適化をしてもらいました。私もよくわかってないので適当ですが、SHA256のハッシュ計算をするときに、ビットコインの80バイトのヘッダーを使うそうなんですが、SHA256は64バイト単位で計算します。マイニングする際、上位64バイトは変わらないので上位バイトは1回だけ計算しておいて、下位16バイトの計算を繰り返して最後にくっつけることで、処理を約半分にできるとのこと。実装をしてもらうと、なんとCH32V003 1台で 2500H/s も出るようになりました。
改良版のプログラムはこちらです。
・マスター(AtomS3)
・スレーブ(CH32V003)
ビットコインのマイニング結果
実際にマイニングプールでビットコインをマイニングした結果がこちらです。

こちらはCH32V003 1台だけでやっている結果ですが、2.3KH/sとデバイス側と近い値になってますね。ちゃんとプールにも認識されているので、プールの誰かが掘り当てたら分け前がもらえるかもしれません。たぶん 0.001円くらい。
謎の草コイン FxTC
いくらマイニングできたからといって、残高は0です。先ほど紹介したAliExpressの謎マイナーの商品名にもあったとおり「ロト」、宝くじです。実際は宝くじより遥かに期待値は低いでしょう。空から落ちてきた隕石が地面に跳ね返って鼻の穴に入るくらいの確立でしょう。換金性は期待してないけど、残高の数字が増えるのを見たいなぁ。ということで本当にマイニングに成功しそうなコインを探してみました。
SHA256dアルゴリズムで、公式サイトにアクセスできて、ウォレットがダウンロードできて、ノードがまだ動いていて、マイニングプールが存在して、それでいてハッシュレートがアホみたいに低いところ。そんな都合のいいものあるかー!と思ったらありました。
それが FxTC というコインです。このブログを書いている時点のハッシュレートは 7.2GH/sとマイコンのハッシュレートに比べれば遥かに上ですが、ビットコインやその他の同じアルゴリズムのコインに比べたら遥かに下です。これならちょっとくらいおこぼれがもらえそうです。
altpool.eu というマイニングプールで実際に試したところ、マイニングでき、報酬も 0.00000001 FxTCほどもらえました。

FxTCは現在まともに交換できる取引所はおそらく無く、最終価格で$0.00326ほどのようなので、0.00000001 FxTCだと 0.000000005216 円くらいですね。
限りなくゼロ!!
出金低額は 0.0001 FxTC なので、現在の残高 0.00000125 FxTC ではプールから受け取ることはできません。あと50日くらい続けていれば最低額に届きそうです。
8ピンのCH32V003を使おう

UIAPduinoは290円と激安です。しかしCH32V003単品で買うと20~30円くらいです。秋月電子では20ピンTSSOP20のCH32V003F4P6と、8ピンSOP-8のCH32V003J4M6の2種類が売られています。TSSOP20はさすがに手ではんだ付けをするのは難しそうですし、今回GPIOは少しだけでいいので、SOP-8のCH32V003J4M6を買ってみました。価格は1個50円。昨年までは40円でした。これとDIP変換基板も一緒に買います。
WCH公式Arduino開発環境
8ピンのCH32V003J4M6はピンのレイアウトやボード構成も違うので、UIAPduinoの開発環境では書き込みできません。そこでWCH公式のArduino開発環境を使いました。CH32V003の開発については74thさんの「CH32V003開発ガイドブック」が詳しいです。Arduinoで開発するにはここに書いてあるボードマネージャーのURLを追加します。この環境でLチカをするだけの簡単なプログラムをコンパイルしてみたところ、スケッチのサイズが10KBにもなってしまいました。UIAPduinoの開発環境なら5KB前後です。CH32V003はFlashが16KBしかないので、Lチカで10KBも食われたら何もできませんね。
UIAPduinoの開発環境で8ピンのCH32V003J4M6を使う
UIAPduinoの開発環境で8ピンのCH32V003J4M6を使えれば最高なんですが、できないかなぁ、と思ってChatGPTに聞いたらどうもできるらしい。そこでCodexに C:\Users\xxx\AppData\Local\Arduino15\packages\UIAP のファイルを見てもらってCH32V003J4M6に対応してもらいました。
注意:以下の内容は単にファイルを書き換えただけなので、アップデートすれば上書きされて消えてしまうと思います。またピンの定義は私が必要なものを選んでいるので、あくまで自分用に作ったものになってます。
board_list = {
'CH32V00x': {
'name': 'CH32V00x_EVT',
'info': '',
'usb': [],
'hsi': [48, 24, 8],
'hse': [48, 24, 8],
'pnums': {
'CH32V003F4': {'name': 'CH32V003F4 EVT', 'maximum_size': 16384, 'maximum_data_size': 2048, 'mcu': 'QingKe-V2A', 'chip': 'CH32V003F4'},
'CH32V003J4M6': {'name': 'J4M6-SOP8', 'maximum_size': 16384, 'maximum_data_size': 2048, 'mcu': 'QingKe-V2A', 'chip': 'CH32V003J4M6'},
}
},pnums にCH32V003J4M6を追加しました。以下の6ファイルは hardware/ch32v/1.0.42/variants/CH32V00x/CH32V003J4M6 に配置しました。
# CH32V003J4M6 (SOP8)
CH32V00x_EVT.menu.pnum.CH32V003J4M6=J4M6-SOP8
CH32V00x_EVT.menu.pnum.CH32V003J4M6.upload.maximum_size=16384
CH32V00x_EVT.menu.pnum.CH32V003J4M6.upload.maximum_data_size=2048
CH32V00x_EVT.menu.pnum.CH32V003J4M6.build.board=CH32V003J4M6
CH32V00x_EVT.menu.pnum.CH32V003J4M6.build.product_line=CH32V00x
CH32V00x_EVT.menu.pnum.CH32V003J4M6.build.variant=CH32V00x/CH32V003J4M6# v3.21 implemented semantic changes regarding $<TARGET_OBJECTS:...>
cmake_minimum_required(VERSION 3.21)
add_library(variant INTERFACE)
add_library(variant_usage INTERFACE)
target_include_directories(variant_usage INTERFACE
.
)
target_link_libraries(variant_usage INTERFACE
base_config
)
target_link_libraries(variant INTERFACE variant_usage)
add_library(variant_bin STATIC EXCLUDE_FROM_ALL
PeripheralPins.c
variant_CH32V003J4M6.cpp
)
target_link_libraries(variant_bin PUBLIC variant_usage)
target_link_libraries(variant INTERFACE
variant_bin
)/**
*******************************************************************************
* CH32V003J4M6 (SOP8) peripheral pin maps
*******************************************************************************
*/
#include "Arduino.h"
#include "PeripheralPins.h"
#ifdef ADC_MODULE_ENABLED
WEAK const PinMap PinMap_ADC[] = {
{PA_2, ADC1, CH_PIN_DATA_EXT(CH_MODE_INPUT, CH_CNF_INPUT_ANALOG, 0, AFIO_NONE, 0)},
{PC_4, ADC1, CH_PIN_DATA_EXT(CH_MODE_INPUT, CH_CNF_INPUT_ANALOG, 0, AFIO_NONE, 2)},
{PD_6, ADC1, CH_PIN_DATA_EXT(CH_MODE_INPUT, CH_CNF_INPUT_ANALOG, 0, AFIO_NONE, 6)},
{NC, NP, 0}
};
#endif
#ifdef I2C_MODULE_ENABLED
WEAK const PinMap PinMap_I2C_SDA[] = {
{PC_1, I2C1, CH_PIN_DATA(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFOD, NOPULL, AFIO_NONE)},
{NC, NP, 0}
};
#endif
#ifdef I2C_MODULE_ENABLED
WEAK const PinMap PinMap_I2C_SCL[] = {
{PC_2, I2C1, CH_PIN_DATA(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFOD, NOPULL, AFIO_NONE)},
{NC, NP, 0}
};
#endif
#ifdef TIM_MODULE_ENABLED
WEAK const PinMap PinMap_TIM[] = {
{PC_4, TIM1, CH_PIN_DATA_EXT(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFPP, NOPULL, AFIO_Remap_TIM1_DISABLE, 4)},
{PA_2, TIM1, CH_PIN_DATA_EXT(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFPP, NOPULL, AFIO_Remap_TIM1_DISABLE, 2)},
{PD_1, TIM1, CH_PIN_DATA_EXT(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFPP, NOPULL, AFIO_Remap_TIM1_DISABLE, 3)},
{NC, NP, 0}
};
#endif
#ifdef UART_MODULE_ENABLED
WEAK const PinMap PinMap_UART_TX[] = {
{PD_6, USART1, CH_PIN_DATA(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFPP, 0, AFIO_PartialRemap2_USART1_ENABLE)},
{PD_5, USART1, CH_PIN_DATA(CH_MODE_OUTPUT_50MHz, CH_CNF_OUTPUT_AFPP, 0, AFIO_NONE)},
{NC, NP, 0}
};
#endif
#ifdef UART_MODULE_ENABLED
WEAK const PinMap PinMap_UART_RX[] = {
{PD_6, USART1, CH_PIN_DATA(CH_MODE_INPUT, CH_CNF_INPUT_PUPD, PULLUP, AFIO_NONE)},
{PD_5, USART1, CH_PIN_DATA(CH_MODE_INPUT, CH_CNF_INPUT_PUPD, PULLUP, AFIO_PartialRemap2_USART1_ENABLE)},
{NC, NP, 0}
};
#endif
#ifdef UART_MODULE_ENABLED
WEAK const PinMap PinMap_UART_RTS[] = {
{NC, NP, 0}
};
#endif
#ifdef UART_MODULE_ENABLED
WEAK const PinMap PinMap_UART_CTS[] = {
{NC, NP, 0}
};
#endif
#ifdef SPI_MODULE_ENABLED
WEAK const PinMap PinMap_SPI_MOSI[] = {
{NC, NP, 0}
};
#endif
#ifdef SPI_MODULE_ENABLED
WEAK const PinMap PinMap_SPI_MISO[] = {
{NC, NP, 0}
};
#endif
#ifdef SPI_MODULE_ENABLED
WEAK const PinMap PinMap_SPI_SCLK[] = {
{NC, NP, 0}
};
#endif
#ifdef SPI_MODULE_ENABLED
WEAK const PinMap PinMap_SPI_SSEL[] = {
{NC, NP, 0}
};
#endif/* SYS_WKUP */
#ifdef PWR_WAKEUP_PIN1
SYS_WKUP1 = PA_0,
#endif
#ifdef PWR_WAKEUP_PIN2
SYS_WKUP2 = NC,
#endif
#ifdef PWR_WAKEUP_PIN3
SYS_WKUP3 = NC,
#endif
#ifdef PWR_WAKEUP_PIN4
SYS_WKUP4 = NC,
#endif
#ifdef PWR_WAKEUP_PIN5
SYS_WKUP5 = NC,
#endif
#ifdef PWR_WAKEUP_PIN6
SYS_WKUP6 = NC,
#endif
#ifdef PWR_WAKEUP_PIN7
SYS_WKUP7 = NC,
#endif
#ifdef PWR_WAKEUP_PIN8
SYS_WKUP8 = NC,
#endif/**
*******************************************************************************
* CH32V003J4M6 — SOP8 digital / analog pin tables
*******************************************************************************
*/
#include "pins_arduino.h"
const PinName digitalPin[] = {
PD_6,
PA_2,
PC_1,
PC_2,
PC_4,
PD_1
};
const uint32_t analogInputPin[] = {
1,
4,
0
};/*
*******************************************************************************
* CH32V003J4M6 — SOP8. Package pins vs Arduino D# / usage:
* 1 PD6 D0 USART1 TX (log, PartialRemap2) / ADC
* 2 VSS
* 3 PA2 D1 GPIO / ADC
* 4 VDD
* 5 PC1 D2 I2C SDA
* 6 PC2 D3 I2C SCL
* 7 PC4 D4 GPIO / ADC
* 8 PD1 D5 SWIO (WCH-LinkE); avoid UART on this pad
* Serial: TX-only — PIN_SERIAL_RX == PIN_SERIAL_TX so RX is NC (half-duplex init).
*******************************************************************************
*/
#pragma once
#define ADC_MODULE_ENABLED
#define UART_MODULE_ENABLED
#define SPI_MODULE_ENABLED
#define I2C_MODULE_ENABLED
#define TIM_MODULE_ENABLED
/* Arduino pin index -> port (SOP8 pin order: 1,3,5,6,7,8) */
#define PD6 0
#define PA2 1
#define PC1 2
#define PC2 3
#define PC4 4
#define PD1 5
#define NUM_DIGITAL_PINS 6
#define NUM_ANALOG_INPUTS 3
#define ADC_RESOLUTION 10
#ifndef LED_BUILTIN
#define LED_BUILTIN NUM_DIGITAL_PINS
#endif
#ifndef USER_BTN
#define USER_BTN NUM_DIGITAL_PINS
#endif
#ifndef SERIAL_UART_INSTANCE
#define SERIAL_UART_INSTANCE 1
#endif
/* TX-only log: same index as TX so HardwareSerial maps RX to NC */
#ifndef PIN_SERIAL_TX
#define PIN_SERIAL_TX PD6
#endif
#ifndef PIN_SERIAL_RX
#define PIN_SERIAL_RX PD6
#endif
#ifndef PIN_WIRE_SDA
#define PIN_WIRE_SDA PC1
#endif
#ifndef PIN_WIRE_SCL
#define PIN_WIRE_SCL PC2
#endif
/* Hardware SPI not available on bonded pins; keep library symbols invalid */
#ifndef PIN_SPI_SS
#define PIN_SPI_SS NUM_DIGITAL_PINS
#endif
#ifndef PIN_SPI_MOSI
#define PIN_SPI_MOSI NUM_DIGITAL_PINS
#endif
#ifndef PIN_SPI_MISO
#define PIN_SPI_MISO NUM_DIGITAL_PINS
#endif
#ifndef PIN_SPI_SCK
#define PIN_SPI_SCK NUM_DIGITAL_PINS
#endif
#ifndef TIMER_TONE
#define TIMER_TONE TIM2
#endif
#ifndef TIMER_SERVO
#define TIMER_SERVO TIM1
#endif
#ifdef __cplusplus
#ifndef SERIAL_PORT_MONITOR
#define SERIAL_PORT_MONITOR Serial
#endif
#ifndef SERIAL_PORT_HARDWARE
#define SERIAL_PORT_HARDWARE Serial
#endif
#endifまず方針として、SWIO (Pin 8)は他の用途で使わないようにします。SDA (Pin 5), SCL (Pin 6)は必須です。Serialはprintデバッグ用にほしいのでTXだけをPin 1に配置しました。RXはSWIOやSDAと競合してしまうので入れられませんでしたが、今回の用途では必要ないので無効になってます。
void setup() {
#if MINER_SLAVE_DEBUG
Serial.begin(115200);
delay(50);
Serial.print(F("ch32_miner2_slave addr="));
dbg_hex_byte(I2C_SLAVE_ADDR);
Serial.println();
#endifこんな感じでSWIOを生かしつつSerialが使えます。TXを除いてもGPIOは残り2つあるのでLEDの点灯に使うことにしました。
USBポートがないので、書き込むには WCH-LinkE を使います。SWIO, 3V3, GND を繋ぐだけです。WCH-LinkEのRXをCH32V003J4M6のTXに接続すれば、シリアルポートもCOMxxでアクセスできます。Arduino IDEではボードはPro Micro CH32V003を選び、Borard Version SelectでJ4M4-SOP8を選択します。Upload methodはWCH-SWDを選択します。(J4M4-SOP8が出てこない場合はReload Boad Dataを選択するか再起動)

これでLチカのプログラムをコンパイルしたら5KB程度でした。素晴らしい!公式のArduino環境ではLチカだけで10KBになってしまいましたが、これならマイニングのプログラムも問題なく納まりそうです。それからOptimizeはSmallest (-Os) with LTOの方がいいかもしれません。
CH32V003J4M6でマイニングしてみる

UIAPduinoと同じようにマイニングすることができました!ハッシュレートはAtomS3に表示するようにしてみました。
前編は以上です。
今後モチベーションが続けば壮大な計画があるので、数か月後くらいには続編をお見せできるかもしれません。
余談
「安い」は最強のきっかけである
私がUIAPduinoを買った理由は、安いからです!
CH32Vに興味があったからとかではありません。
初心者なら「挫折しても290円だから」と気軽に手を出してくれるかもしれません。これが2900円だったら、本気で学びたい人しか買わないでしょう。実際に使ってみたら結構面白くって、気づいたらハマってしまった。マイコンて面白い。もっといろんなマイコンで遊んでみよう。なんて感じでユーザーが増えていったら良いですよね。
私もUIAPduinoのおかげでCH32Vが意外と簡単に扱えて気に入りました。今後はM5Stackをメインに、ちょっとした制御にはCH32V003を使っていきたいと思います。