工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoで作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート

必要なパーツと用品

パーツ数量
Arduino UNO1
超音波センサー HC-SR041
サーボモーター Tower Pro MG996R1
圧電ブザー1
ブレッドボード1
ジャンパーワイヤー (オス/メス)1式
プラスチックケース (収納用)1

必要な工具

使用アプリとオンラインサービス

プロジェクト概要

Arduinoで作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート
Arduinoで作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート

システム説明

このプロジェクトは、Arduino UNO、サーボモーター、超音波センサー、圧電ブザーで構成されるセキュリティシステムです。

所要時間は約1時間程度のシンプルなプロジェクトです。

配線手順

  1. 超音波センサーのTrigピン → Arduinoピン2
  2. Echoピン → Arduinoピン3
  3. Vcc → 5V、GND → GND
  4. ブザーのプラス極 → Arduinoピン10、マイナス極 → GND
  5. サーボの黒線 → GND、赤線 → 5V、黄/橙線 (信号) → Arduinoピン9
  6. 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で作るセキュリティシステム:超音波センサーとサーボで広範囲監視・アラート
ブレッドボード上の配線図

注意: 元のArduinoコード内で delayMicroseconds(1000) とありますが、HC-SR04のTrigパルスは10μs以上が仕様です。上記コードでは delayMicroseconds(10) に修正しています。

製造プロセス

  1. TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
  2. Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
  3. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  4. Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
  5. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  6. DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
  7. Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
  8. MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
  9. Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
  10. Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
  11. ゲーム用カスタムArduinoジョイスティックハンドルの製作