Grove 超音波センサー (SMS812)
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
Grove 超音波センサー (SMS812)

概要
Grove 超音波センサー (SMS812) は、小型で超低消費電力の距離測定センサーです。Grove 超音波センサー (SMS812) は超音波の飛行時間 (ToF) 原理に基づいており、関連する音響、電気、およびアルゴリズムを用いて設計されています。異なる材料の表面での超音波エコー信号のエネルギー差を利用して高精度の距離測定を実現し、ミリメートル単位の距離情報とそのエコーエネルギー強度値を出力します。また、柔らかい材料と硬い材料を区別するフラグビットを出力することもできます。さらに、清掃ロボットが地面の材料を識別し、一定範囲内の距離を測定するために使用できます。このセンサーは小型で取り付けが簡単です。
応用例
- 清掃ロボットが地面の柔らかい材料と硬い材料を認識
- 家庭用サービスロボットやロボット掃除機が地面情報を取得
- 3Dプリンターのレベル検出
特徴
- ミリメートル単位の測距精度、高い測距安定性
- 柔らかい材料と硬い材料を認識し、I/O情報を出力
- 検出距離は20-50mmで、ブラインドエリアが小さい
- Arduino対応
ハードウェア概要

- このセンサーの構造は円筒形で、プラスチック射出成形で作られています。
- 上図の寸法はミリメートル単位です。

このインターフェースは PH1.0-4P プラグコネクタです。ピンの定義は以下の通りです:
ピン | タイプ | 説明 | デフォルト | データストリーム |
GND | 電源供給 | 負極 | 0V | |
Tx | 出力 | システムシリアルポート出力 | Ladar から周辺機器へ | |
Rx | 入力 | システムシリアルポート入力 | 周辺機器から Ladar へ | |
VCC | 電源供給 | 正極 | 3.3V |
はじめに
ハードウェアの準備
このルーチンでは、XIAO SAMD21をマスターコントロールとして使用し、この超音波レーダーの使用方法を紹介します。配線の利便性を考慮し、Grove拡張ボードも使用します。実際のニーズに応じて選択してください。
次に、超音波レーダーをXIAOのUARTインターフェースに接続します。

Arduinoライブラリ概要
Arduinoを初めて使用する場合は、Arduinoの使い方を参照するか、以下の簡単なチュートリアルをご覧ください。
以下のボタンをクリックすると、Grove Ultrasonic Sensor (SMS812)用のArduinoプログラムライブラリに直接アクセスできます。
機能
スケッチの開発を始める前に、ライブラリで利用可能な機能を確認しましょう。
void setIOMode()
—— レーダーをIOモードに設定するための関数です。このモードは主にターゲットの材質を検出するために使用されます。void setUARTMode()
—— レーダーをUARTモードに設定するための関数です。UARTモードでは、レーダーが距離と材質情報を自動的に報告します。void setUARTREQMode()
—— レーダーをUART REQモードに設定するための関数です。このモードでは、クエリコマンドを送信することでのみ距離と材質情報を取得できます。void checkUARTREQ(int delaytime = 0, bool showSwitch = true)
—— UART REQモードで検出された材質と距離をクエリするための関数です。入力パラメータ
delaytime
: デフォルト値は0です。このパラメータはクエリコマンドを発行する時間(ミリ秒)を制御します。showSwitch
: デフォルトはオンです。このパラメータは、元のデータフレームを出力するかどうかを制御します。
bool getFrame(bool showSwitch = true)
—— 元のデータフレームを取得するための関数です。入力パラメータ
showSwitch
: デフォルトはオンです。このパラメータは、元のデータフレームを出力するかどうかを制御します。
bool parseDatagram(bool showSwitch = false)
—— 元のデータフレームを解析するための関数です。入力パラメータ
showSwitch
: デフォルトはオフです。このパラメータは、元のデータフレームを出力するかどうかを制御します。
インストール
ZIP形式のライブラリをダウンロードしたら、Arduino IDEを開き、スケッチ > ライブラリをインクルード > .ZIP形式のライブラリを追加をクリックします。ダウンロードしたZIPファイルを選択し、ライブラリが正しくインストールされると、通知ウィンドウにライブラリがライブラリに追加されましたと表示されます。これでライブラリのインストールが完了です。

XIAO の例
ステップ 1. Arduino ソフトウェアをインストールする必要があります。
ステップ 2. Arduino アプリケーションを起動します。

ステップ 3. 開発ボードモデルを選択し、Arduino IDE に追加します。
Seeeduino V4.2 を使用する場合は、このチュートリアル を参照して追加を完了してください。
XIAO SAMD21(Seeeduino XIAO) を使用する場合は、このチュートリアル を参照して追加を完了してください。
XIAO RP2040 を使用する場合は、このチュートリアル を参照して追加を完了してください。
XIAO nRF52840 を使用する場合は、このチュートリアル を参照して追加を完了してください。
XIAO ESP32C3 を使用する場合は、このチュートリアル を参照して追加を完了してください。
XIAO ESP32S3 を使用する場合は、このチュートリアル を参照して追加を完了してください。
XIAO nRF52840 を使用する場合は、Seeed nRF52 mbed-enabled Boards を選択してください。そうしないと、プログラム実行時にエラーが報告される可能性があります。

ステップ 4. Arduino コードライブラリをインストールします。
デモ 1: IO モードの使用
この例では、柔らかい素材と硬い素材を区別するためのフラグビットを出力するプロセスを案内します。以下は Arduino 用の参考コードです:
#include "sms812.h"
const int radarPin = A7;
//#include <SoftwareSerial.h>
// SoftwareSerial で RX & TX に使用できる任意の 2 ピンを選択
//#define RX_Pin A6
//#define TX_Pin A7
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// ソフトウェアシリアルを使用
//SMS812_Sensor radar = SMS812_Sensor(&mySerial);
// ハードウェアシリアルも試せます
SMS812_Sensor radar = SMS812_Sensor(&Serial1);
void setup() {
// 初回実行時にセットアップコードを記述
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
pinMode(radarPin, INPUT);
while(!Serial); // シリアルポートが開かれるとプログラムが実行を開始します。
Serial.println("準備完了");
radar.setIOMode();
}
void loop() {
// 繰り返し実行されるメインコードを記述
int value = analogRead(radarPin); // D7 ピンのレベル状態を読み取る
Serial.println(value);
delay(500);
}
IO モードを有効にした後、US5 センサーが柔らかい素材を認識すると、TX ピンがフラグビット 0x01
をボードに送信し、硬い素材の場合は 0x00
を送信することを知っておく必要があります。そのため、radarPin
を A0(センサーの TX ピンに接続)またはアナログ入力をサポートするピンに設定する必要があります。
1000 を超える高い値は硬い素材を認識していることを意味し、20 未満の値は柔らかい素材または空気を認識していることを意味します。
センサーを動かしてシリアル出力を確認すると、以下のような出力が表示されます:

デモ 2: UART モードの使用
UART モードでは、レーダーは 100Hz のレートで測定値を出力します。データテレグラムのフォーマットは以下の表に示されています。
ヘッダーフレーム | コマンドフレーム | データ長フレーム | データフレーム | チェックサムフレーム |
---|---|---|---|---|
0xAA 0xAA | 0xFD | 0x04 | -- | CS |
データビットは 4 バイトを占めます。最初の 1 バイトは素材フラグビットで、0 は硬い素材、1 は柔らかい素材を意味します。柔らかい素材の場合、距離を測定することはできません。その後、距離値が続き、これはミリメートル単位で 2 バイトを占めます。最後の 1 バイトは強度値で、受信した超音波信号の強さを示します。
素材フラグビット | 距離値 | 強度 |
---|---|---|
1 バイト | 2 バイト | 1 バイト |
この例では、ライブラリ内の関数を使用して受信したデータフレームを解析し、センサーがシリアルポートを介して報告するすべての特徴データを出力します。
ボード XIAO SAMD21 の ハードウェアシリアルポート は UART インターフェースピン A6 と A7 です。また、任意の 2 ピンをソフトウェアシリアルとして使用することもできます。
#include "sms812.h"
//#include <SoftwareSerial.h>
// SoftwareSerial で RX & TX に使用できる任意の 2 ピンを選択
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// ソフトウェアシリアルを使用
//SMS812_Sensor radar = SMS812_Sensor(&mySerial);
// ハードウェアシリアルも試せます
SMS812_Sensor radar = SMS812_Sensor(&Serial1);
void setup() {
// 初回実行時にセットアップコードを記述
Serial.begin(115200);
Serial1.begin(115200);
// mySerial.begin(115200);
while(!Serial); // シリアルポートが開かれるとプログラムが実行を開始します。
Serial.println("準備完了");
radar.setUARTMode();
}
void loop() {
// 繰り返し実行されるメインコードを記述
// 取得した生データフレームのみを出力
// radar.getFrame();
// delay(1); // プログラムの停止を防ぐために時間遅延を追加
// データフレームの内容を解析します。parseDatagram 関数に true 引数を与えると、生データフレームの表示が有効になります。
if(radar.parseDatagram(true)){
if(radar.material == 0x00){
Serial.println("毛布は検出されませんでした。");
Serial.print("測定された距離は: ");
Serial.print(radar.distance);
Serial.println(" mm");
Serial.print("超音波信号の強度は: ");
Serial.println(radar.strength);
}
}
delay(1); // プログラムの停止を防ぐために時間遅延を追加
}
コードをボードにアップロードした後、センサーを硬い素材の前に移動させます(柔らかい素材では解析データが出力されません)。以下のように解析データを確認できます:

デモ 3: UART REQ モードの使用方法
この例では、delaytime
パラメータを 1000 に設定しています。これは、1 秒ごとにコマンドクエリを送信するようにポーリングすることを意味します。そして、センサーは 9 バイトの長さの生データメッセージで測距結果をフィードバックします。
#include "sms812.h"
//#include <SoftwareSerial.h>
// SoftwareSerial で RX & TX に使用できる任意の 2 つのピンを選択
//#define RX_Pin A2
//#define TX_Pin A3
//SoftwareSerial mySerial = SoftwareSerial(RX_Pin, TX_Pin);
// ソフトウェアシリアルを使用します
//SMS812_Sensor radar = SMS812_Sensor(&mySerial);
// ハードウェアシリアルも試すことができます
SMS812_Sensor radar = SMS812_Sensor(&Serial1);
void setup() {
// 初回実行時にセットアップコードを記述
Serial.begin(115200);
Serial1.begin(115200);
pinMode(A7, INPUT);
// mySerial.begin(115200);
while(!Serial); // シリアルポートが開かれると、プログラムが実行を開始します。
Serial.println("準備完了");
radar.setUARTREQMode();
}
void loop() {
// 繰り返し実行されるメインコードを記述
radar.checkUARTREQ(1000, true); // 毎秒レーダー情報を確認します。また、生データフレーム表示をオンにします。
// データフレームの内容を解析します。関数 `parseDatagram` に true 引数を与えると、生データフレーム表示が有効になります。
if(radar.material == 0x00){
Serial.println("ブランケットは検出されませんでした。");
Serial.print("測定された距離は: ");
Serial.print(radar.distance);
Serial.println(" mm");
Serial.print("超音波信号の強度は: ");
Serial.println(radar.strength);
}
}

リソース
- [PDF] 開発マニュアル Alpha V0.2.0
- [PDF] データシート Alpha V0.1.3
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。お客様の好みやニーズに応じた複数のコミュニケーションチャネルをご用意しています。