Raspberry Pi Pico Ultrasonic Sensor

Raspberry Pi Pico Ultrasonic Sensor

Advanced Signal Processing และการวัดระยะทางด้วย IQ Sampling

Raspberry Pi Pico Ultrasonic Sensor Block Diagram

บทความนี้จะพาคุณไปสำรวจการใช้งาน Raspberry Pi Pico ในการสร้าง Ultrasonic Sensor ขั้นสูง โดยใช้เทคนิค IQ Sampling (In-phase and Quadrature) สำหรับการวัดระยะทางที่แม่นยำ ซึ่งแตกต่างจากการใช้งาน HC-SR04 แบบทั่วไป เราจะใช้ ADC ของ Pico ในการสุ่มตัวอย่างสัญญาณ Ultrasonic โดยตรง และประมวลผลด้วย Digital Signal Processing เพื่อให้ได้ความละเอียดและความแม่นยำสูง เหมาะสำหรับงาน Robotics, Mapping และ Object Detection ขั้นสูง

ภาพรวมของระบบ

ระบบ Ultrasonic Sensor ที่เราจะสร้างนี้ใช้หลักการส่งคลื่นเสียงความถี่สูง (40 kHz) และวิเคราะห์สัญญาณสะท้อนกลับมา โดยใช้เทคนิค IQ Sampling ซึ่งเป็นวิธีการที่ใช้ในระบบ Radar และ Communication ขั้นสูง

🎯 จุดเด่นของระบบ

⚡ ความเร็วสูง

ใช้ ADC ของ Pico ที่ความเร็ว 500 kSPS สามารถสุ่มตัวอย่างสัญญาณได้รวดเร็ว

🎯 ความแม่นยำสูง

ใช้ IQ Sampling ให้ความละเอียดในการวัดระยะทางดีกว่าวิธีแบบ Time-of-Flight ทั่วไป

📊 Signal Processing

ประมวลผลสัญญาณด้วย FFT และ Correlation เพื่อกรองสัญญาณรบกวน

💰 ราคาประหยัด

ใช้ Raspberry Pi Pico ที่ราคาไม่แพง แต่ได้ประสิทธิภาพระดับ Professional

📐 หลักการทำงาน

ระบบทำงานโดยการ:

  1. ส่งสัญญาณ Ultrasonic - ส่งคลื่นเสียง 40 kHz ออกไปเป็นชุดๆ (Burst)
  2. รับสัญญาณสะท้อน - ใช้ ADC สุ่มตัวอย่างสัญญาณที่สะท้อนกลับมา
  3. IQ Sampling - แยกสัญญาณเป็น In-phase (I) และ Quadrature (Q) components
  4. Signal Processing - ใช้ FFT และ Correlation หาระยะทาง
  5. คำนวณระยะทาง - แปลงเวลาที่ใช้เป็นระยะทาง (Distance = Time × Speed of Sound / 2)

🔧 ข้อมูลทางเทคนิค

  • ความถี่ Ultrasonic: 40 kHz
  • ADC Sampling Rate: 500 kSPS
  • ความละเอียด ADC: 12-bit
  • ระยะทางที่วัดได้: 2 cm - 400 cm
  • ความแม่นยำ: ±1 mm (ขึ้นกับสภาพแวดล้อม)
  • อัตราการอัปเดต: 10-50 Hz

💡 ทำไมต้องใช้ IQ Sampling?

IQ Sampling ช่วยให้เราสามารถแยกแยะ Phase และ Amplitude ของสัญญาณได้อย่างแม่นยำ ทำให้วัดระยะทางได้ละเอียดกว่าการวัดแค่เวลาที่สัญญาณกลับมา (Time-of-Flight) แบบทั่วไป นอกจากนี้ยังช่วยกรองสัญญาณรบกวนและ Multipath ได้ดีกว่า

Hardware Setup

การต่อวงจรของระบบนี้ค่อนข้างเรียบง่าย แต่ต้องใส่ใจในรายละเอียดเพื่อให้ได้สัญญาณที่ดี

🛠️ อุปกรณ์ที่ต้องใช้
  • Raspberry Pi Pico - ไมโครคอนโทรลเลอร์หลัก (หรือ Pico W)
  • 40 kHz Ultrasonic Transducer - ตัวส่งและรับคลื่นเสียง (แยกเป็น Transmitter และ Receiver)
  • Op-Amp (เช่น LM358) - ขยายสัญญาณจาก Receiver
  • Resistors และ Capacitors - สำหรับวงจรขยายสัญญาณและกรอง
  • Breadboard และสายจั๊มเปอร์ - สำหรับต่อวงจร
🔌 การต่อวงจร
Block Diagram

Block Diagram แสดงการเชื่อมต่อระหว่าง Pico, Transducer และวงจรขยายสัญญาณ

การเชื่อมต่อ Transmitter:

  • GPIO (PWM) → Ultrasonic Transmitter
  • ใช้ PWM สร้างสัญญาณ 40 kHz ส่งไปยัง Transmitter
  • ส่งเป็น Burst 8-16 cycles เพื่อประหยัดพลังงานและลด Ringing

การเชื่อมต่อ Receiver:

  • Ultrasonic Receiver → Op-Amp (Amplifier) → ADC Pin (GPIO 26-28)
  • ใช้ Op-Amp ขยายสัญญาณประมาณ 100-200 เท่า
  • เพิ่ม Low-pass Filter เพื่อกรองสัญญาณรบกวนความถี่สูง
  • ใช้ Bias Voltage ที่ 1.65V (กึ่งกลาง ADC range 0-3.3V)

⚠️ ข้อควรระวัง:

  • ADC ของ Pico รับแรงดัน 0-3.3V เท่านั้น อย่าให้เกิน!
  • ใช้ Decoupling Capacitor (0.1µF) ใกล้ๆ Pico เพื่อลดสัญญาณรบกวน
  • แยก Ground ของ Analog และ Digital ถ้าทำได้
  • ระยะห่างระหว่าง Transmitter และ Receiver ควรอยู่ที่ 1-2 cm
📊 สัญญาณที่ได้จาก Oscilloscope
Oscilloscope Signal - 8 Cycles Burst

สัญญาณ Ultrasonic Burst 8 cycles ที่ 40 kHz จาก Oscilloscope

จากภาพจะเห็นว่าเราส่งสัญญาณ 40 kHz ออกไป 8 cycles แล้วหยุด สัญญาณที่สะท้อนกลับมาจะมี Amplitude ต่ำกว่า และมี Delay ตามระยะทางของวัตถุ

Signal Processing

หัวใจสำคัญของระบบนี้คือการประมวลผลสัญญาณ เราจะใช้เทคนิค IQ Sampling และ Digital Signal Processing

🌊 IQ Sampling คืออะไร?

IQ Sampling เป็นเทคนิคที่ใช้ในระบบ Communication และ Radar โดยแยกสัญญาณออกเป็น 2 ส่วน:

  • I (In-phase) - สัญญาณที่มี Phase เท่ากับสัญญาณอ้างอิง (Reference Signal)
  • Q (Quadrature) - สัญญาณที่มี Phase เลื่อนไป 90° จากสัญญาณอ้างอิง

การแยกเป็น I และ Q ทำให้เราสามารถ:

  • วัด Phase ของสัญญาณได้แม่นยำ → ระยะทางที่ละเอียด
  • แยกแยะทิศทางของการเคลื่อนที่ (Doppler Effect)
  • กรองสัญญาณรบกวนได้ดีกว่า
📈 ADC Sampling
ADC Samples

ตัวอย่างข้อมูลที่สุ่มจาก ADC แสดง Raw Signal และ IQ Components

Pico จะสุ่มตัวอย่างสัญญาณด้วย ADC ที่ความเร็ว 500 kSPS (500,000 samples/second) ซึ่งเร็วพอที่จะจับสัญญาณ 40 kHz ได้ดี (ตาม Nyquist Theorem ต้องสุ่มอย่างน้อย 2 เท่าของความถี่สัญญาณ)

🔄 การคำนวณ IQ Components

หลังจากได้ Raw Samples แล้ว เราจะคำนวณ I และ Q โดย:

// Pseudo Code สำหรับคำนวณ IQ for (int n = 0; n < num_samples; n++) { float t = n / sample_rate; float reference_i = cos(2 * PI * 40000 * t); // In-phase float reference_q = sin(2 * PI * 40000 * t); // Quadrature I[n] = samples[n] * reference_i; Q[n] = samples[n] * reference_q; } // คำนวณ Magnitude และ Phase magnitude = sqrt(I*I + Q*Q); phase = atan2(Q, I);
📊 Range-Doppler Plot
IQ Range Plot - Wall at 23cm

IQ Range Plot แสดงการตรวจจับผนังที่ระยะ 23 cm

จาก Plot จะเห็น Peak ที่ชัดเจนบริเวณ 23 cm ซึ่งบ่งบอกตำแหน่งของวัตถุ การใช้ IQ Sampling ทำให้เราได้ข้อมูล Phase ด้วย ซึ่งช่วยเพิ่มความแม่นยำ

🎓 ทฤษฎีเพิ่มเติม:

ระยะทางคำนวณจาก: Distance = (c × t) / 2

  • c = ความเร็วเสียง ≈ 343 m/s (ที่อุณหภูมิ 20°C)
  • t = เวลาที่สัญญาณใช้ไป-กลับ
  • หาร 2 เพราะสัญญาณเดินทางไป-กลับ

ความละเอียดทางทฤษฎี = c / (2 × Bandwidth) ≈ 4.3 mm สำหรับ 40 kHz

Implementation

มาดูการเขียนโค้ดสำหรับ Raspberry Pi Pico กัน เราจะใช้ C/C++ กับ Pico SDK

⚙️ การตั้งค่า PWM สำหรับ Transmitter
#include "pico/stdlib.h" #include "hardware/pwm.h" #include "hardware/adc.h" #define TX_PIN 0 #define RX_PIN 26 // ADC0 #define FREQ 40000 // 40 kHz void setup_pwm() { gpio_set_function(TX_PIN, GPIO_FUNC_PWM); uint slice_num = pwm_gpio_to_slice_num(TX_PIN); // คำนวณ divider สำหรับ 40 kHz float div = (float)clock_get_hz(clk_sys) / (FREQ * 4096); pwm_set_clkdiv(slice_num, div); pwm_set_wrap(slice_num, 4095); pwm_set_chan_level(slice_num, PWM_CHAN_A, 2048); // 50% duty pwm_set_enabled(slice_num, true); } void send_burst(int cycles) { // ส่ง burst แล้วหยุด uint slice_num = pwm_gpio_to_slice_num(TX_PIN); pwm_set_enabled(slice_num, true); sleep_us(cycles * 25); // 25 us = 1 cycle ที่ 40kHz pwm_set_enabled(slice_num, false); }
📡 การตั้งค่า ADC สำหรับ Receiver
#define NUM_SAMPLES 1024 uint16_t samples[NUM_SAMPLES]; void setup_adc() { adc_init(); adc_gpio_init(RX_PIN); adc_select_input(0); // ADC0 // ตั้งค่า ADC FIFO adc_fifo_setup(true, false, 0, false, false); // ตั้งค่า sampling rate adc_set_clkdiv(96); // 500 kHz sampling rate } void capture_samples() { adc_fifo_drain(); adc_run(true); for (int i = 0; i < NUM_SAMPLES; i++) { samples[i] = adc_fifo_get_blocking(); } adc_run(false); }
🧮 การประมวลผล IQ
#include #define PI 3.14159265359 void process_iq(float *i_out, float *q_out, float *magnitude) { float i_sum = 0, q_sum = 0; for (int n = 0; n < NUM_SAMPLES; n++) { float t = (float)n / 500000.0; // sampling rate float sample = (samples[n] - 2048) / 2048.0; // normalize // คูณกับ reference signals float ref_i = cosf(2 * PI * FREQ * t); float ref_q = sinf(2 * PI * FREQ * t); i_sum += sample * ref_i; q_sum += sample * ref_q; } *i_out = i_sum / NUM_SAMPLES; *q_out = q_sum / NUM_SAMPLES; *magnitude = sqrtf((*i_out) * (*i_out) + (*q_out) * (*q_out)); } float calculate_distance() { float i, q, mag; process_iq(&i, &q, &mag); // หา peak position จาก correlation // (โค้ดเต็มจะซับซ้อนกว่านี้) float time_of_flight = find_peak_time(); float distance = (343.0 * time_of_flight) / 2.0; // เมตร return distance * 100; // แปลงเป็น cm }
🔄 Main Loop
int main() { stdio_init_all(); setup_pwm(); setup_adc(); while (1) { // ส่ง ultrasonic burst send_burst(8); // รอให้สัญญาณเดินทาง sleep_us(100); // จับสัญญาณ capture_samples(); // ประมวลผลและคำนวณระยะทาง float distance = calculate_distance(); printf("Distance: %.2f cm\n", distance); sleep_ms(100); // อัปเดต 10 Hz } return 0; }

📝 หมายเหตุ:

  • โค้ดข้างต้นเป็น Simplified Version เพื่อให้เข้าใจหลักการ
  • Implementation จริงต้องมี FFT, Correlation และ Filtering เพิ่มเติม
  • ต้อง Calibrate ค่าต่างๆ ตามฮาร์ดแวร์ที่ใช้
  • สามารถใช้ Library เช่น CMSIS-DSP สำหรับ FFT

Results และการทดสอบ

มาดูผลการทดสอบในสถานการณ์ต่างๆ กัน

🧱 ทดสอบกับผนังเรียบ
Wall Detection at 23cm

ผลการตรวจจับผนังเรียบที่ระยะ 23 cm - Peak ชัดเจนและแม่นยำ

จากการทดสอบกับผนังเรียบ พบว่า:

  • ✅ Peak ชัดเจนและแม่นยำที่ 23 cm
  • ✅ Signal-to-Noise Ratio (SNR) สูง
  • ✅ ความแม่นยำ ±2 mm
  • ✅ Repeatability ดีมาก
🔲 ทดสอบกับผนังที่มีมุม
Wall with Corners Detection

ผลการตรวจจับผนังที่มีมุมและรายละเอียด - เห็น Multiple Peaks

เมื่อทดสอบกับผนังที่มีมุมและรายละเอียด:

  • ✅ สามารถแยกแยะ Multiple Objects ได้
  • ✅ เห็น Reflection จากมุมต่างๆ
  • ⚠️ ต้องใช้ Algorithm ที่ซับซ้อนกว่าในการแยก Peak
  • ⚠️ Multipath Effect อาจทำให้เกิด Ghost Peaks
🏠 ทดสอบในห้อง (Complex Environment)
Room Environment Detection

ผลการสแกนในห้องที่มีเตียงและผนัง - แสดง Range Profile ที่ซับซ้อน

ในสภาพแวดล้อมที่ซับซ้อน:

  • ✅ สามารถตรวจจับวัตถุหลายชิ้นได้พร้อมกัน
  • ✅ เห็น Profile ของห้องชัดเจน
  • ⚠️ ต้องใช้ Threshold และ Filtering ที่ดี
  • ⚠️ การประมวลผลใช้เวลานานขึ้น

📊 สรุปผลการทดสอบ

  • ระยะทางที่วัดได้: 2 cm - 400 cm
  • ความแม่นยำ (ผนังเรียบ): ±2 mm
  • ความแม่นยำ (สภาพแวดล้อมซับซ้อน): ±5 mm
  • อัตราการอัปเดต: 10-50 Hz (ขึ้นกับ Processing)
  • มุมการตรวจจับ: ±15° (ขึ้นกับ Transducer)
  • การใช้ CPU: ~30-40% ที่ 50 Hz

🎯 ข้อดีเมื่อเทียบกับ HC-SR04:

  • ✅ ความแม่นยำสูงกว่า (mm vs cm)
  • ✅ สามารถตรวจจับ Multiple Objects
  • ✅ ได้ข้อมูล Phase และ Doppler
  • ✅ กรองสัญญาณรบกวนได้ดีกว่า
  • ✅ Flexible - ปรับแต่ง Algorithm ได้

Applications และการประยุกต์ใช้

ระบบ Ultrasonic Sensor ขั้นสูงนี้สามารถนำไปใช้ในหลากหลายงาน:

🤖 Robotics
  • Obstacle Avoidance - หลบหลีกสิ่งกีดขวางอัตโนมัติ
  • SLAM (Simultaneous Localization and Mapping) - สร้างแผนที่และหาตำแหน่งพร้อมกัน
  • Wall Following - เดินตามผนังด้วยระยะคงที่
  • Docking - จอดเข้าที่ชาร์จอัตโนมัติ
🏭 Industrial
  • Level Measurement - วัดระดับของเหลวในถัง
  • Position Sensing - ตรวจจับตำแหน่งของชิ้นงาน
  • Quality Control - ตรวจสอบขนาดและรูปร่าง
  • Conveyor Monitoring - ตรวจจับวัตถุบนสายพาน
🏠 Smart Home
  • Presence Detection - ตรวจจับการเข้า-ออกห้อง
  • Gesture Control - ควบคุมอุปกรณ์ด้วยท่าทาง
  • Parking Assistant - ช่วยจอดรถในโรงจอด
  • Water Level Monitor - ตรวจสอบระดับน้ำในถัง
🚗 Automotive
  • Parking Sensors - เซ็นเซอร์ช่วยจอดรถ
  • Blind Spot Detection - ตรวจจับจุดอับสายตา
  • Collision Warning - เตือนการชนใกล้เคียง
  • Automatic Braking - เบรกอัตโนมัติ
🔬 Research & Education
  • Signal Processing Education - สอน DSP และ IQ Sampling
  • Radar Principles - ทดลองหลักการ Radar
  • Acoustic Research - วิจัยเกี่ยวกับเสียง
  • Sensor Fusion - รวมข้อมูลจากหลายเซ็นเซอร์

💡 โปรเจคต่อยอด: 3D Scanner

ใช้ Servo Motor หมุน Sensor 360° สร้าง Point Cloud และ 3D Model ของวัตถุ

🎯 โปรเจคต่อยอด: Gesture Recognition

ใช้ Doppler Effect จาก IQ Data ตรวจจับการเคลื่อนไหวและจำแนกท่าทาง

🗺️ โปรเจคต่อยอด: Indoor Mapping

ติดตั้งบนหุ่นยนต์เคลื่อนที่ สร้างแผนที่ภายในอาคารแบบ Real-time

📊 โปรเจคต่อยอด: Multi-Sensor Array

ใช้หลาย Sensor ร่วมกัน สร้าง Beamforming และเพิ่มความละเอียดเชิงมุม

🚀 การพัฒนาต่อยอด:

  • Machine Learning - ใช้ ML จำแนกประเภทวัตถุจาก Echo Pattern
  • Sensor Fusion - รวมกับ IMU, Camera, LiDAR
  • Wireless Communication - ส่งข้อมูลผ่าน Wi-Fi/Bluetooth
  • Edge Computing - ประมวลผล AI บน Pico
  • Multi-Frequency - ใช้หลายความถี่เพิ่มความละเอียด

ช้อปอุปกรณ์ / เข้าร่วม Community

หากคุณสนใจอุปกรณ์สำหรับโปรเจค Raspberry Pi Pico เช่น Pico Board, Ultrasonic Transducer, Op-Amp หรืออยากพูดคุยแลกเปลี่ยนความรู้เกี่ยวกับ Signal Processing และ Embedded Systems สามารถกดปุ่มด้านล่างนี้ได้เลย

เนื้อหาจัดทำโดย GlobalByte - ศูนย์รวมความรู้ด้าน Embedded Systems และ Signal Processing

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี