Arduino UNOとHC-SR04で作るDIY駐車レーダーセンサー
部品と材料
| 部品名 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| 超音波センサー HC-SR04(汎用) | 1 | 実際は3個使用(左・中・右) |
| ミニバッテリーディスプレイ(TM1651チップベース) | 2 | 本来はバッテリー残量表示用だが、ここでは距離表示に流用 |
プロジェクト概要
HC-SR04超音波センサー3個(左・中・右)とミニバッテリーディスプレイ2個(左・右)で駐車支援レーダーを自作します。最大距離(デフォルト20cm)を超えると「安全=満タン表示」、それ未満では距離に比例してレベル表示が下がります。中央センサーは両側ディスプレイに影響し、左右センサーはそれぞれ自側のみに影響します。複数障害物がある場合は「最も近いもの」を優先表示します。

使用パーツ

ジャンパーワイヤーとブレッドボードを追加で用意してください。バッテリーディスプレイはTM1651チップ搭載品です。
動作ロジック
- 3つの超音波モジュール:右(R)、中(M)、左(L) / 2つのディスプレイ:右、左
- 中央センサーは両ディスプレイに影響、左右センサーは各自側のみ影響
- 右ディスプレイ表示 = min(中距離, 右距離) / 左ディスプレイ表示 = min(中距離, 左距離)
- 最大距離(Maxdistance)以上ならレベル7(満タン)、未満なら0-20cmを0-7レベルにマッピング
具体例
右側と中央に障害物があり、右がより近い場合 → 右ディスプレイは右距離に応じた低レベル、左ディスプレイは中央距離に応じたレベル。右側のみ障害物 → 右ディスプレイのみ低レベル。すべて安全距離 → 両方レベル7。




改善案
- センサーを増やしてカバー範囲拡大
- 距離数値を表示する画面追加
- 防水型超音波センサー(JSN-SR04等)への換装
- ブザー音追加
コード
Parking_sensor_v1.ino (Arduino)
/* HC-SR04 x3、TM1651バッテリーディスプレイ x2 で動作する駐車センサー
* 最大距離以上なら安全表示、未満なら距離に比例してレベル表示
* 詳細は www.SurtrTech.com 参照
*/
#include <TM1651.h>
#define CLK 3 // 右ディスプレイ CLK
#define DIO 2 // 右ディスプレイ DIO
#define CLK2 5 // 左ディスプレイ CLK
#define DIO2 4 // 左ディスプレイ DIO
#define trigPin 6 // 中央センサー
#define echoPin 7
#define trigPinR 8 // 右センサー
#define echoPinR 9
#define trigPinL 10 // 左センサー
#define echoPinL 11
#define Maxdistance 20 // 最大距離 20cm
long duration;
int distance;
TM1651 DisplayR(CLK, DIO);
TM1651 DisplayL(CLK2, DIO2);
void setup() {
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
pinMode(trigPinR, OUTPUT); pinMode(echoPinR, INPUT);
pinMode(trigPinL, OUTPUT); pinMode(echoPinL, INPUT);
DisplayR.init(); DisplayR.set(BRIGHTEST);
DisplayL.init(); DisplayL.set(BRIGHTEST);
}
void loop() {
int distanceM = CDistance(trigPin, echoPin);
int distanceR = CDistance(trigPinR, echoPinR);
int distanceL = CDistance(trigPinL, echoPinL);
int R = min(distanceM, distanceR);
int L = min(distanceM, distanceL);
if (R > 0 && R < Maxdistance) {
byte LevelR = map(R, 0, Maxdistance, 0, 7);
DisplayR.displayLevel(LevelR);
}
if (R >= Maxdistance) DisplayR.displayLevel(7);
if (L > 0 && L < Maxdistance) {
byte LevelL = map(L, 0, Maxdistance, 0, 7);
DisplayL.displayLevel(LevelL);
}
if (L >= Maxdistance) DisplayL.displayLevel(7);
delay(50);
}
int CDistance(int a, int b) {
digitalWrite(a, LOW); delayMicroseconds(2);
digitalWrite(a, HIGH); delayMicroseconds(10);
digitalWrite(a, LOW);
duration = pulseIn(b, HIGH);
distance = duration * (0.034 / 2);
return distance;
}
TM1651バッテリーディスプレイライブラリ
GitHub - fuel_display を使用すると制御が容易です。
回路図

製造プロセス
- Raspberry PiでPIRモーションセンサーとLEDを制御
- Raspberry Piで低コスト土壌水分センサーを構築 - スマート灌漑に活用
- Raspberry Pi、MCP9808、InfluxDB、Grafanaで作る家庭温度モニター
- Acconeer A111パルスレーダーをRaspberry Piと統合:実践ガイド
- エモーションセンサー&EEG:リアルタイム感情検知のための低コストハードウェア
- Firebase経由で2台のArduino間を温湿度データで連携するIoTチュートリアル
- 酸素(O2)センサーを理解する:役割、配置、故障の兆候
- Mouser Electronics、Sensors Expo 2019で先進センサ技術を展示
- レーダーセンサーの仕組みと現代的応用
- 駐車センサーの仕組みと主要アプリケーション
- Ambarella、Oculiiを3.075億ドルで買収〜レーダー認識とセンサー融合で自動車AIを拡張