สารบัญ:

แขนกล: เซ่น: 4 ขั้นตอน
แขนกล: เซ่น: 4 ขั้นตอน

วีดีโอ: แขนกล: เซ่น: 4 ขั้นตอน

วีดีโอ: แขนกล: เซ่น: 4 ขั้นตอน
วีดีโอ: แขนกลคนแปรธาตุ/(สปอยอนิเมะเก่าแบบรวบรัด) 2024, กรกฎาคม
Anonim
แขนกล: Jensen
แขนกล: Jensen

Jensen เป็นแขนหุ่นยนต์ที่สร้างขึ้นบนแพลตฟอร์ม Arduino โดยเน้นที่การวางแผนการเคลื่อนไหวที่ใช้งานง่าย โดยทำเป็นโครงการอิสระ 1 เครดิตภายใต้การให้คำปรึกษาจาก Charles B. Malloch ปริญญาเอก มันสามารถทำซ้ำชุดของการเคลื่อนไหวที่ตั้งโปรแกรมไว้โดยการขยับแขนด้วยตนเอง ฉันได้รับแรงบันดาลใจในการสร้างมันจากการได้เห็นแขนกลอื่นๆ ที่สร้างขึ้นในพื้นที่ผู้ผลิต UMass Amherst M5 นอกจากนี้ ฉันต้องการเรียนรู้วิธีใช้ซอฟต์แวร์ CAD และฉันต้องการสร้างโครงการ Arduino ขั้นสูง ผมเห็นว่านี่เป็นโอกาสที่จะทำสิ่งเหล่านั้นทั้งหมด

ขั้นตอนที่ 1: การออกแบบและขอบเขตดั้งเดิม

การออกแบบและขอบเขตดั้งเดิม
การออกแบบและขอบเขตดั้งเดิม

ซอฟต์แวร์ CAD ที่ฉันเลือกเรียนรู้สำหรับโครงการนี้คือ OnShape และสิ่งแรกที่ฉันสร้างโมเดลคือเซอร์โวแอนะล็อก HiTec HS-422 ฉันเลือกเซอร์โวเพราะมันมีให้ในท้องถิ่นและเป็นราคาที่สมเหตุสมผล นอกจากนี้ยังเป็นแนวทางปฏิบัติที่ดีสำหรับการเรียนรู้ OnShape ก่อนที่จะเริ่มออกแบบชิ้นส่วนของตัวเอง ที่จุดเริ่มต้นนี้ของโครงการ ฉันมีความคิดทั่วไปเกี่ยวกับสิ่งที่ฉันต้องการให้แขนสามารถทำได้ ฉันต้องการให้มันมีช่วงการเคลื่อนไหวที่เหมาะสมและมีกริปเปอร์สำหรับหยิบของ ข้อมูลจำเพาะทั่วไปเหล่านี้แจ้งการออกแบบในขณะที่ฉันสร้างแบบจำลองต่อไปใน CAD ข้อจำกัดในการออกแบบอีกประการหนึ่งที่ฉันมี ณ จุดนี้คือขนาดของเตียงพิมพ์บนเครื่องพิมพ์ 3 มิติของฉัน นั่นเป็นสาเหตุที่ฐานที่คุณเห็นในภาพด้านบนเป็นสี่เหลี่ยมจตุรัสที่ค่อนข้างดั้งเดิม

ในระหว่างขั้นตอนของโครงการนี้ ฉันยังระดมความคิดด้วยว่าต้องการควบคุมแขนอย่างไร แขนหุ่นยนต์ตัวหนึ่งที่ฉันได้รับแรงบันดาลใจจากพื้นที่ผู้ผลิตใช้แขนหุ่นกระบอกเพื่อควบคุม อีกวิธีหนึ่งใช้วิธีการเขียนโปรแกรมเส้นทางที่ใช้งานง่าย ซึ่งผู้ใช้จะย้ายแขนไปยังตำแหน่งต่างๆ แขนจะวนกลับผ่านตำแหน่งเหล่านั้น

แผนเดิมของฉันคือสร้างแขนให้เสร็จ จากนั้นใช้วิธีควบคุมทั้งสองนี้ ฉันยังต้องการสร้างแอปพลิเคชันคอมพิวเตอร์เพื่อควบคุมมันหลังจากนั้น อย่างที่คุณอาจบอกได้ ฉันได้ลดขอบเขตของแง่มุมนี้ของโครงการลง เมื่อฉันเริ่มทำงานกับสองวิธีการควบคุมแรกนั้น ฉันพบว่าการเขียนโปรแกรมพาธที่ใช้งานง่ายนั้นซับซ้อนกว่าที่ฉันคิด นั่นคือตอนที่ฉันตัดสินใจที่จะโฟกัสและใช้วิธีการควบคุมอื่นๆ ค้างไว้โดยไม่มีกำหนด

ขั้นตอนที่ 2: ควบคุม

ควบคุม
ควบคุม

วิธีการควบคุมที่ฉันเลือกทำงานดังนี้: คุณขยับแขนด้วยมือของคุณไปยังตำแหน่งต่างๆ และ "บันทึก" ตำแหน่งเหล่านั้น แต่ละตำแหน่งมีข้อมูลเกี่ยวกับมุมระหว่างแต่ละลิงค์ของแขน หลังจากคุณบันทึกตำแหน่งเสร็จแล้ว คุณจะกดปุ่มเล่นและแขนจะกลับไปที่ตำแหน่งเหล่านั้นตามลำดับ

ในวิธีการควบคุมนี้ มีหลายสิ่งที่ต้องคิด เพื่อให้เซอร์โวแต่ละตัวกลับไปที่มุมที่บันทึกไว้ ฉันต้อง "บันทึก" มุมเหล่านั้นตั้งแต่แรก สิ่งนี้ต้องใช้ Arduino Uno ที่ฉันใช้เพื่อรับมุมปัจจุบันของเซอร์โวแต่ละตัว เพื่อนของฉัน Jeremy Paradie ผู้สร้างแขนหุ่นยนต์ที่ใช้วิธีการควบคุมนี้ บอกให้ฉันใช้โพเทนชิออมิเตอร์ภายในของเซอร์โวอดิเรกแต่ละตัว นี่คือโพเทนชิออมิเตอร์ที่เซอร์โวใช้ตัวเองเพื่อเข้ารหัสมุมของมัน ฉันเลือกเซอร์โวทดสอบ บัดกรีลวดเข้ากับพินตรงกลางของโพเทนชิออมิเตอร์ภายใน และเจาะรูในโครงเพื่อป้อนลวดด้านนอก

ตอนนี้ฉันสามารถรับมุมปัจจุบันได้โดยการอ่านแรงดันไฟฟ้าที่พินกลางของโพเทนชิออมิเตอร์ อย่างไรก็ตาม มีปัญหาใหม่สองประการ ประการแรก มีสัญญาณรบกวนในรูปของแรงดันไฟพุ่งขึ้นบนสัญญาณที่มาจากพินตรงกลาง ปัญหานี้กลายเป็นปัญหาจริงในภายหลัง ประการที่สอง ช่วงของค่าสำหรับการส่งมุมและรับมุมนั้นแตกต่างกัน

การบอกให้เซอร์โวมอเตอร์อดิเรกเคลื่อนไปที่มุมระหว่าง 0 ถึง 180 องศา เป็นการส่งสัญญาณ PWM ที่มีเวลาสูงซึ่งสอดคล้องกับมุม ในทางตรงกันข้าม การใช้พินอินพุทแบบอะนาล็อกของ Arduino เพื่ออ่านแรงดันไฟฟ้าที่พินกลางของโพเทนชิออมิเตอร์ขณะย้ายฮอร์นเซอร์โวระหว่าง 0 ถึง 180 องศาจะส่งกลับช่วงของค่าที่แยกจากกัน ดังนั้น จำเป็นต้องใช้คณิตศาสตร์บางส่วนเพื่อแปลค่าอินพุตที่บันทึกไว้เป็นค่าเอาต์พุต PWM ที่สอดคล้องกันซึ่งจำเป็นในการคืนเซอร์โวไปที่มุมเดียวกัน

ความคิดแรกของฉันคือการใช้แผนที่ช่วงอย่างง่ายเพื่อค้นหา PWM เอาต์พุตที่สอดคล้องกันสำหรับแต่ละมุมที่บันทึกไว้ สิ่งนี้ใช้ได้ผล แต่ก็ไม่แม่นยำมาก ในกรณีของโครงการของฉัน ช่วงของค่าเวลาสูงของ PWM ที่สอดคล้องกับช่วงมุม 180 องศานั้นมากกว่าช่วงของค่าอินพุตแบบอะนาล็อกมาก นอกจากนี้ ช่วงทั้งสองนี้ไม่ต่อเนื่องและประกอบด้วยจำนวนเต็มเท่านั้น ดังนั้นเมื่อฉันจับคู่ค่าอินพุตที่บันทึกไว้กับค่าเอาต์พุต ความแม่นยำก็หายไป เมื่อถึงจุดนี้ ฉันคิดว่าฉันต้องการลูปควบคุมเพื่อให้เซอร์โวของฉันอยู่ในตำแหน่งที่ต้องการ

ฉันเขียนโค้ดสำหรับลูปควบคุม PID ซึ่งอินพุตเป็นแรงดันไฟฟ้าพินกลางและเอาต์พุตคือเอาต์พุต PWM แต่ค้นพบอย่างรวดเร็วว่าฉันต้องการเพียงการควบคุมแบบรวม ในสถานการณ์สมมตินี้ เอาต์พุตและอินพุตทั้งสองเป็นตัวแทนของมุม ดังนั้นการเพิ่มการควบคุมตามสัดส่วนและการควบคุมแบบอนุพันธ์จึงมีแนวโน้มที่จะทำให้มันพุ่งเกินหรือมีพฤติกรรมที่ไม่พึงประสงค์ หลังจากปรับอินทิกรัลคอนโทรลแล้ว ยังมีปัญหาสองประการ ประการแรก หากข้อผิดพลาดเริ่มต้นระหว่างกระแสและมุมที่ต้องการมีขนาดใหญ่ เซอร์โวจะเร่งความเร็วเร็วเกินไป ฉันสามารถลดค่าคงที่สำหรับตัวควบคุมแบบรวมได้ แต่นั่นทำให้การเคลื่อนไหวโดยรวมช้าเกินไป ประการที่สอง การเคลื่อนไหวนั้นกระวนกระวายใจ ซึ่งเป็นผลมาจากสัญญาณรบกวนที่สัญญาณอินพุตแบบอะนาล็อก ลูปควบคุมอ่านสัญญาณนี้อย่างต่อเนื่อง ดังนั้นแรงดันไฟฟ้าพุ่งสูงขึ้นทำให้เกิดการเคลื่อนไหวกระวนกระวายใจ (เมื่อถึงจุดนี้ ฉันยังย้ายจากเซอร์โวทดสอบหนึ่งตัวไปยังชุดประกอบดังภาพด้านบน ฉันยังสร้างอ็อบเจ็กต์ลูปควบคุมสำหรับเซอร์โวแต่ละตัวในซอฟต์แวร์ด้วย)

ฉันแก้ไขปัญหาของการเร่งความเร็วที่เร็วเกินไปโดยใส่ตัวกรองค่าเฉลี่ยเคลื่อนที่แบบถ่วงน้ำหนักแบบทวีคูณ (EWMA) ที่เอาต์พุต โดยการเฉลี่ยเอาท์พุต การเคลื่อนไหวแหลมขนาดใหญ่ในการเคลื่อนที่ลดลง (รวมถึงความกระวนกระวายใจจากเสียงรบกวน) อย่างไรก็ตาม สัญญาณรบกวนบนสัญญาณอินพุตยังคงเป็นปัญหา ดังนั้นขั้นตอนต่อไปของโครงการของฉันจึงพยายามแก้ปัญหานั้น

ขั้นตอนที่ 3: เสียงรบกวน

เสียงรบกวน
เสียงรบกวน

ภาพข้างบน

สีแดง: สัญญาณอินพุตดั้งเดิม

เป็นสีน้ำเงิน: สัญญาณอินพุตหลังการประมวลผล

ขั้นตอนแรกในการลดสัญญาณรบกวนบนสัญญาณอินพุตคือการทำความเข้าใจสาเหตุของสัญญาณรบกวน การตรวจสอบสัญญาณบนออสซิลโลสโคปพบว่าแรงดันไฟพุ่งขึ้นที่อัตรา 50Hz ฉันบังเอิญรู้ว่าสัญญาณ PWM ที่ส่งไปยังเซอร์โวนั้นมีอัตรา 50Hz เช่นกัน ดังนั้นฉันจึงเดาว่าแรงดันไฟกระชากมีส่วนเกี่ยวข้องกับสิ่งนั้น ฉันตั้งสมมติฐานว่าการเคลื่อนที่ของเซอร์โวทำให้เกิดแรงดันไฟฟ้าพุ่งขึ้นบนพิน V+ ของโพเทนชิโอมิเตอร์ ซึ่งทำให้การอ่านบนพินตรงกลางยุ่งเหยิง

นี่คือจุดที่ฉันพยายามลดเสียงรบกวนเป็นครั้งแรก ฉันเปิดเซอร์โวแต่ละตัวอีกครั้งและเพิ่มลวดที่มาจากพิน V+ บนโพเทนชิออมิเตอร์ ฉันต้องการอินพุตแบบอะนาล็อกเพิ่มเติมเพื่ออ่านมากกว่า Arduino Uno ดังนั้นฉันจึงย้ายไปที่ Arduino Mega ณ จุดนี้ ในโค้ดของฉัน ฉันเปลี่ยนอินพุตมุมจากการอ่านค่าแรงดันอนาล็อกบนพินตรงกลางเป็นอัตราส่วนระหว่างแรงดันไฟฟ้าบนพินตรงกลางกับแรงดันไฟฟ้าบนพิน V+ ความหวังของฉันคือว่าหากมีแรงดันไฟฟ้าเกิดขึ้นที่พิน มันจะหักล้างในอัตราส่วน

ฉันนำทุกอย่างกลับมารวมกันและทดสอบ แต่เดือยยังคงเกิดขึ้น สิ่งที่ฉันควรทำในตอนนี้คือสำรวจพื้นเพของฉัน ความคิดต่อไปของฉันคือการวางโพเทนชิโอมิเตอร์บนแหล่งจ่ายไฟแยกต่างหากทั้งหมด ฉันถอดสาย V+ ออกจากอินพุตแบบอะนาล็อกบน Arduino และต่อเข้ากับแหล่งจ่ายไฟแยกต่างหาก ฉันเคยตรวจสอบพินมาก่อนดังนั้นฉันจึงรู้ว่าต้องใช้แรงดันไฟฟ้าเท่าใด ฉันยังตัดการเชื่อมต่อระหว่างแผงควบคุมและพิน V+ ในแต่ละเซอร์โว ฉันรวมทุกอย่างกลับเข้าด้วยกัน เปลี่ยนรหัสอินพุตมุมกลับเป็นเหมือนเดิม แล้วทดสอบ ตามที่คาดไว้ ไม่มีแรงดันไฟกระชากบนพินอินพุตอีกต่อไป อย่างไรก็ตาม มีปัญหาใหม่เกิดขึ้น - การวางโพเทนชิโอมิเตอร์บนแหล่งจ่ายไฟแยกต่างหากทำให้ลูปควบคุมภายในของเซอร์โวยุ่งเหยิงไปหมด แม้ว่าพิน V+ จะได้รับแรงดันไฟฟ้าเท่าเดิม แต่การเคลื่อนไหวของเซอร์โวนั้นไม่แน่นอนและไม่เสถียร

ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันจึงตรวจสอบการเชื่อมต่อภาคพื้นดินในเซอร์โวในที่สุด มีแรงดันไฟตกเฉลี่ยประมาณ 0.3 โวลต์ทั่วพื้นดิน และจะเพิ่มขึ้นอย่างมากเมื่อเซอร์โวดึงกระแสไฟ เห็นได้ชัดว่าหมุดเหล่านั้นไม่ถือว่าเป็น "กราวด์" อีกต่อไป และสามารถอธิบายได้ดีกว่าว่าเป็นหมุด "อ้างอิง" แผงควบคุมในเซอร์โวจะต้องวัดแรงดันไฟฟ้าที่พินกลางของโพเทนชิออมิเตอร์ที่สัมพันธ์กับแรงดันทั้งบน V+ และพินอ้างอิง การเปิดโพเทนชิโอมิเตอร์แบบแยกจากกันทำให้การวัดสัมพัทธ์นั้นยุ่งเหยิงเพราะตอนนี้แทนที่จะเกิดแรงดันไฟเกิดขึ้นที่พินทั้งหมด มันเกิดขึ้นที่พินอ้างอิงเท่านั้น

ที่ปรึกษาของฉัน ดร.มัลลอค ช่วยฉันแก้ปัญหาทั้งหมดนี้ และแนะนำให้ฉันวัดแรงดันไฟบนพินกลางที่สัมพันธ์กับพินอื่นๆ ด้วย นั่นคือสิ่งที่ฉันทำในความพยายามครั้งที่สามและครั้งสุดท้ายในการลดสัญญาณรบกวนของอินพุตมุม ฉันเปิดเซอร์โวแต่ละตัว ต่อสายที่ฉันตัดไปแล้ว และเพิ่มสายที่สามที่มาจากพินอ้างอิงบนโพเทนชิออมิเตอร์ ในรหัสของฉัน ฉันสร้างอินพุตมุมเทียบเท่ากับนิพจน์ต่อไปนี้: (พินกลาง - พินอ้างอิง) / (V+พิน - พินอ้างอิง) ฉันทดสอบแล้วและลดผลกระทบของแรงดันไฟกระชากได้สำเร็จ นอกจากนี้ ฉันยังใส่ตัวกรอง EWMA ในอินพุตนี้ด้วย สัญญาณที่ประมวลผลนี้และสัญญาณดั้งเดิมดังภาพด้านบน

ขั้นตอนที่ 4: ห่อสิ่งต่าง ๆ

ห่อของ
ห่อของ

เมื่อปัญหาด้านเสียงได้รับการแก้ไขอย่างสุดความสามารถ ฉันจึงเริ่มแก้ไขและทำส่วนสุดท้ายของการออกแบบ แขนรับน้ำหนักบนเซอร์โวในฐานมากเกินไป ดังนั้นฉันจึงสร้างฐานใหม่ที่รองรับน้ำหนักของแขนโดยใช้ตลับลูกปืนขนาดใหญ่ ฉันยังพิมพ์กริปเปอร์และขัดเล็กน้อยเพื่อให้มันทำงาน

ฉันพอใจมากกับผลลัพธ์สุดท้าย การวางแผนการเคลื่อนไหวที่ใช้งานง่ายนั้นทำงานอย่างสม่ำเสมอและการเคลื่อนไหวนั้นราบรื่นและแม่นยำโดยพิจารณาจากทุกสิ่ง หากมีคนอื่นต้องการทำโครงการนี้ อันดับแรกฉันขอแนะนำให้พวกเขาสร้างเวอร์ชันที่เรียบง่ายกว่านี้ก่อน เมื่อมองย้อนกลับไป การทำสิ่งนี้โดยใช้เซอร์โวมอเตอร์อดิเรกนั้นไร้เดียงสามาก และความยากลำบากที่ฉันทำให้มันใช้งานได้ก็แสดงให้เห็นแล้วว่า ฉันคิดว่ามันเป็นปาฏิหาริย์ที่แขนทำงานได้ดีเหมือนที่มันเป็น ฉันยังต้องการสร้างแขนหุ่นยนต์ที่สามารถเชื่อมต่อกับคอมพิวเตอร์ เรียกใช้โปรแกรมที่ซับซ้อนมากขึ้น และเคลื่อนไหวได้อย่างแม่นยำมากขึ้น ดังนั้นสำหรับโครงการต่อไปของฉัน ฉันจะทำอย่างนั้น ฉันจะใช้เซอร์โวหุ่นยนต์ดิจิทัลคุณภาพสูง และหวังว่าจะช่วยให้ฉันหลีกเลี่ยงปัญหามากมายที่ฉันพบในโครงการนี้

เอกสาร CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

แนะนำ: