概要
本記事では、Arduino Uno R4 の要素検証として、
Grove超音波センサーを用いた距離測定と、中央値による値の安定化を行います。
実証の目的
- Grove超音波センサーの距離測定動作確認
- 測定値のばらつきを確認
- 中央値による安定化の検証
対象機材
- Arduino Uno R4
- Grove Base Shield
- Grove 超音波センサー
Grove超音波センサーはデジタルポート(今回はD4)に接続して使用します。

実証内容
① 距離測定
超音波センサーにより対象物までの距離を測定します。
測定値はシリアルモニタへ出力します。
② 測定値のばらつき
単発の測定では値にばらつきがあり、安定しないケースが確認されます。
③ 中央値による安定化
複数回測定した値の中央値を採用することで、外れ値の影響を抑え、安定した距離値を取得します。
検証プログラム
#define ULTRASONIC_PIN 4
#define SAMPLE_SIZE 11 // 奇数(中央値用)
long measurements[SAMPLE_SIZE];
void setup() {
Serial.begin(115200);
}
long getDistance() {
pinMode(ULTRASONIC_PIN, OUTPUT);
digitalWrite(ULTRASONIC_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(ULTRASONIC_PIN, LOW);
pinMode(ULTRASONIC_PIN, INPUT);
long duration = pulseIn(ULTRASONIC_PIN, HIGH, 30000);
if (duration == 0) return -1;
return duration / 29 / 2; // cm
}
void sortArray(long arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (arr[i] > arr[j]) {
long tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
long getMedianDistance() {
int count = 0;
while (count < SAMPLE_SIZE) {
long d = getDistance();
if (d > 0) {
measurements[count] = d;
count++;
}
delay(10);
}
sortArray(measurements, SAMPLE_SIZE);
return measurements[SAMPLE_SIZE / 2];
}
void loop() {
long distance = getMedianDistance();
Serial.print("Median Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(500);
}
結果
- 距離測定が正常に動作することを確認
- 単発測定では値にばらつきがあることを確認
- 中央値を採用することで安定した値を取得できることを確認

考察
定番のセンサーの一つといえる超音波センサーの距離計の使い方です。
前方(壁など)までの距離が近くなると停止するという使い方をします。
超音波センサーは環境や対象物の影響を受けやすく、
測定値にばらつきが発生することを確認しました。
中央値を採用することで外れ値の影響を抑え、
安定した距離測定が可能となります。
状況によってどの程度のサンプル数からの中央値を取得するかなどは検討する必要があります。
要素検証段階においても、単純な取得だけでなく、
安定化処理を含めることが重要であると考えられます。
補足
本検証では、Grove超音波センサー(5V動作)を使用しています。
Arduino Uno R4は5Vロジックに対応しているため、そのまま利用可能です。
位置づけ(要素検証として)
本検証は、センサー単体の距離測定およびデータ安定化処理の確認であり、
要素レベルの実証に該当します。
今後は、Wi-Fi連携やROS2との統合検証へ展開していきます。

