ชื่อโปรเจกต์: เรดาร์อินฟราเรดพร้อม 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) และจุดระยะทางที่วัดได้
รายละเอียดทางเทคนิคเพิ่มเติม
การทำแผนที่เชิงแสงความเร็วสูง
ต่างจาก 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 ความละเอียดสูงที่คมชัดของสภาพแวดล้อมโดยรอบ เหมาะสำหรับหุ่นยนต์ดูดฝุ่นอัตโนมัติขนาดเล็ก