GroveはSeeed Studioのプラグアンドプレイシステムです。4ピンのコネクタ、1本のケーブル、そしてそれを共有する数百のモジュールで構成されています。ボタン、温度センサー、リレー、OLED、サーモカメラ、LoRa無線がすべて同じソケットに接続できるため、多くの最初のプロジェクトがこれを使って作られています。
2026年9月現在、SeeedのGroveカタログにある279モジュールのうち222個がVelxioで動作します。それぞれがキャンバス上に独自のパーツとして描画され、製品写真をもとにした外観、Seeedのストアへのリンク付きデータシートカード、そしてSeeed自身のwikiからXIAOボード向けに配線を適合させたギャラリー例を備えています。この記事では、それが実際に何を意味するのかを順に見ていきます。
キャンバス上でのGroveモジュールの見え方

すべてのモジュールはSeeedの製品写真をもとに描画され、コネクタ、部品、シルク印刷が基板上の実際の位置に配置され、Seeedの正確な製品名を保持しています。ピンはコネクタの4本のラインで、シルク印刷の名称どおりに命名されているため、SIGやSDAからの配線は実機の作業台と同じ場所に接続されます。
各パーツで得られるものは次のとおりです。
- データシートカード。 パーツをクリックすると、ダイアログにモジュールの概要、搭載チップ、I2Cアドレス(ある場合)、そしてSeeedのストアへのProduct pageボタンが表示されます。
- 実機に必要なコントロール。 アナログセンサーには測定対象の量を設定するスライダーが付きます。ボタンはクリックできます。リレーはカチッと音がしてLEDが点灯します。ディスプレイはスケッチが送った内容を描画します。無線にはリンクの相手側を再現するパネルが付きます。
- ギャラリー例。 各モジュールには、SeeedのwikiからXIAO ESP32-C6向けに配線を適合させたスケッチが付属し、必要なライブラリもあらかじめ宣言されています。開いてRunを押せば、モジュールが応答します。
見つけるには、コンポーネントピッカーを開いて「Grove」と入力するか、サンプルギャラリーを開いてSeeed Studioでフィルタリングしてください。
3つを試してみる
手順はどの例でも同じです。
- サンプルのリンクを開きます。アカウントは不要です。
- ツールバーの再生ボタンを押します。スケッチはVelxioのサーバーでコンパイルされ、ボードがブラウザ内で起動します。
- モジュールのスライダーを動かすか、ボタンをクリックするか、描画を眺めます。
サーモカメラ。 MLX90640は32×24のサーモパイルアレイです。スケッチはセンサーのキャリブレーションEEPROMを読み出し、1フレームを取得してMelexis自身の放射測定演算を実行し、そのフレームをASCIIアートとしてシリアルモニターに出力します。パーツは同じフレームをヒートマップとして表示し、スライダーでホットスポットの位置と温度を設定できます。

1つのドライバで2つのモーター。 I2C Motor Driverは、コマンドプロトコルを話す小型のSTM32の背後にTB6612FNGを搭載しています。サンプルは2つのDCモーターを正転、逆転、ブレーキで動作させます。キャンバス上のローターは指令された速度と方向で回転し、ブレーキはそれらをロックします。

OLED。 0.96インチのSSD1315は、ほとんどのGroveキットに同梱されているディスプレイです。サンプルはSeeedのu8g2 hello worldで、1行のテキストとカウンターをI2Cの0x3C経由で送信し、コントローラーのモデルがそれを描画します。

モジュールはどのようにエミュレートされるか
ここではライブラリレベルで偽装されているものは何もありません。スケッチは選択したボード向けに本物のarduino-cliでコンパイルされ、ファームウェアはそのSoC向けのVelxioのエミュレーター上で動作し、モジュールは実機と同じように回線上で応答します。モジュールごとに異なるのは「回線」が何であるかです。
- アナログモジュール(32個 — 光、音、湿度、ガス、電流、温度)は、スライダーで設定された電圧を
SIGに出力します。スケッチはボードのADCモデルを通じてanalogRead()でそれを読み取ります。 - デジタル入力と出力は
SIG上のレベルです。片側にボタン、スイッチ、PIR、タッチセンサー、もう片側にLED、リレー、ブザーがあります。 - パルスとタイミングのモジュール(Ultrasonic RangerやDHTファミリーなど)はラインモデルを使用します。エッジはエミュレートされたCPU自身のクロック上でスケジュールされます。DHT22のフレームはマイクロ秒単位であり、ブラウザのフレームは16ミリ秒だからです。
- NeoPixelとPWMのモジュールは、スケッチが生成する波形をデコードします。
- I2C、UART、SPIのモジュールは最大のグループで、78のデバイスモデル上の84モジュールがCで書かれ、WebAssemblyにコンパイルされています。各モデルはベンダーのドライバーが送るレジスタ読み取りとコマンドに応答し、同じCソースがブラウザ内と、そこで動作するボード向けのVelxioのクラウドエミュレーター内の両方で実行されます。
デバイスモデルは短くて済みます。ほとんどのパーツはいくつかの形のうちの1つに従うからです。自動インクリメントポインタ付きのレジスタマップ、各ワードにCRC-8を付けるSensirionスタイルのコマンドデバイス、あるいはセンサーがストリーミングするフラットなフレームです。SHT31モデルは、コメントを除けばSeeedの温度湿度センサーの全体です。
static uint32_t handle(sn_dev* d, uint16_t cmd, const uint16_t* args, uint32_t nargs, uint16_t* w) {
(void)d; (void)args; (void)nargs;
switch (cmd) {
case 0x306D: heater = true; return 0;
case 0x3066: heater = false; return 0;
case 0x30A2: heater = false; return 0; /* soft reset */
case 0x3093: return 0; /* break */
case 0x3041: return 0; /* clear status */
case 0xF32D: { /* status register */
uint16_t st = heater ? 0x2000 : 0x0000;
w[0] = st; return 1;
}
default: break;
}
/* Everything else is a measurement request (single shot, periodic, fetch). */
double t = vx_attr_read(A_temp) + (heater ? 2.0 : 0.0);
double h = vx_attr_read(A_hum);
w[0] = gc_u16((gc_clamp(t, -45, 130) + 45.0) * 65535.0 / 175.0);
w[1] = gc_u16(gc_clamp(h, 0, 100) * 65535.0 / 100.0);
return 2;
}
A_tempとA_humは2つのスライダーです。変換はSHT31のデータシートにあるものを逆に実行したものです。スライダーが25度を示せば、モデルはドライバーが再び25度に変換する生のワードを、CRCも含めて生成します。
モデルの出所
各モデルは、あるドキュメントに基づいて書かれています。それは部品のデータシート、あるいはその部品と通信するベンダーライブラリであり、一行ずつ読み込まれます。どちらも存在しない場合、モジュールは推測されるのではなく、除外されました。その意味を示す3つのケースを紹介します。
サーマルカメラは転記ではなく導出が必要でした。 サーマルドライバは温度を読むことはありません。832ワードのEEPROMを読み出し、約200個のキャリブレーション定数を抽出し、832ワードのフレームデータを読み取り、メーカーのモデルを実行します。そこでMLX90640モデルは、すべての補正項が消える縮退したキャリブレーションを提供し、スライダーが要求する温度からそれを生成する生のワードへと逆算します。Cコードを書く前に、ドライバの移植版と照合して確認されました。-20~300度の目標値は0.02度以内で往復します。MLX90641には同じトリックに加えてハミング符号化されたEEPROMが必要で、Seeedが何も公開していないMLX90621は、Melexisのリファレンスドライバから作られました。
モータードライバの例は生のWireを使用しています。 SeeedのTB6612FNGボード用ライブラリは、ESP32ではコンパイルできないAVR時代のI2Cヘルパーを同梱しているため、例ではプロトコルを直接扱います。それはコマンドバイトとそのペイロードです。
const uint8_t ADDR = 0x14;
const uint8_t BRAKE = 0x00, CW = 0x02, CCW = 0x03;
const uint8_t STANDBY = 0x04, NOT_STANDBY = 0x05;
const uint8_t CHA = 0, CHB = 1;
void cmd(uint8_t c, const uint8_t* payload, uint8_t n) {
Wire.beginTransmission(ADDR);
Wire.write(c);
for (uint8_t i = 0; i < n; i++) Wire.write(payload[i]);
Wire.endTransmission();
delay(1);
}
void run(uint8_t channel, int speed) {
uint8_t p[2] = { channel, (uint8_t)(speed < 0 ? -speed : speed) };
cmd(speed >= 0 ? CW : CCW, p, 2);
}
CAN BUSモジュールはSeeedの設計ではありません。 Seeedがプロトコルもライブラリも公開していないため、当初は除外されていました。このボードはLongan Labs製で、同社が両方を公開しており、モデルはそのフレームレイアウトに従っています。0xAA、長さ、コマンド、ペイロード、そしてMODBUS CRCです。
すべてのモデルには、そのドライバと同じようにバイト単位で駆動するテストがあります。2026年9月時点でカタログ全体で1,804件です。ギャラリーの例は、テストスイート内だけでなく、デプロイされたアプリ上でも実行されました。
カタログに含まれていないもの
ギャップについて正直に言うと、279 SKUのうち57がモデル化されておらず、モデル化できたもののうち3つのグループが該当します。
- DMX512モジュール。 このボードはラインドライバであり、難しいのは、ボードが期待する方法でXIAO上でDMXフレームを生成するArduinoライブラリが存在しないことです。
- 433 MHz Simple RF Linkキット。 そのスケッチはVirtualWireを使用していますが、これはArduinoライブラリインデックスに含まれておらず、受信側はモジュールが応答するのではなく、ボードへビットストリームを生成する必要があります。
- Grove名で販売されている3つのボード、Grove Beginner Kit、Arduino Sensor Kit Base、GrovePi+です。これらはモジュールではなくマイクロコントローラを搭載したボードであり、独自のボード定義が必要です。
残りはケーブル、取り付けハードウェア、キットです。
次にどこへ行くか
- コンポーネントピッカー:キャンバス上でAdd Componentを押して「Grove」と入力してください。各カードがモジュールで、説明にはその機能が書かれています。
- velxio.dev/examplesのサンプルギャラリーで、Seeed Studioでフィルタリングすると、モジュールごとに1つの例があります。
- モジュールはSeeedのストアのGroveにあります。各部品のデータシートカードはそのページにリンクしています。
モジュールのアートはSeeed Studioの製品写真から描かれています。