Arduinoで作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート
必要なパーツと用品
| パーツ | 数量 |
|---|---|
| Arduino UNO | 1 |
| 超音波センサー HC-SR04 | 1 |
| サーボモーター Tower Pro MG996R | 1 |
| 圧電ブザー | 1 |
| ブレッドボード | 1 |
| ジャンパーワイヤー (オス/メス) | 1式 |
| プラスチックケース (収納用) | 1 |
必要な工具
- カッターナイフ (ケース加工用)
使用アプリとオンラインサービス
- Arduino IDE
- Processing IDE (レーダー画面表示用)
プロジェクト概要
システム説明
このプロジェクトは、Arduino UNO、サーボモーター、超音波センサー、圧電ブザーで構成されるセキュリティシステムです。
- 超音波センサーが検知範囲内の物体を感知するとブザーが作動
- センサーデータはProcessing IDEに送られ、レーダー風のグラフィカルマップとして表示
- サーボモーターで超音波センサーを旋回させ、広範囲をカバー
所要時間は約1時間程度のシンプルなプロジェクトです。
配線手順
- 超音波センサーのTrigピン → Arduinoピン2
- Echoピン → Arduinoピン3
- Vcc → 5V、GND → GND
- ブザーのプラス極 → Arduinoピン10、マイナス極 → GND
- サーボの黒線 → GND、赤線 → 5V、黄/橙線 (信号) → Arduinoピン9
- Arduinoの5V・GNDをブレッドボードの電源ラインに接続
配線完後、すべてをプラスチックケースに収納します。
ソースコード
Arduinoスケッチ (Security System_IDE)
#include <Servo.h>
int tPin = 2; // Trig
int ePin = 3; // Echo
int buz = 10; // Buzzer
int d1, d2;
int i = 0;
int sdistance;
Servo myServo;
void setup() {
Serial.begin(9600);
pinMode(tPin, OUTPUT);
pinMode(ePin, INPUT);
pinMode(buz, OUTPUT);
myServo.attach(9);
}
void loop() {
// 0度から180度まで10度刻みでスキャン
for (i = 0; i <= 180; i += 10) {
myServo.write(i);
delay(30);
d2 = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(d2);
Serial.print(".");
}
// 180度から0度へ戻りスキャン
for (i = 180; i > 0; i -= 10) {
myServo.write(i);
delay(30);
d2 = calculateDistance();
Serial.print(i);
Serial.print(",");
Serial.print(d2);
Serial.print(".");
}
}
int calculateDistance() {
digitalWrite(tPin, HIGH);
delayMicroseconds(10); // 10μsパルス (元コードの1000msは誤りと思われる)
digitalWrite(tPin, LOW);
d1 = pulseIn(ePin, HIGH);
d2 = d1 * 0.0171821306; // cm換算
if (d2 < 10) {
digitalWrite(buz, HIGH); // 10cm以内でブザーON
} else {
digitalWrite(buz, LOW);
}
return d2;
}
Processingスケッチ (レーダー表示)
import processing.serial.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
Serial myPort;
String angle = "", distance = "", data = "", noObject;
float pixsDistance;
int iAngle, iDistance;
int index1 = 0, index2 = 0;
PFont orcFont;
void setup() {
size(1366, 768); // ★ご自身の画面解像度に変更してください
smooth();
myPort = new Serial(this, "COM3", 9600); // ★COMポート番号を環境に合わせて変更
myPort.bufferUntil('.');
}
void draw() {
fill(98, 245, 31);
noStroke();
fill(0, 4);
rect(0, 0, width, height - height * 0.065);
fill(98, 245, 31);
drawRadar();
drawLine();
drawObject();
drawText();
}
void serialEvent(Serial myPort) {
data = myPort.readStringUntil('.');
if (data == null) return;
data = data.substring(0, data.length() - 1);
index1 = data.indexOf(",");
angle = data.substring(0, index1);
distance = data.substring(index1 + 1, data.length());
iAngle = int(angle);
iDistance = int(distance);
}
void drawRadar() {
pushMatrix();
translate(width / 2, height - height * 0.074);
noFill();
strokeWeight(2);
stroke(98, 245, 31);
// 同心円
arc(0, 0, width - width * 0.0625, width - width * 0.0625, PI, TWO_PI);
arc(0, 0, width - width * 0.27, width - width * 0.27, PI, TWO_PI);
arc(0, 0, width - width * 0.479, width - width * 0.479, PI, TWO_PI);
arc(0, 0, width - width * 0.687, width - width * 0.687, PI, TWO_PI);
// 角度線
line(-width / 2, 0, width / 2, 0);
line(0, 0, (-width / 2) * cos(radians(30)), (-width / 2) * sin(radians(30)));
line(0, 0, (-width / 2) * cos(radians(60)), (-width / 2) * sin(radians(60)));
line(0, 0, (-width / 2) * cos(radians(90)), (-width / 2) * sin(radians(90)));
line(0, 0, (-width / 2) * cos(radians(120)), (-width / 2) * sin(radians(120)));
line(0, 0, (-width / 2) * cos(radians(150)), (-width / 2) * sin(radians(150)));
line((-width / 2) * cos(radians(30)), 0, width / 2, 0);
popMatrix();
}
void drawObject() {
pushMatrix();
translate(width / 2, height - height * 0.074);
strokeWeight(9);
stroke(255, 10, 10); // 赤で物体表示
pixsDistance = iDistance * ((height - height * 0.1666) * 0.025);
if (iDistance < 40) { // 40cm以内のみ表示
line(pixsDistance * cos(radians(iAngle)), -pixsDistance * sin(radians(iAngle)),
(width - width * 0.505) * cos(radians(iAngle)), -(width - width * 0.505) * sin(radians(iAngle)));
}
popMatrix();
}
void drawLine() {
pushMatrix();
strokeWeight(9);
stroke(30, 250, 60); // 緑でスキャンライン表示
translate(width / 2, height - height * 0.074);
line(0, 0, (height - height * 0.12) * cos(radians(iAngle)), -(height - height * 0.12) * sin(radians(iAngle)));
popMatrix();
}
void drawText() {
pushMatrix();
if (iDistance > 40) noObject = "Out of Range";
else noObject = "In Range";
fill(0, 0, 0);
noStroke();
rect(0, height - height * 0.0648, width, height);
fill(98, 245, 31);
textSize(25);
text("2cm", width - width * 0.3854, height - height * 0.0833);
text("4cm", width - width * 0.281, height - height * 0.0833);
text("6cm", width - width * 0.177, height - height * 0.0833);
text("10cm", width - width * 0.0729, height - height * 0.0833);
textSize(40);
text("Angle: " + iAngle + " ", width - width * 0.48, height - height * 0.0277);
text("Distance: ", width - width * 0.26, height - height * 0.0277);
if (iDistance < 40) text(" " + iDistance + " cm", width - width * 0.225, height - height * 0.0277);
// 角度ラベル描画 (30, 60, 90, 120, 150度)
// ... (省略: 元コードの座標計算ロジックを維持)
popMatrix();
}
回路図
注意: 元のArduinoコード内で delayMicroseconds(1000) とありますが、HC-SR04のTrigパルスは10μs以上が仕様です。上記コードでは delayMicroseconds(10) に修正しています。
製造プロセス
- TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
- Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ゲーム用カスタムArduinoジョイスティックハンドルの製作