กลับไปหน้ารวมไฟล์
infrared-radar-with-sharp-distance-sensor-02feaf.md

ชื่อโปรเจกต์: เรดาร์อินฟราเรดพร้อม Sharp Distance Sensor

ในโปรเจกต์เล็กๆ นี้ ผมอยากจะแสดงให้คุณเห็นว่าคุณสามารถสร้าง Radar ง่ายๆ ที่บ้านด้วย Arduino ได้อย่างไร มีโปรเจกต์ที่คล้ายกันมากมายบนอินเทอร์เน็ต แต่ทั้งหมดใช้ ultrasonic sensor ในการวัดระยะทาง ในโปรเจกต์นี้ ผมใช้ infrared sensor สำหรับการวัดระยะทาง

เป้าหมายของผมคือการสร้างระบบ LIDAR ที่เรียบง่ายและราคาถูกด้วยสิ่งนี้ และนำมาใช้เป็นอุปกรณ์ทำแผนที่

คุณจะต้องใช้วัสดุอุปกรณ์ต่อไปนี้:

  • Arduino (ผมใช้ Maple Mini)
  • Sharp distance sensor (ผมใช้ Sharp GP2Y0A02YK0F)
  • Micro Servo (9g)
  • Breadboard, สายไฟ
  • ทางเลือก: 4.7k Resistor, 100nF Capacitor

Ultrasonic VS Infrared Sensor

ความแตกต่างหลักระหว่าง ultrasonic และ infrared distance sensor คือ ultrasonic sensor สามารถวัดระยะทางได้ในระยะที่กว้างกว่า ดังนั้นจึงไม่สามารถระบุตำแหน่งของสิ่งกีดขวางได้อย่างแม่นยำ นั่นหมายความว่ามันจะวัดระยะทางของวัตถุที่อยู่ใกล้ที่สุดซึ่งอยู่ในช่วงมุมประมาณ +-30°

แน่นอนว่านี่ไม่ได้หมายความว่า Sharp sensor จะดีกว่าเสมอไป บางครั้งคุณสมบัตินี้ก็มีประโยชน์มาก (เช่น ใช้โดย drone ในการวัดความสูงจากพื้นดิน) การเลือกที่เหมาะสมขึ้นอยู่กับความต้องการของโปรเจกต์ของคุณโดยสิ้นเชิง

Schematic

การเชื่อมต่อระหว่างชิ้นส่วนต่างๆ นั้นง่ายมาก เลือกขา PWM Output และ Analog Input บนบอร์ด Arduino ของคุณ แล้วเชื่อมต่อ Servo และ Sharp distance sensor เข้ากับขาเหล่านั้น ผมใช้ขาต่อไปนี้สำหรับจุดประสงค์นี้:

  • PA0: Analog input สำหรับ Sharp distance sensor
  • PA9: PWM Output สำหรับ Servo

บางครั้ง Sharp IR Sensor อาจมีสัญญาณเอาต์พุตที่มี noise ดังนั้นคุณจึงต้องใส่ Low Pass Filter แบบง่ายๆ เข้าไป ผมใช้ 4.7k resistor และ 100nF capacitor เพื่อลด noise บนขา analog นอกจากนี้ ผมยังกรองค่าที่วัดได้ในโค้ดด้วยการอ่านหลายครั้งและคำนวณค่าเฉลี่ย

Sensor Characteristic

น่าเสียดายที่ infrared distance sensor ที่ใช้นั้นมีคุณลักษณะที่ไม่เป็นเชิงเส้น (non-linear characteristic) นั่นหมายความว่าในการคำนวณหาระยะทาง ไม่เพียงพอที่จะคูณค่า ADC ที่วัดได้ด้วยค่าคงที่แล้วบวกด้วยค่าคงที่อื่น

แม้ว่า datasheet ของ sensor จะระบุคุณลักษณะไว้ ผมเลือกที่จะวัดด้วยตัวเองในโปรเจกต์นี้ (ซึ่งอาจขึ้นอยู่กับแรงดันไฟฟ้าที่ใช้) สำหรับสิ่งนี้ ผมได้จับคู่ค่า ADC ที่วัดได้กับระยะทางทุกๆ 10 cm (Sensor ของผมสามารถวัดระยะทางที่ถูกต้องได้ตั้งแต่ 12 cm)

ผมใช้คู่ค่าเหล่านี้ในโค้ดเพื่อหาระยะทางที่ถูกต้องด้วย Linear Interpolation.

// Structure to store ADC Value - Distance pairs
typedef struct {
float distance;
float adcVal;
} S_DIST_ADC_MAP;
// ADC Value - Distance pairs
// Fill it measured SHARP Sensor characteristic values.
S_DIST_ADC_MAP distAdcMap[] = {
{12, 3599},
{20, 3122},
{30, 2295},
{40, 1733},
...
};
// Function to get distance [cm] from measured ADC Value
float getDistance(float adcVal)
{
float distance = DISTANCE_MAX;
// Linear interpolation from measured ADC value and MAP.
for (int i = 1; i < (sizeof(distAdcMap)/sizeof(S_DIST_ADC_MAP)); i++)
{
if (adcVal > distAdcMap[i].adcVal)
{
float factor = (adcVal - distAdcMap[i].adcVal)/(distAdcMap[i-1].adcVal - distAdcMap[i].adcVal);
distance = factor * (distAdcMap[i-1].distance - distAdcMap[i].distance) + distAdcMap[i].distance;
break;
}
}
return distance;
}

คุณจะพบโค้ด Arduino แบบง่ายๆ ที่ส่วนท้ายเพื่อใช้วัดค่า ADC ในระหว่างการวัดคุณลักษณะของ Sensor

Serial Communication

ผมใช้การสื่อสารแบบ Serial เพื่อส่งค่ามุม-ระยะทางที่วัดได้ไปยัง PC เนื่องจากผมต้องส่งข้อมูลหลายไบต์และข้อความประเภทต่างๆ ผมจึงได้ออกแบบโปรโตคอลการสื่อสารแบบง่ายๆ

โปรโตคอลนี้ช่วยให้สามารถกำหนดประเภทข้อความที่แตกต่างกันได้ในลักษณะทั่วไป ในโปรเจกต์นี้ ผมใช้ข้อความ 2 ประเภท:

  • Parameters: ใช้สำหรับส่ง Parameters ไปยัง PC Application ซึ่งถูกกำหนดไว้บน Arduino เช่น ระยะทางสูงสุดและจำนวนสิ่งกีดขวางในหนึ่งรอบ
  • Obstacle: ใช้สำหรับส่งข้อมูลสิ่งกีดขวางที่ตรวจพบ ระบุด้วยมุมของ Servo และระยะทางที่วัดได้ ตำแหน่ง x-y จะถูกคำนวณโดย PC Application

Qt Application

เพื่อสื่อสารกับ Arduino และวาดจุดที่วัดได้เหมือน Radar ผมได้สร้าง PC Application ใน Qt (C++) มันจะรับ Parameters บางอย่าง (ที่กำหนดไว้บน Arduino) และจุดระยะทางที่วัดได้

Download Application

Download Source

รายละเอียดทางเทคนิคเพิ่มเติม

การทำแผนที่เชิงแสงความเร็วสูง

ต่างจาก ultrasonic radar โปรเจกต์นี้ใช้ Infrared distance sensor (Sharp GP2Y0A21YK) เพื่อเก็บข้อมูลเชิงพื้นที่ด้วยความเร็วที่สูงกว่ามากและมีความแม่นยำของลำแสงที่แคบกว่า

  • การแมปแรงดัน Analog: Sharp sensor จะส่งออกแรงดัน Analog อย่างต่อเนื่องระหว่าง 0.4V ถึง 3V. Arduino จะสุ่มสัญญาณนี้และใช้สูตร power-curve แบบกำหนดเอง $(D = 27.86 * V^{-1.15})$ เพื่อแปลงเป็นหน่วยเซนติเมตร
  • การกวาดด้วย Servo: metal-gear servo ความเร็วสูงจะหมุน Sensor ในขอบเขต 180 องศา เนื่องจาก IR เคลื่อนที่ด้วยความเร็วแสง อัตราการสแกนจึงสามารถทำได้สูงกว่าทางเลือกที่ใช้คลื่นเสียงอย่างมาก

การแสดงภาพแบบ Real-Time

  • Serial Telemetry Stream: จุดข้อมูล (Angle และ Distance) จะถูกส่งแบบ stream ไปยัง PC Application เพื่อสร้างแผนที่ 2D ความละเอียดสูงที่คมชัดของสภาพแวดล้อมโดยรอบ เหมาะสำหรับหุ่นยนต์ดูดฝุ่นอัตโนมัติขนาดเล็ก

ข้อมูล Frontmatter ดั้งเดิม

title: "Infrared Radar with Sharp Distance Sensor"
description: "In this small project I show you how to create a radar system using Arduino, Sharp Infrared distance sensors and a micro servo."
author: "tothmiki91"
category: ""
tags:
  - "environmental sensing"
  - "tracking"
  - "communication"
views: 10560
likes: 0
price: 2450
difficulty: "Intermediate"
components:
  - "1x Infrared Proximity Sensor"
  - "1x SG90 Micro-servo motor"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles: []
documentationLinks: []
passwordHash: "dfe1dc06c2529785416164c7364b57368f5e40d0f2498683a60ff3c861a00663"
encryptedPayload: "U2FsdGVkX19XNo2NcQnkObvUprImjaUQyiZmpxC7KOIIT/m4c1dDODYvQTmnxydyN8hhBU2flSu/JkQZr2gCFg/Gblxqfq+lOXZ+fyFwls0="
seoDescription: "Learn how to build an Infrared Radar system using Arduino, Sharp distance sensors, and a micro servo in this simple DIY project."
videoLinks:
  - "https://www.youtube.com/embed/VyR1hwa9OLg"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/infrared-radar-with-sharp-distance-sensor-02feaf_cover.jpg"
lang: "th"