การตรวจจับแสงแบบ Differential: ระบบนำทางแบบ 4-Channel
โปรเจกต์นี้เป็นการเจาะลึกในเรื่อง การรวมเซ็นเซอร์อนาล็อก โดยเน้นเฉพาะอาร์เรย์ตรวจจับแสงแบบ 4 แชนเนลเพื่อขับเคลื่อนหุ่นยนต์บังคับเลี้ยวแบบ Differential ด้วยการจัดวาง Photoresistor (LDRs) เป็นรูปกากบาท (หน้าซ้าย, หน้าขวา, หลังซ้าย, หลังขวา) Arduino สามารถระบุได้ไม่เพียงแค่ว่ามีแสงอยู่หรือไม่ แต่ยังสามารถระบุ ทิศทางที่แน่นอนของแหล่งกำเนิดแสง ทำให้หุ่นยนต์สามารถ "หา" หรือ "หนี" จากแสงได้อย่างอิสระ
การเอาชนะอุปสรรค Analog หลายแชนเนล
ความท้าทายหลักในการสร้างนี้เป็นปัญหาที่พบบ่อยสำหรับผู้เริ่มต้น Arduino: Input Crosstalk และ Variable Scope
- RCtime Method: แทนที่จะใช้
analogRead()แบบง่ายๆ โปรเจกต์นี้ใช้เทคนิค RCtime ซึ่งเกี่ยวข้องกับการชาร์จ Capacitor (1uF) ผ่าน Pin จากนั้นวัดระยะเวลาที่ใช้ในการคายประจุผ่าน Photoresistor วิธีนี้ให้ความละเอียดที่สูงกว่ามากในสภาพแสงน้อยเมื่อเทียบกับ Voltage Divider มาตรฐาน - การแก้ไขข้อผิดพลาด Re-definitions: ดังที่ระบุไว้ในประวัติโปรเจกต์ การคัดลอกบล็อกโค้ดสำหรับเซ็นเซอร์หลายตัวมักจะนำไปสู่ข้อผิดพลาด
redefinition of 'long int RCtime(int)'ในการแก้ไขปัญหานี้ ฟังก์ชันจะต้องประกาศเพียงครั้งเดียวที่ด้านบนสุด และเรียกใช้ด้วย Pin integers ที่แตกต่างกันเป็น Argument (เช่นRCtime(tlPin)และRCtime(trPin)) - การแยกไฟฟ้า: เมื่ออ่านช่องสัญญาณอนาล็อกหลายช่องอย่างรวดเร็ว ADC Multiplexer ภายในของ Arduino สามารถเก็บแรงดันตกค้างบางส่วนจากการอ่านครั้งก่อนได้ โปรเจกต์นี้อธิบายวิธีการเพิ่ม "dummy reads" หรือการหน่วงเวลาเล็กน้อยระหว่างการสลับช่องสัญญาณ เพื่อให้แน่ใจว่าเซ็นเซอร์ด้านซ้ายจะไม่ส่งผลกระทบต่อข้อมูลของเซ็นเซอร์ด้านขวา
การเชื่อมต่อสู่การเคลื่อนที่
เมื่อข้อมูล 4 แชนเนลคงที่แล้ว ขั้นตอนต่อไปคือ Motor Mapping:
- สัดส่วนโดยตรง: Arduino จะเปรียบเทียบค่าที่อ่านได้จากด้านซ้ายและขวา หาก
Left > Rightโค้ดจะเพิ่มความเร็ว PWM ของมอเตอร์ด้านขวาเพื่อให้หุ่นยนต์หมุนเข้าหาแสง - การรวม L293D: เพื่อขับเคลื่อนมอเตอร์จริง Logic จะถูกส่งออกไปยัง Motor Driver Shield ซึ่งจะช่วยให้ข้อมูลเซ็นเซอร์กำลังต่ำสามารถควบคุมเส้นทางสองทิศทางกำลังสูงของ Chassis ได้
- การป้องกันเซ็นเซอร์: เพื่อความแม่นยำของทิศทางสูงสุด LDRs มักจะถูกติดตั้งภายในท่อ "blind" ขนาดเล็ก (เช่น Heat Shrink หรือหลอดดูด) ซึ่งจะจำกัดมุมมองของพวกมัน ทำให้อาร์เรย์ 4 แชนเนลมีความไวต่อเวกเตอร์ที่แน่นอนของแสงมากขึ้น
โปรเจกต์นี้ทำหน้าที่เป็น โปรเจกต์ประจำภาคเรียน ที่ยอดเยี่ยม เพราะมันบังคับให้นักเรียนต้องจัดการกับทั้ง Software Architecture (Functions/Variables) และการแก้ไขปัญหาทางไฟฟ้าพร้อมกัน
ฉันใช้หน้า RCtime จาก arduino.cc เพื่อให้ Photoresistor แบบ Single Channel ทำงานและได้ Analog Output ที่เหมาะสม Cap คือ 1002nF และ Resistor คือ 1kohm
ฉันทำให้โค้ดสำหรับ A0 ทำงานได้ ปัญหาคือเมื่อฉันเพิ่ม Channel ที่สอง ฉันคัดลอกโค้ดและสร้าง Channel ที่สองเหมือนเดิมทุกประการ
ปัญหาของฉันคือการเพิ่ม Channel ที่สอง เมื่อฉันได้โค้ดที่ไม่มีข้อผิดพลาด Photoresistor ตัวที่สองจะเปลี่ยนค่าสำหรับทั้งสองด้าน
หลังจากที่ฉันแก้ไขปัญหานี้และทำให้ระบบไฟฟ้าทำงานได้ ฉันจะต้องเปลี่ยนโค้ดเพื่อควบคุมมอเตอร์
ฉันรู้ว่าฉันกำลังขอมากเกินไปใน Forum แต่มีเว็บไซต์หรือวิดีโอที่ฉันสามารถดูและหาคำตอบได้ไหม
(รหัสข้อผิดพลาดปัจจุบัน)
Arduino: 1.8.8 (Windows 10), บอร์ด: "Arduino/Genuino Uno"
C:\\*: ในฟังก์ชัน 'long int RCtime(int)':
C:\\*:17:8: warning: ตัวแปร 'result' ไม่ได้ถูกใช้งาน [-Wunused-variable]
long result = 0;
^
C:\\*:24:1: warning: ไม่มี Return Statement ในฟังก์ชันที่คืนค่าที่ไม่ใช่ Void [-Wreturn-type]
}
^
C:\\*: ที่ Global Scope:
Semester_project_code:25:1: error: คาดว่าจะพบ Unqualified-ID ก่อนเครื่องหมาย '{' Token
{
^
C:\\*: ในฟังก์ชัน 'long int RCtime(int)':
Semester_project_code:30:6: error: การประกาศซ้ำของ 'long int RCtime(int)'
long RCtime(int(trPin))
^
C:\\*:15:6: note: 'long int RCtime(int)' เคยถูกประกาศไว้ที่นี่
long RCtime(int tlPin)
^
Semester_project_code:39:1: error: คาดว่าจะพบ Primary-Expression ก่อนเครื่องหมาย '}' Token
}
^
C:\\*:32:8: warning: ตัวแปร 'result' ไม่ได้ถูกใช้งาน [-Wunused-variable]
long result = 0;
^
C:\\*:39:1: warning: ไม่มี Return Statement ในฟังก์ชันที่คืนค่าที่ไม่ใช่ Void [-Wreturn-type]
}
^
สถานะการออก 1
คาดว่าจะพบ Unqualified-ID ก่อนเครื่องหมาย '{' Token
รายงานนี้จะมีข้อมูลเพิ่มเติมหาก
เปิดใช้งาน "Show verbose output during compilation"
ใน File -> Preferences.