ระบบเรดาร์โดยใช้ Arduino UNO

การสร้างระบบเรดาร์แบบทำเองโดยใช้เซ็นเซอร์อัลตราซาวนด์และ Arduino UNO

ระบบเรดาร์โดยใช้ Arduino UNO

ส่วนประกอบและวัสดุสิ้นเปลือง

  • เซอร์โวไมโคร 1 9G
  • อาดูโน่ ยูโน่ 1 เครื่อง
  • 1 บัซเซอร์
  • สาย USB ชนิด A/B จำนวน 1 เส้น
  • สวิตช์เลื่อน 1 ตัว
  • ตัวต้านทาน 1 1k
  • ตัวต้านทาน 4 220 โอห์ม
  • 1 เซ็นเซอร์อัลตราโซนิก HC-SR04
  • สายจัมเปอร์ 25
  • ไฟ LED สีแดง 2 ดวง
  • ไฟ LED สีเขียว 1 ดวง

แอปและแพลตฟอร์ม

รายละเอียดโครงการ

การแนะนำ

ระบบเรดาร์ซึ่งโดยปกติจะซับซ้อนและมีราคาแพงนั้น ปัจจุบันสามารถเข้าถึงได้โดยผู้ที่ชื่นชอบและผู้ผลิตด้วย Arduino Uno เราจะมาสำรวจวิธีการสร้างระบบเรดาร์ขั้นพื้นฐานโดยใช้ไมโครคอนโทรลเลอร์ยอดนิยมนี้ โดยเน้นที่หลักการพื้นฐานของการวัดระยะทางและการตรวจจับวัตถุ นี่ไม่ใช่เรื่องของเวทมนตร์หรือพลังพิเศษ แต่เป็นเรื่องของการประยุกต์ใช้ระบบอิเล็กทรอนิกส์ในทางปฏิบัติและการเขียนโปรแกรมเพื่อสร้างเซ็นเซอร์ที่ใช้งานได้จริงซึ่งจะทำแผนที่สภาพแวดล้อม

ระบบเรดาร์แบบทำเองนี้จะหมุนไปทางซ้ายและขวาเพื่อสแกนหาวัตถุในพื้นที่ที่กำหนดโดยใช้เซ็นเซอร์อัลตราโซนิก อุปกรณ์นี้ควบคุมด้วยสวิตช์เลื่อนเพื่อเปิดและปิดเครื่อง มี LED สามดวงและบัซเซอร์หนึ่งตัวติดตั้งอยู่บนแผงทดลอง LED สีแดงดวงแรกจะเปิดขึ้นเมื่ออุปกรณ์เปิดอยู่เพื่อระบุสถานะ LED สีเขียวจะเปิดขึ้นเฉพาะเมื่อเครื่องทำงานและกำลังค้นหาวัตถุ LED สีแดงดวงที่สองจะกะพริบเฉพาะเมื่อเรดาร์ตรวจพบบางสิ่งภายในระยะ โดยความเร็วในการกะพริบจะขึ้นอยู่กับระยะห่างจากเซ็นเซอร์ไปยังวัตถุที่ตรวจพบ บัซเซอร์ทำหน้าที่เป็นตัวบ่งชี้เมื่อเซ็นเซอร์ตรวจพบบางสิ่งภายในระยะที่กำหนด

การตั้งค่า

ในการตั้งค่าระบบเรดาร์ เราจะใช้โปรแกรมสองโปรแกรม โปรดดูลิงก์ดาวน์โหลดในส่วนแอปและแพลตฟอร์ม

โปรแกรมแรกคือ Arduino IDE ซึ่งช่วยให้เราสามารถส่งรหัสโดยตรงไปยังอุปกรณ์ Arduino ของเรา หลังจากติดตั้งซอฟต์แวร์แล้ว ให้สร้าง Sketch ใหม่และวางสคริปต์ที่กำหนดไว้ด้านล่าง หากคุณทำตามภาพการเดินสาย คุณก็ควรจะตั้งค่าทุกอย่างเรียบร้อยแล้ว อย่างไรก็ตาม หากคุณเปลี่ยนพอร์ตใดๆ ของส่วนประกอบ ตรวจสอบให้แน่ใจว่าได้เปลี่ยนตัวแปรที่จัดเก็บหมายเลขพินด้วย หลังจากเชื่อมต่อ Arduino เข้ากับพีซีโดยใช้สาย USB-A ถึง USB-B ที่มุมล่างขวา คุณควรเห็นบางอย่างตามแนวของArduino UNO บน COM6 COM[หมายเลขของคุณ] ของคุณจะมีความสำคัญในภายหลัง

เราสามารถตรวจสอบค่าเรดาร์ได้โดยใช้โปรแกรมที่เรียกว่า Processing ซึ่งจะสร้างอินเทอร์เฟซที่ต้องการสำหรับโครงการ หลังจากติดตั้งแล้ว ให้สร้าง Sketch ใหม่และวางโค้ดที่ให้มา มีบางสิ่งที่คุณจะต้องเปลี่ยนแปลงก่อนที่จะรันโปรแกรม ในบรรทัด 24 ให้เปลี่ยนค่าเป็นความละเอียดของจอภาพของคุณ และในบรรทัด 26 ให้เปลี่ยนพารามิเตอร์ที่สองเป็นพอร์ต COM ที่คุณเจอมาก่อนหน้านี้ หลังจากเปลี่ยนแปลงทุกอย่างแล้ว คุณก็พร้อมแล้ว! ไปที่ Arduino IDE แล้วคลิกที่Upload ที่มุมบนซ้าย รอสองสามวินาทีจนกว่าจะส่งโค้ดไปยังอุปกรณ์ของคุณ จากนั้นกลับไปที่ Processing แล้วเริ่มโปรแกรม หากทำทุกอย่างถูกต้อง เส้นสีเขียวในแอปพลิเคชันของคุณและสแกนเนอร์แบบหมุนควรจะซิงค์กัน สนุกได้เลย!

รหัส

สคริปต์เรดาร์สำหรับการประมวลผล Java

import processing.serial.*; 
import  java.awt.event.KeyEvent;
import java.io.IOException;

Serial myPort;

String angle = "";
String distance = "";
String data = "";

String  noObject;

float pixsDistance;

int iAngle, iDistance;

int index1 = 0;
int index2 = 0;

PFont orcFont;


void setup() {
 size(1920, 1080);  // !!! change these values to your screen's resolution !!!
 smooth();
 myPort = new Serial(this, "COM6",  9600); // !!! CHANGE THE SECOND PARAMETER TO YOUR CUSTOM COM PORT !!!
 myPort.bufferUntil('.'); // actually reading:  angle,distance.
}

void draw() {
  fill(98, 245, 31);
  
  noStroke();
  
  fill(0, 4); 
  rect(0, 0, width, height-height * 0.065); 
  
  fill(98, 245, 31); // green

  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}

void serialEvent(Serial myPort) { // reading data from the Serial Port
  data = myPort.readStringUntil('.');
  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);
  
  // drawing the arc lines
  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);
  
  // drawing the  angle lines
  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); // red 
  pixsDistance = iDistance*((height - height * 0.1666) * 0.025); // converting the distance from cm to pixels
  
  if (iDistance<40) { // limiting the range to 40 cm
    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();
}

// drawing the text on the screen
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("10cm", width - width * 0.3854, height - height * 0.0833);
  text("20cm", width - width * 0.281, height - height * 0.0833);
  text("30cm", width - width * 0.177, height - height * 0.0833);
  text("40cm", 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);
    fill(255, 10, 10);
    text("WARNING!", width - width * 0.875, height - height * 0.0277);
  }
  
  textSize(25);
  fill(98, 245, 60);
  translate((width - width * 0.4994) + width / 2 * cos(radians(30)), (height - height * 0.0907) - width / 2 * sin(radians(30)));
  rotate(-radians(-60));
  text("30°", 0, 0);
  resetMatrix();
  translate((width - width * 0.503) + width / 2 * cos(radians(60)), (height - height * 0.0888) - width / 2 * sin(radians(60)));
  rotate(-radians(-30));
  text("60°", 0, 0);
  resetMatrix();
  translate((width - width * 0.507) + width / 2 * cos(radians(90)), (height - height * 0.0833) - width / 2 * sin(radians(90)));
  rotate(radians(0)); 
  text("90°", 0, 0);
  resetMatrix();
  translate(width - width * 0.513 + width / 2 * cos(radians(120)), (height - height * 0.07129) -width / 2 * sin(radians(120)));
  rotate(radians(-30));
  text("120°", 0, 0);
  resetMatrix();
  translate((width - width * 0.5104) + width / 2 * cos(radians(150)), (height - height * 0.0574) - width / 2 * sin(radians(150)));
  rotate(radians(-60));
  text("150°", 0, 0);
  popMatrix(); 
}

สคริปต์เรดาร์สำหรับ Arduino IDE cpp

#include <Servo.h> 

// variables
const int trigPin = 2;
const int echoPin  = 9;

long duration;
int  distance;

int buzzpin = 7;
int buzzState = LOW;

int ledRed = 3;
int ledGreen = 4;

int switchpin = 10;
int ledStatus = 8;

byte leds = 0;

bool canSpin = true;

unsigned long previousMillis = 0;

const long intervalFar = 250;
const long intervalClose = 50;
const long intervalIdle = 1250;

Servo myServo; 


void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600);
  myServo.attach(12); 
  pinMode(buzzpin, OUTPUT);
  Serial.begin(9600);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(switchpin, INPUT);
  pinMode(ledStatus, OUTPUT);
}

// turning the radar on-off
void loop() {
  if (digitalRead(switchpin) == HIGH){
    digitalWrite(ledStatus, LOW);
    StartScan();
  }
  if (digitalRead(switchpin) == LOW){
    digitalWrite(ledStatus, HIGH);
  }
}

// calculating the distance to a detected object
int calculateDistance(){ 
  digitalWrite(trigPin,  LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // reads echoPin and returns the sound wave travel time (ms)
  distance = duration * 0.034 / 2;
  return distance;
}

// start scanning for objects
void StartScan() {
  // checking for every degree

  // first from right to left
  for (int i = 15; i <= 165; i++) {  
    myServo.write(i);
    delay(30);
    distance = calculateDistance();

    // checking if something is detected in the 40 cm range
    if (distance <= 40 && distance > 20) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalFar) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance <= 20 && distance > 0) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalClose) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance > 40) {
      digitalWrite(buzzpin, LOW);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledRed, HIGH); 
    }
      
    Serial.print(i); 
    Serial.print(","); 
    Serial.print(distance);  
    Serial.print(".");
  }

  // then from left to right
  for (int i = 165; i >= 15; i--) {  
    myServo.write(i);
    delay(30);
    distance  = calculateDistance();

    if (distance <= 40 && distance > 20) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalFar) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance <= 20 && distance > 0) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalClose) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance > 40) {
      digitalWrite(buzzpin, LOW);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledRed, HIGH); 
    }

    Serial.print(i);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }
}

การเดินสายเรดาร์

ระบบเรดาร์โดยใช้ Arduino UNO

การสร้างระบบเรดาร์แบบทำเองโดยใช้เซ็นเซอร์อัลตราซาวนด์และ Arduino UNO

นักเขียนบทความ
by 
นักเขียนบทความ
ระบบเรดาร์โดยใช้ Arduino UNO

ระบบเรดาร์โดยใช้ Arduino UNO

การสร้างระบบเรดาร์แบบทำเองโดยใช้เซ็นเซอร์อัลตราซาวนด์และ Arduino UNO

ส่วนประกอบและวัสดุสิ้นเปลือง

  • เซอร์โวไมโคร 1 9G
  • อาดูโน่ ยูโน่ 1 เครื่อง
  • 1 บัซเซอร์
  • สาย USB ชนิด A/B จำนวน 1 เส้น
  • สวิตช์เลื่อน 1 ตัว
  • ตัวต้านทาน 1 1k
  • ตัวต้านทาน 4 220 โอห์ม
  • 1 เซ็นเซอร์อัลตราโซนิก HC-SR04
  • สายจัมเปอร์ 25
  • ไฟ LED สีแดง 2 ดวง
  • ไฟ LED สีเขียว 1 ดวง

แอปและแพลตฟอร์ม

รายละเอียดโครงการ

การแนะนำ

ระบบเรดาร์ซึ่งโดยปกติจะซับซ้อนและมีราคาแพงนั้น ปัจจุบันสามารถเข้าถึงได้โดยผู้ที่ชื่นชอบและผู้ผลิตด้วย Arduino Uno เราจะมาสำรวจวิธีการสร้างระบบเรดาร์ขั้นพื้นฐานโดยใช้ไมโครคอนโทรลเลอร์ยอดนิยมนี้ โดยเน้นที่หลักการพื้นฐานของการวัดระยะทางและการตรวจจับวัตถุ นี่ไม่ใช่เรื่องของเวทมนตร์หรือพลังพิเศษ แต่เป็นเรื่องของการประยุกต์ใช้ระบบอิเล็กทรอนิกส์ในทางปฏิบัติและการเขียนโปรแกรมเพื่อสร้างเซ็นเซอร์ที่ใช้งานได้จริงซึ่งจะทำแผนที่สภาพแวดล้อม

ระบบเรดาร์แบบทำเองนี้จะหมุนไปทางซ้ายและขวาเพื่อสแกนหาวัตถุในพื้นที่ที่กำหนดโดยใช้เซ็นเซอร์อัลตราโซนิก อุปกรณ์นี้ควบคุมด้วยสวิตช์เลื่อนเพื่อเปิดและปิดเครื่อง มี LED สามดวงและบัซเซอร์หนึ่งตัวติดตั้งอยู่บนแผงทดลอง LED สีแดงดวงแรกจะเปิดขึ้นเมื่ออุปกรณ์เปิดอยู่เพื่อระบุสถานะ LED สีเขียวจะเปิดขึ้นเฉพาะเมื่อเครื่องทำงานและกำลังค้นหาวัตถุ LED สีแดงดวงที่สองจะกะพริบเฉพาะเมื่อเรดาร์ตรวจพบบางสิ่งภายในระยะ โดยความเร็วในการกะพริบจะขึ้นอยู่กับระยะห่างจากเซ็นเซอร์ไปยังวัตถุที่ตรวจพบ บัซเซอร์ทำหน้าที่เป็นตัวบ่งชี้เมื่อเซ็นเซอร์ตรวจพบบางสิ่งภายในระยะที่กำหนด

การตั้งค่า

ในการตั้งค่าระบบเรดาร์ เราจะใช้โปรแกรมสองโปรแกรม โปรดดูลิงก์ดาวน์โหลดในส่วนแอปและแพลตฟอร์ม

โปรแกรมแรกคือ Arduino IDE ซึ่งช่วยให้เราสามารถส่งรหัสโดยตรงไปยังอุปกรณ์ Arduino ของเรา หลังจากติดตั้งซอฟต์แวร์แล้ว ให้สร้าง Sketch ใหม่และวางสคริปต์ที่กำหนดไว้ด้านล่าง หากคุณทำตามภาพการเดินสาย คุณก็ควรจะตั้งค่าทุกอย่างเรียบร้อยแล้ว อย่างไรก็ตาม หากคุณเปลี่ยนพอร์ตใดๆ ของส่วนประกอบ ตรวจสอบให้แน่ใจว่าได้เปลี่ยนตัวแปรที่จัดเก็บหมายเลขพินด้วย หลังจากเชื่อมต่อ Arduino เข้ากับพีซีโดยใช้สาย USB-A ถึง USB-B ที่มุมล่างขวา คุณควรเห็นบางอย่างตามแนวของArduino UNO บน COM6 COM[หมายเลขของคุณ] ของคุณจะมีความสำคัญในภายหลัง

เราสามารถตรวจสอบค่าเรดาร์ได้โดยใช้โปรแกรมที่เรียกว่า Processing ซึ่งจะสร้างอินเทอร์เฟซที่ต้องการสำหรับโครงการ หลังจากติดตั้งแล้ว ให้สร้าง Sketch ใหม่และวางโค้ดที่ให้มา มีบางสิ่งที่คุณจะต้องเปลี่ยนแปลงก่อนที่จะรันโปรแกรม ในบรรทัด 24 ให้เปลี่ยนค่าเป็นความละเอียดของจอภาพของคุณ และในบรรทัด 26 ให้เปลี่ยนพารามิเตอร์ที่สองเป็นพอร์ต COM ที่คุณเจอมาก่อนหน้านี้ หลังจากเปลี่ยนแปลงทุกอย่างแล้ว คุณก็พร้อมแล้ว! ไปที่ Arduino IDE แล้วคลิกที่Upload ที่มุมบนซ้าย รอสองสามวินาทีจนกว่าจะส่งโค้ดไปยังอุปกรณ์ของคุณ จากนั้นกลับไปที่ Processing แล้วเริ่มโปรแกรม หากทำทุกอย่างถูกต้อง เส้นสีเขียวในแอปพลิเคชันของคุณและสแกนเนอร์แบบหมุนควรจะซิงค์กัน สนุกได้เลย!

รหัส

สคริปต์เรดาร์สำหรับการประมวลผล Java

import processing.serial.*; 
import  java.awt.event.KeyEvent;
import java.io.IOException;

Serial myPort;

String angle = "";
String distance = "";
String data = "";

String  noObject;

float pixsDistance;

int iAngle, iDistance;

int index1 = 0;
int index2 = 0;

PFont orcFont;


void setup() {
 size(1920, 1080);  // !!! change these values to your screen's resolution !!!
 smooth();
 myPort = new Serial(this, "COM6",  9600); // !!! CHANGE THE SECOND PARAMETER TO YOUR CUSTOM COM PORT !!!
 myPort.bufferUntil('.'); // actually reading:  angle,distance.
}

void draw() {
  fill(98, 245, 31);
  
  noStroke();
  
  fill(0, 4); 
  rect(0, 0, width, height-height * 0.065); 
  
  fill(98, 245, 31); // green

  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}

void serialEvent(Serial myPort) { // reading data from the Serial Port
  data = myPort.readStringUntil('.');
  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);
  
  // drawing the arc lines
  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);
  
  // drawing the  angle lines
  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); // red 
  pixsDistance = iDistance*((height - height * 0.1666) * 0.025); // converting the distance from cm to pixels
  
  if (iDistance<40) { // limiting the range to 40 cm
    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();
}

// drawing the text on the screen
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("10cm", width - width * 0.3854, height - height * 0.0833);
  text("20cm", width - width * 0.281, height - height * 0.0833);
  text("30cm", width - width * 0.177, height - height * 0.0833);
  text("40cm", 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);
    fill(255, 10, 10);
    text("WARNING!", width - width * 0.875, height - height * 0.0277);
  }
  
  textSize(25);
  fill(98, 245, 60);
  translate((width - width * 0.4994) + width / 2 * cos(radians(30)), (height - height * 0.0907) - width / 2 * sin(radians(30)));
  rotate(-radians(-60));
  text("30°", 0, 0);
  resetMatrix();
  translate((width - width * 0.503) + width / 2 * cos(radians(60)), (height - height * 0.0888) - width / 2 * sin(radians(60)));
  rotate(-radians(-30));
  text("60°", 0, 0);
  resetMatrix();
  translate((width - width * 0.507) + width / 2 * cos(radians(90)), (height - height * 0.0833) - width / 2 * sin(radians(90)));
  rotate(radians(0)); 
  text("90°", 0, 0);
  resetMatrix();
  translate(width - width * 0.513 + width / 2 * cos(radians(120)), (height - height * 0.07129) -width / 2 * sin(radians(120)));
  rotate(radians(-30));
  text("120°", 0, 0);
  resetMatrix();
  translate((width - width * 0.5104) + width / 2 * cos(radians(150)), (height - height * 0.0574) - width / 2 * sin(radians(150)));
  rotate(radians(-60));
  text("150°", 0, 0);
  popMatrix(); 
}

สคริปต์เรดาร์สำหรับ Arduino IDE cpp

#include <Servo.h> 

// variables
const int trigPin = 2;
const int echoPin  = 9;

long duration;
int  distance;

int buzzpin = 7;
int buzzState = LOW;

int ledRed = 3;
int ledGreen = 4;

int switchpin = 10;
int ledStatus = 8;

byte leds = 0;

bool canSpin = true;

unsigned long previousMillis = 0;

const long intervalFar = 250;
const long intervalClose = 50;
const long intervalIdle = 1250;

Servo myServo; 


void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600);
  myServo.attach(12); 
  pinMode(buzzpin, OUTPUT);
  Serial.begin(9600);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(switchpin, INPUT);
  pinMode(ledStatus, OUTPUT);
}

// turning the radar on-off
void loop() {
  if (digitalRead(switchpin) == HIGH){
    digitalWrite(ledStatus, LOW);
    StartScan();
  }
  if (digitalRead(switchpin) == LOW){
    digitalWrite(ledStatus, HIGH);
  }
}

// calculating the distance to a detected object
int calculateDistance(){ 
  digitalWrite(trigPin,  LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // reads echoPin and returns the sound wave travel time (ms)
  distance = duration * 0.034 / 2;
  return distance;
}

// start scanning for objects
void StartScan() {
  // checking for every degree

  // first from right to left
  for (int i = 15; i <= 165; i++) {  
    myServo.write(i);
    delay(30);
    distance = calculateDistance();

    // checking if something is detected in the 40 cm range
    if (distance <= 40 && distance > 20) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalFar) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance <= 20 && distance > 0) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalClose) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance > 40) {
      digitalWrite(buzzpin, LOW);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledRed, HIGH); 
    }
      
    Serial.print(i); 
    Serial.print(","); 
    Serial.print(distance);  
    Serial.print(".");
  }

  // then from left to right
  for (int i = 165; i >= 15; i--) {  
    myServo.write(i);
    delay(30);
    distance  = calculateDistance();

    if (distance <= 40 && distance > 20) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalFar) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance <= 20 && distance > 0) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalClose) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance > 40) {
      digitalWrite(buzzpin, LOW);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledRed, HIGH); 
    }

    Serial.print(i);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }
}

การเดินสายเรดาร์

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

ระบบเรดาร์โดยใช้ Arduino UNO

ระบบเรดาร์โดยใช้ Arduino UNO

การสร้างระบบเรดาร์แบบทำเองโดยใช้เซ็นเซอร์อัลตราซาวนด์และ Arduino UNO

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

ส่วนประกอบและวัสดุสิ้นเปลือง

  • เซอร์โวไมโคร 1 9G
  • อาดูโน่ ยูโน่ 1 เครื่อง
  • 1 บัซเซอร์
  • สาย USB ชนิด A/B จำนวน 1 เส้น
  • สวิตช์เลื่อน 1 ตัว
  • ตัวต้านทาน 1 1k
  • ตัวต้านทาน 4 220 โอห์ม
  • 1 เซ็นเซอร์อัลตราโซนิก HC-SR04
  • สายจัมเปอร์ 25
  • ไฟ LED สีแดง 2 ดวง
  • ไฟ LED สีเขียว 1 ดวง

แอปและแพลตฟอร์ม

รายละเอียดโครงการ

การแนะนำ

ระบบเรดาร์ซึ่งโดยปกติจะซับซ้อนและมีราคาแพงนั้น ปัจจุบันสามารถเข้าถึงได้โดยผู้ที่ชื่นชอบและผู้ผลิตด้วย Arduino Uno เราจะมาสำรวจวิธีการสร้างระบบเรดาร์ขั้นพื้นฐานโดยใช้ไมโครคอนโทรลเลอร์ยอดนิยมนี้ โดยเน้นที่หลักการพื้นฐานของการวัดระยะทางและการตรวจจับวัตถุ นี่ไม่ใช่เรื่องของเวทมนตร์หรือพลังพิเศษ แต่เป็นเรื่องของการประยุกต์ใช้ระบบอิเล็กทรอนิกส์ในทางปฏิบัติและการเขียนโปรแกรมเพื่อสร้างเซ็นเซอร์ที่ใช้งานได้จริงซึ่งจะทำแผนที่สภาพแวดล้อม

ระบบเรดาร์แบบทำเองนี้จะหมุนไปทางซ้ายและขวาเพื่อสแกนหาวัตถุในพื้นที่ที่กำหนดโดยใช้เซ็นเซอร์อัลตราโซนิก อุปกรณ์นี้ควบคุมด้วยสวิตช์เลื่อนเพื่อเปิดและปิดเครื่อง มี LED สามดวงและบัซเซอร์หนึ่งตัวติดตั้งอยู่บนแผงทดลอง LED สีแดงดวงแรกจะเปิดขึ้นเมื่ออุปกรณ์เปิดอยู่เพื่อระบุสถานะ LED สีเขียวจะเปิดขึ้นเฉพาะเมื่อเครื่องทำงานและกำลังค้นหาวัตถุ LED สีแดงดวงที่สองจะกะพริบเฉพาะเมื่อเรดาร์ตรวจพบบางสิ่งภายในระยะ โดยความเร็วในการกะพริบจะขึ้นอยู่กับระยะห่างจากเซ็นเซอร์ไปยังวัตถุที่ตรวจพบ บัซเซอร์ทำหน้าที่เป็นตัวบ่งชี้เมื่อเซ็นเซอร์ตรวจพบบางสิ่งภายในระยะที่กำหนด

การตั้งค่า

ในการตั้งค่าระบบเรดาร์ เราจะใช้โปรแกรมสองโปรแกรม โปรดดูลิงก์ดาวน์โหลดในส่วนแอปและแพลตฟอร์ม

โปรแกรมแรกคือ Arduino IDE ซึ่งช่วยให้เราสามารถส่งรหัสโดยตรงไปยังอุปกรณ์ Arduino ของเรา หลังจากติดตั้งซอฟต์แวร์แล้ว ให้สร้าง Sketch ใหม่และวางสคริปต์ที่กำหนดไว้ด้านล่าง หากคุณทำตามภาพการเดินสาย คุณก็ควรจะตั้งค่าทุกอย่างเรียบร้อยแล้ว อย่างไรก็ตาม หากคุณเปลี่ยนพอร์ตใดๆ ของส่วนประกอบ ตรวจสอบให้แน่ใจว่าได้เปลี่ยนตัวแปรที่จัดเก็บหมายเลขพินด้วย หลังจากเชื่อมต่อ Arduino เข้ากับพีซีโดยใช้สาย USB-A ถึง USB-B ที่มุมล่างขวา คุณควรเห็นบางอย่างตามแนวของArduino UNO บน COM6 COM[หมายเลขของคุณ] ของคุณจะมีความสำคัญในภายหลัง

เราสามารถตรวจสอบค่าเรดาร์ได้โดยใช้โปรแกรมที่เรียกว่า Processing ซึ่งจะสร้างอินเทอร์เฟซที่ต้องการสำหรับโครงการ หลังจากติดตั้งแล้ว ให้สร้าง Sketch ใหม่และวางโค้ดที่ให้มา มีบางสิ่งที่คุณจะต้องเปลี่ยนแปลงก่อนที่จะรันโปรแกรม ในบรรทัด 24 ให้เปลี่ยนค่าเป็นความละเอียดของจอภาพของคุณ และในบรรทัด 26 ให้เปลี่ยนพารามิเตอร์ที่สองเป็นพอร์ต COM ที่คุณเจอมาก่อนหน้านี้ หลังจากเปลี่ยนแปลงทุกอย่างแล้ว คุณก็พร้อมแล้ว! ไปที่ Arduino IDE แล้วคลิกที่Upload ที่มุมบนซ้าย รอสองสามวินาทีจนกว่าจะส่งโค้ดไปยังอุปกรณ์ของคุณ จากนั้นกลับไปที่ Processing แล้วเริ่มโปรแกรม หากทำทุกอย่างถูกต้อง เส้นสีเขียวในแอปพลิเคชันของคุณและสแกนเนอร์แบบหมุนควรจะซิงค์กัน สนุกได้เลย!

รหัส

สคริปต์เรดาร์สำหรับการประมวลผล Java

import processing.serial.*; 
import  java.awt.event.KeyEvent;
import java.io.IOException;

Serial myPort;

String angle = "";
String distance = "";
String data = "";

String  noObject;

float pixsDistance;

int iAngle, iDistance;

int index1 = 0;
int index2 = 0;

PFont orcFont;


void setup() {
 size(1920, 1080);  // !!! change these values to your screen's resolution !!!
 smooth();
 myPort = new Serial(this, "COM6",  9600); // !!! CHANGE THE SECOND PARAMETER TO YOUR CUSTOM COM PORT !!!
 myPort.bufferUntil('.'); // actually reading:  angle,distance.
}

void draw() {
  fill(98, 245, 31);
  
  noStroke();
  
  fill(0, 4); 
  rect(0, 0, width, height-height * 0.065); 
  
  fill(98, 245, 31); // green

  drawRadar(); 
  drawLine();
  drawObject();
  drawText();
}

void serialEvent(Serial myPort) { // reading data from the Serial Port
  data = myPort.readStringUntil('.');
  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);
  
  // drawing the arc lines
  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);
  
  // drawing the  angle lines
  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); // red 
  pixsDistance = iDistance*((height - height * 0.1666) * 0.025); // converting the distance from cm to pixels
  
  if (iDistance<40) { // limiting the range to 40 cm
    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();
}

// drawing the text on the screen
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("10cm", width - width * 0.3854, height - height * 0.0833);
  text("20cm", width - width * 0.281, height - height * 0.0833);
  text("30cm", width - width * 0.177, height - height * 0.0833);
  text("40cm", 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);
    fill(255, 10, 10);
    text("WARNING!", width - width * 0.875, height - height * 0.0277);
  }
  
  textSize(25);
  fill(98, 245, 60);
  translate((width - width * 0.4994) + width / 2 * cos(radians(30)), (height - height * 0.0907) - width / 2 * sin(radians(30)));
  rotate(-radians(-60));
  text("30°", 0, 0);
  resetMatrix();
  translate((width - width * 0.503) + width / 2 * cos(radians(60)), (height - height * 0.0888) - width / 2 * sin(radians(60)));
  rotate(-radians(-30));
  text("60°", 0, 0);
  resetMatrix();
  translate((width - width * 0.507) + width / 2 * cos(radians(90)), (height - height * 0.0833) - width / 2 * sin(radians(90)));
  rotate(radians(0)); 
  text("90°", 0, 0);
  resetMatrix();
  translate(width - width * 0.513 + width / 2 * cos(radians(120)), (height - height * 0.07129) -width / 2 * sin(radians(120)));
  rotate(radians(-30));
  text("120°", 0, 0);
  resetMatrix();
  translate((width - width * 0.5104) + width / 2 * cos(radians(150)), (height - height * 0.0574) - width / 2 * sin(radians(150)));
  rotate(radians(-60));
  text("150°", 0, 0);
  popMatrix(); 
}

สคริปต์เรดาร์สำหรับ Arduino IDE cpp

#include <Servo.h> 

// variables
const int trigPin = 2;
const int echoPin  = 9;

long duration;
int  distance;

int buzzpin = 7;
int buzzState = LOW;

int ledRed = 3;
int ledGreen = 4;

int switchpin = 10;
int ledStatus = 8;

byte leds = 0;

bool canSpin = true;

unsigned long previousMillis = 0;

const long intervalFar = 250;
const long intervalClose = 50;
const long intervalIdle = 1250;

Servo myServo; 


void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600);
  myServo.attach(12); 
  pinMode(buzzpin, OUTPUT);
  Serial.begin(9600);
  pinMode(ledRed, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(switchpin, INPUT);
  pinMode(ledStatus, OUTPUT);
}

// turning the radar on-off
void loop() {
  if (digitalRead(switchpin) == HIGH){
    digitalWrite(ledStatus, LOW);
    StartScan();
  }
  if (digitalRead(switchpin) == LOW){
    digitalWrite(ledStatus, HIGH);
  }
}

// calculating the distance to a detected object
int calculateDistance(){ 
  digitalWrite(trigPin,  LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); // reads echoPin and returns the sound wave travel time (ms)
  distance = duration * 0.034 / 2;
  return distance;
}

// start scanning for objects
void StartScan() {
  // checking for every degree

  // first from right to left
  for (int i = 15; i <= 165; i++) {  
    myServo.write(i);
    delay(30);
    distance = calculateDistance();

    // checking if something is detected in the 40 cm range
    if (distance <= 40 && distance > 20) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalFar) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance <= 20 && distance > 0) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalClose) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance > 40) {
      digitalWrite(buzzpin, LOW);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledRed, HIGH); 
    }
      
    Serial.print(i); 
    Serial.print(","); 
    Serial.print(distance);  
    Serial.print(".");
  }

  // then from left to right
  for (int i = 165; i >= 15; i--) {  
    myServo.write(i);
    delay(30);
    distance  = calculateDistance();

    if (distance <= 40 && distance > 20) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalFar) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance <= 20 && distance > 0) {
      unsigned long currentMillis = millis();

      if (currentMillis - previousMillis >= intervalClose) {
        previousMillis = currentMillis;

        if (buzzState == LOW) {
          buzzState = HIGH;
        } else {
          buzzState = LOW;
        }

        digitalWrite(buzzpin, buzzState);
        digitalWrite(ledRed, buzzState); 
        digitalWrite(ledGreen, HIGH); 
      }
    } else if (distance > 40) {
      digitalWrite(buzzpin, LOW);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledRed, HIGH); 
    }

    Serial.print(i);
    Serial.print(",");
    Serial.print(distance);
    Serial.print(".");
  }
}

การเดินสายเรดาร์