ชื่อโปรเจกต์: การทำให้หุ่นยนต์ DRL ASURO ใช้งานได้กับ Arduino IDE
การปรับปรุงหุ่นยนต์คลาสสิก: นำหุ่นยนต์ ASURO เข้าสู่ยุค Arduino
หุ่นยนต์ ASURO (Autonomous System for University Robot Education) เป็นชุดหุ่นยนต์ระดับตำนาน แต่ระบบซอฟต์แวร์ดั้งเดิมของมัน—ซึ่งออกแบบมาสำหรับยุค Windows XP—นั้นขึ้นชื่อว่ารันได้ยากบนเครื่องสมัยใหม่ โปรเจกต์นี้เป็นการวิจัยและปรับแต่งฮาร์ดแวร์ที่ทุ่มเทเป็นเวลาสองสัปดาห์ เพื่อเชื่อมช่องว่างระหว่างหุ่นยนต์ Atmega8-based แบบเก่ากับ Arduino IDE สมัยใหม่ ทำให้คนรุ่นใหม่ที่รักงานอดิเรกสามารถตั้งโปรแกรมหุ่นยนต์ตีนตะขาบคลาสสิกตัวนี้ได้
การปรับแต่งฮาร์ดแวร์ที่สำคัญ
เพื่อให้ได้ประสิทธิภาพที่เสถียรด้วยไลบรารีสมัยใหม่ ต้องแก้ไขปัญหาฮาร์ดแวร์ "คลาสสิก" ของ ASURO หลายประการดังนี้:
- ความน่าเชื่อถือของ Encoder (R18/R20): โดยการเปลี่ยนค่าตัวต้านทานเหล่านี้จาก 4k7 เป็น 6k9 ohms สัญญาณ LOW ของ motor encoders จะถูกดึงให้เข้าใกล้ ground มากขึ้น สิ่งนี้ทำให้เกิด digital pulse ที่สะอาดขึ้น ซึ่ง
digitalRead()ของ Arduino สามารถตีความได้อย่างแม่นยำ ลด "Ghost Counts" ระหว่างการเคลื่อนที่ด้วยความเร็วสูง - การกรองสัญญาณ Switch (R24): การตัด trace ไปยัง R24 จะลบ interrupt input ที่คาดเดาไม่ได้สำหรับ collision switches สิ่งนี้จะป้องกันไม่ให้หุ่นยนต์ "คิดไปเอง" ว่าชนสิ่งกีดขวางเมื่อมอเตอร์เริ่มทำงาน ซึ่งเป็น bug ทั่วไปในการออกแบบดั้งเดิม
- การเชื่อม Interrupt: สำหรับผู้ใช้ขั้นสูง การเชื่อม analog pins เข้ากับ interrupt pins ช่วยให้สามารถติดตามล้อด้วยความเร็วสูงได้ แม้ว่าสิ่งนี้จะต้องแลกกับการเสียฟังก์ชันสีแดงของ bi-color Status LED ไป
ซอฟต์แวร์สแต็คสมัยใหม่
เนื่องจากไลบรารี ASURO ดั้งเดิมมักจะไม่เข้ากันกับ GCC compilers สมัยใหม่ โปรเจกต์นี้จึงใช้วิธีการแบบ Function-Based ที่ปรับแต่งเองดังนี้:
- การแทนที่ HTerm: แทนที่ Hyperterminal แบบเก่าด้วย HTerm สำหรับ debugging การเชื่อมต่อ infrared serial link (2400 Baud)
- การ Export Binary: แทนที่จะใช้ Serial flashing โดยตรง (ซึ่งไม่น่าเชื่อถือผ่าน IR) โปรเจกต์นี้ใช้ฟีเจอร์ "Export Compiled Binary" ของ Arduino IDE
- ตัวเชื่อม Flash.exe: ไฟล์
.hexที่ได้จะถูกอัปโหลดโดยใช้ ASURO Flash tool ที่ปรับปรุงประสิทธิภาพแล้ว ซึ่งจัดการ timing เฉพาะที่จำเป็นสำหรับ infrared receiver ของหุ่นยนต์
ไลบรารีฟังก์ชันที่ปรับปรุงประสิทธิภาพ
หัวใจสำคัญของงานนี้คือชุดของ high-level wrappers สำหรับ pins ที่กำหนดได้ยากของ ASURO:
- motorSpeed() พร้อม Soft-Start: รวมถึงการส่ง high-torque สั้นๆ 50ms เพื่อเอาชนะ static friction ของเฟือง acrylic-on-metal ของ ASURO
- getSwitches() พร้อม Digital Filtering: อัลกอริทึม multi-sample ที่ระบุว่า bumper switches ตัวใดจากทั้งหมด 6 ตัวถูกกด โดยอิงจาก analog values ที่ไม่เสถียรซึ่งส่งคืนโดย shared resistor ladder
- Encoder Logic: ฟังก์ชันสำหรับอ่านทั้ง analog levels และ digital transitions ของ black/white disc markers
การฟื้นคืนตำนาน
ด้วยการลอกเลเยอร์ abstraction ของไลบรารี "Asurino" เก่าออก และใช้ direct hardware functions เหล่านี้ นักพัฒนาจะสามารถควบคุม motor pulse และ sensor reading ทุกอย่างได้อย่างแม่นยำ โปรเจกต์นี้พิสูจน์ให้เห็นว่าด้วยการเปลี่ยน resistor เพียงเล็กน้อยและ workflow การ flashing ที่ทันสมัย ASURO ยังคงเป็นหนึ่งในแพลตฟอร์มการศึกษาที่ดีที่สุดสำหรับการเรียนรู้ low-level embedded systems
บทนำ
งานนี้สมมติว่าคุณได้อ่านคู่มือ ASURO ฉบับเต็มแล้ว และมีฮาร์ดแวร์ที่ใช้งานได้สร้างขึ้นแล้ว (การทดสอบตัวเองสำเร็จ) (คุณไม่จำเป็นต้องใช้สิ่งนี้เพื่อทำความเข้าใจเนื้อหาส่วนใหญ่ แต่บางครั้งฉันจะอ้างอิงถึงคู่มือสำหรับคำแนะนำโดยละเอียดเพิ่มเติม)
โปรดทราบว่าก่อนที่ฉันจะเริ่มโปรเจกต์นี้ ฉันเป็นมือใหม่ด้าน Arduino และงานนี้ถูกสร้างขึ้นภายในเวลาเพียงสองสัปดาห์ ดังนั้นโปรดตระหนักว่าฉันอาจทำผิดพลาดหรือแก้ไขสิ่งต่างๆ ในทางที่ผิดไป บทความนี้ก็เช่นกัน มันเป็นเพียงการรวบรวมสิ่งที่ฉันได้เรียนรู้ทั้งหมด ไม่ใช่บทช่วยสอน นอกจากนี้ โปรดทราบว่าฉันเป็นคนเยอรมัน ดังนั้นภาษาอังกฤษของฉันอาจไม่สมบูรณ์แบบ ข้อเสนอแนะใดๆ จะได้รับการชื่นชมอย่างมาก
การปรับแต่งฮาร์ดแวร์
การปรับแต่งเหล่านี้ทำบน ASURO ที่ไม่มีการดัดแปลงอื่นใด ซึ่งใช้ Atmega8 โปรดอ่านเอกสารฉบับเต็ม รวมถึงโค้ด ก่อนทำการปรับเปลี่ยนใดๆ
- แนะนำ
การเปลี่ยน R18 และ R20 จาก 4k7 resistor เป็น 6k9 (4k7 + 2k2 แบบอนุกรม) จะให้เอาต์พุต motor encoder ที่สะอาดขึ้นสำหรับ `digitalRead` (ลดสัญญาณ LOW เพื่อให้ได้ค่าที่อ่านได้สะอาด)
การตัด R24 เพื่อลบ interrupt input สำหรับ switches ตัว resistor นี้ไม่จำเป็นและทำให้เกิด bugs
- ทางเลือก
การเพิ่ม bridge จาก analog pin A0 (23) ไปยัง interrupt pin 1 (5) และจาก analog pin A1 (24) ไปยัง interrupt pin 0 (4) จะทำให้การอ่าน motor encoder แม่นยำยิ่งขึ้น สำหรับการปรับแต่งนี้ interrupt pins ควรถูกงอขึ้นเพื่อไม่ให้สัมผัสกับ board อีกต่อไป แต่สัมผัสเฉพาะ bridge เท่านั้น คุณจะสูญเสียความสามารถในการเปลี่ยน Status LED เป็นสีแดงด้วยการปรับแต่งนี้ โปรดทราบว่าคุณจะต้องแก้ไขฟังก์ชันที่ให้มาตามคำแนะนำภายใต้ "Code Section | Failed Speed Test Code"

ฉันยังได้แก้ไขสติกเกอร์สีดำและสีขาวสำหรับเฟืองให้เป็นครึ่งดำครึ่งขาว เพื่อลดจำนวนจุดต่อการหมุนที่โค้ดต้องติดตาม แต่ถึงแม้จะมีสิ่งนี้และการปรับแต่ง interrupt ฉันก็ยังไม่สามารถนับ motor rotations ได้อย่างถูกต้อง
ASURO Pinout
หากคุณต้องการควบคุม pins แต่ละตัวบน ASURO ด้วยตัวเอง นี่คือตารางแสดงว่าแต่ละ pin ทำหน้าที่อะไร:
Pins ที่ไม่จำเป็นสำหรับการตั้งโปรแกรมถูกละไว้ โปรดดู full circuit diagram สำหรับ pins เหล่านี้
Digital pins จะคืนค่า LOW ที่แรงดันไฟฟ้าสูงสุด 0.2*operating voltage และ HIGH ที่แรงดันไฟฟ้าต่ำสุด 0.6*operating voltage
Analog pins จะคืนค่าระหว่าง 0 ถึง 1024 ขึ้นอยู่กับ voltage ที่จ่ายให้
1 (RESET)
2 (DP0) \t-\tInfrared IN
3 (DP1) \t-\tInfrared OUT
4 (DP2) \t-\tStatus LED red (ปิดใช้งานด้วย optional mod, interrupt pin)
5 (DP3) \t-\tSwitches interrupt (ปิดใช้งานด้วย recommended mod, interrupt pin)
6 (DP4) \t-\tLeft Motor Backward(pin นี้ + PWM(15) ทำให้เคลื่อนที่ถอยหลัง)
7 (VCC)
8 (GND)
9 (OSC1)
10 (OSC2)
11 (DP5)\t-\tLeft Motor Forward(pin นี้ + PWM(15) ทำให้เคลื่อนที่ไปข้างหน้า)
12 (DP6)\t-\tLinesensor LED
13 (DP7)\t-\tEncoder LEDs (เปิดใช้งาน หรือ encoders จะไม่ทำงาน)
14 (DP8)\t-\tStatus LED green
15 (DP9) \t-\tLeft Motor Speed Control(PWM, analogWrite( 9, [0-255] ); )
16 (DP10)\t-\tRight Motor Speed Control (PWM, analogWrite( 10, [0-255] ); )
17 (DP11)\t-\tเป็นส่วนหนึ่งของ Infrared Send Circuit
18 (DP12)\t-\tRight Motor Backward(pin นี้ + PWM(16) ทำให้เคลื่อนที่ถอยหลัง)
19 (DP13)\t-\tRight Motor Forward (pin นี้ + PWM(16) ทำให้เคลื่อนที่ไปข้างหน้า)
20 (AVCC)
21 (AREF)
22 (GND)
23 (A0) \t-\tRight Encoder Light Sensor
24 (A1) \t-\tLeft Encoder Light Sensor
25 (A2) \t-\tRight Line Sensor
26 (A3) \t-\tLeft Line Sensor
27 (A4) \t-\tAll Switches input (ค่าต่างกันขึ้นอยู่กับ switch(es) ที่กด)
28 (A5) \t-\tBattery Sensor

การติดตั้งซอฟต์แวร์
จากประสบการณ์ของฉันใน Windows 10 ซอฟต์แวร์ที่มาพร้อมกับ ASURO นั้นล้าสมัยบางส่วนและบางส่วนก็ไม่ทำงานอย่างถูกต้องเลย ด้วยเหตุนี้ ฉันจึงพบว่าโปรแกรมที่กล่าวถึงใน required Software เป็นทางเลือกที่เหมาะสม F