หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ การอ่าน PPM Signal จาก RC Receiver โดยใช้ Arduino

โค้ดนี้ใช้สำหรับอ่าน PPM Signal จาก RC Receiver โดยการใช้งาน interrupt pin

โปรเจกต์ การอ่าน PPM Signal จาก RC Receiver โดยใช้ Arduino

วิดีโอสาธิต

Video

▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์

รายการอุปกรณ์และเครื่องมือ

1x Arduino UNO
-

รายละเอียดและวิธีทำ

RC Transmitter เหมาะอย่างยิ่งสำหรับโปรเจกต์ที่ต้องการการเชื่อมต่อแบบไร้สาย เนื่องจากมีลิงก์ที่เข้ารหัสและมีระยะการส่งสัญญาณที่ดี

RC Receiver ทั้งหมดถูกสร้างมาเพื่อขับ Servo Motors ดังนั้นจึงมี 3 Pins สำหรับแต่ละ Channel ได้แก่ GND, VCC และ Signal โดยในที่นี้จะใช้สัญญาณชนิดพิเศษที่ส่ง Pulse ออกมาเป็นช่วงเวลา เมื่อ Servo ได้รับ Pulse ขนาด 1.5ms มันจะตั้งค่าไปที่ 90 องศา และการเปลี่ยนค่านี้ในช่วง 1-2ms จะทำให้ Servo เคลื่อนที่ไปยังค่าต่ำสุดและสูงสุด (ในรูปภาพด้านบนแสดง Receiver แบบ 6 Channel พร้อม Pin แบบ PPM)

วิธีที่ง่ายที่สุดคือการวัดความกว้างของ Pulse ในแต่ละ Pin และทำการ Map ข้อมูลตามความต้องการ แต่ปัญหาก็คือ:

  • สำหรับแต่ละ Channel ของ Receiver เราจำเป็นต้องต่อสายไฟไปยัง Arduino Pin ซึ่งไม่เพียงแต่ต้องใช้การเชื่อมต่อจำนวนมาก แต่ยังสิ้นเปลือง Pins บน Arduino อีกด้วย
  • Arduino ส่วนใหญ่มี Interrupt Pin เพียง 2 ช่อง ดังนั้นหากเราใช้มากกว่า 2 Channel การอ่านค่าจะต้องเพิ่ม Delay เข้าไปใน Code ของเรา ซึ่งอาจเป็นปัญหาสำหรับบาง Application

เพื่อแก้ปัญหานี้ Receiver หลายรุ่นจึงมาพร้อมกับ Pin พิเศษที่เรียกว่า PPM โดย Pin แบบ PPM นี้จะส่งข้อมูลของทุก Channel รวมกันใน Signal เดียว

Reading PPM signal from RC reciever

สัญญาณของ Pin แบบ PPM ประกอบขึ้นอย่างไร?

สัญญาณนี้ประกอบด้วยแพ็กเกจข้อมูลที่แยกจากกันด้วยช่องว่าง โดยระยะห่างระหว่าง Peak จะแทนค่าของแต่ละ Channel ในกรณีนี้ ผมใช้ Receiver แบบ 6 Channel จึงมี 7 Pulses

ดังนั้นใน Code ของเรา อันดับแรกเราต้องตรวจหาช่องว่างที่ใช้แยกส่วนก่อน แล้วจึงเริ่มบันทึกข้อมูลจาก Pulse ของแต่ละ Channel

ดังที่เห็นในรูปที่สอง

ข้อมูลทั้งหมดจะถูกแยกออกจากกันด้วยเวลาประมาณ 11500 Microseconds จากนั้นจึงเป็นค่าทั้ง 6 สำหรับแต่ละ Channel

การใช้งาน Code:

Output from the arduino

ในที่นี้ read_me() ถูกกำหนดให้เป็น Function:

a=micros(); c=a-b; b=a; x[i]=c; i=i+1; 
if(i==15){for(int j=0;j<15;j++) {ch1[j]=x[j];} i=0; } }

ส่วนนี้จะทำงานบน Interrupt Pin โดยจะรับค่าเวลา 15 ค่าและเก็บไว้ใน Array

อีก Function หนึ่งคือ read_rc()

ส่วนนี้จะมองหาช่องว่างที่นานกว่า 10000 Microseconds ซึ่งในกรณีของเรา มันจะตรวจหาช่องว่างที่ใช้แยกส่วน และเมื่อตรวจพบช่องว่างนั้น Code จะเลื่อนไปยังส่วนถัดไป

หลังจากช่องว่างนี้ ค่า 6 ค่าถัดไปจะเป็นตำแหน่งของแต่ละ Channel ซึ่งจะถูกเก็บไว้ใน Array ที่ชื่อ ch[ channel no] ในที่นี้ ch[1], ch[2], ch[3], ch[4], ch[5], ch[6] จะแทนค่าของแต่ละ Channel

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: reading-rc-receiver-ppm-signal-using-arduino-63de0c
1499 บาท
PromptPay QR Code