สารบัญ:

แขนหุ่นยนต์ควบคุมด้วยลวด: 31 ขั้นตอน
แขนหุ่นยนต์ควบคุมด้วยลวด: 31 ขั้นตอน

วีดีโอ: แขนหุ่นยนต์ควบคุมด้วยลวด: 31 ขั้นตอน

วีดีโอ: แขนหุ่นยนต์ควบคุมด้วยลวด: 31 ขั้นตอน
วีดีโอ: แนะนำการใช้งาน OTC Welding Robot 2024, พฤศจิกายน
Anonim
แขนหุ่นยนต์ควบคุมด้วยลวด
แขนหุ่นยนต์ควบคุมด้วยลวด

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

งานพิมพ์ 3 มิติ:

ที่นี่และที่นี่

เสบียง

6 เซอร์โวมอเตอร์ (MG995)

Arduino Uno

ลวดเหล็กเคลือบพลาสติกประมาณ 6 เมตร (0.5 มม.)

กล่อง 23x33x10 (อาจจะแคบลง ไม่สั้นลงแน่นอน)

ไม้กระดาน 33x10

ถั่วและสลักเกลียว

ท่อ 14 ซม. (จำเป็นเพื่อเป็นแนวทางในการร้อยสาย)

4 L-วงเล็บ

อะแดปเตอร์ 5 โวลต์

2 ขั้วต่อ 7 ทาง

สายเขียงหั่นขนม

ส่วนประกอบที่พิมพ์ 3 มิติ (ฉันไม่ได้ออกแบบ ลิงก์ไปยังองค์ประกอบในคำอธิบาย):

3 “น็อต”

2 “องค์ประกอบ 1”

1 “องค์ประกอบ 2”

2 “องค์ประกอบ 3”

1 ขั้วต่อฐาน

ขั้นตอนที่ 1: พิมพ์ส่วนประกอบ 3 มิติทั้งหมด

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

ขั้นตอนที่ 2: (ไม่บังคับ) ติดแผ่นไม้ที่ด้านล่างของกล่องเพื่อเพิ่มความแข็งแกร่ง

กล่องของฉันค่อนข้างอ่อนแอ ของคุณอาจจะไม่

ขั้นตอนที่ 3: วัดและตัดแผ่นไม้ให้พอดีกับกล่อง

ขั้นตอนที่ 4: ทำเครื่องหมายตำแหน่งของมอเตอร์

อย่าให้แขนทั้งสองแตะกัน

ขั้นตอนที่ 5: ทำเครื่องหมายตำแหน่งของวงเล็บและท่อ

ทำเครื่องหมายตำแหน่งของวงเล็บและท่อ
ทำเครื่องหมายตำแหน่งของวงเล็บและท่อ

ควรวางท่อไว้หน้ารูประมาณหนึ่งเซนติเมตร

ขั้นตอนที่ 6: เจาะรูสำหรับสายเคเบิลที่ออกมาจากกล่องของคุณ (USB และพลังงาน)

เจาะรูสำหรับสายเคเบิลที่ออกมาจากกล่องของคุณ (USB และแหล่งจ่ายไฟ)
เจาะรูสำหรับสายเคเบิลที่ออกมาจากกล่องของคุณ (USB และแหล่งจ่ายไฟ)

ขั้นตอนที่ 7: เจาะและเลื่อยหลุมที่ทำเครื่องหมายไว้ทั้งหมด

เจาะและเลื่อยหลุมที่ทำเครื่องหมายไว้ทั้งหมด
เจาะและเลื่อยหลุมที่ทำเครื่องหมายไว้ทั้งหมด

ขั้นตอนที่ 8: แนบมอเตอร์และท่อเข้ากับไม้กระดาน

ขั้นตอนที่ 9: แนบไม้กระดานกับกล่องด้วย L-Brackets

ขั้นตอนที่ 10: นำเทอร์มินัลบล็อกของคุณและประสานสายไฟเข้าด้วยกัน

นำเทอร์มินัลบล็อกของคุณและประสานสายไฟเข้าด้วยกัน
นำเทอร์มินัลบล็อกของคุณและประสานสายไฟเข้าด้วยกัน

ขั้นตอนที่ 11: ตัดปลายสายไฟอะแดปเตอร์และดึงสายไฟ

ขั้นตอนที่ 12: ระบุและทำเครื่องหมายสายบวกและลบ

ขั้นตอนที่ 13: ต่อสายไฟเข้ากับเทอร์มินัลบล็อกเพื่อให้สาย + เซอร์โวและ + ลวดจากสายไฟเชื่อมต่อกัน เหมือนกันสำหรับ - สายไฟ

ต่อสายไฟเข้ากับเทอร์มินัลบล็อกเพื่อให้สาย + เซอร์โวและสาย + จากสายไฟเชื่อมต่อกัน โดยจะเหมือนกันกับสายไฟ
ต่อสายไฟเข้ากับเทอร์มินัลบล็อกเพื่อให้สาย + เซอร์โวและสาย + จากสายไฟเชื่อมต่อกัน โดยจะเหมือนกันกับสายไฟ

ขั้นตอนที่ 14: ตัดหัวออกจาก Breadboard Wire

ตัดหัวออกจาก Breadboard Wire
ตัดหัวออกจาก Breadboard Wire

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

ขั้นตอนที่ 15: เจาะสามรูที่ด้านล่างของกล่องสำหรับสายไฟที่ออกมาจากแขนของคุณ

รูควรตรงกับรูในขั้วต่อฐาน

ขั้นตอนที่ 16: แนบตัวเชื่อมต่อฐานเข้ากับกล่อง

ติดขั้วต่อฐานเข้ากับกล่อง
ติดขั้วต่อฐานเข้ากับกล่อง

ขั้นตอนที่ 17: ใช้มีดหรือตะไบเล็บเพื่อทำให้ร่องลวดลึกขึ้น

ใช้มีดหรือตะไบเล็บเพื่อทำให้ร่องลวดลึกขึ้น
ใช้มีดหรือตะไบเล็บเพื่อทำให้ร่องลวดลึกขึ้น

ร่องลวดสำหรับองค์ประกอบ 2 และ 3 ตื้นเกินไป

ขั้นตอนที่ 18: สร้างแขน

สร้างแขน
สร้างแขน

สร้างแขนตามคำแนะนำที่นี่ คุณอาจจะต้องตะไบชิ้นส่วนให้พอดี

ขั้นตอนที่ 19: ติดตั้งการประมวลผลและ Arduino

การประมวลผลและ Arduino

ขั้นตอนที่ 20: วางโปรแกรมโค้ด

โค้ดอยู่ใต้หน้านี้

ขั้นตอนที่ 21: เชื่อมต่อหมุดควบคุมเซอร์โวกับ Arduino

เชื่อมต่อหมุดควบคุมเซอร์โวกับ Arduino
เชื่อมต่อหมุดควบคุมเซอร์โวกับ Arduino

ฉันเชื่อมต่อมอเตอร์ตัวแรกกับพินดิจิทัลตัวที่สาม มอเตอร์ตัวที่สองกับพินดิจิทัลที่สี่ และอื่นๆ ตรวจสอบให้แน่ใจว่าพินกราวด์ยังคงเชื่อมต่อกับแผงขั้วต่อ -

ขั้นตอนที่ 22: กดปุ่มรีเซ็ตในการประมวลผล สิ่งนี้จะตั้งค่า Arms ทั้งหมดเป็น 90 องศา

ขั้นตอนที่ 23: แก้ไขแขนเซอร์โวกับมอเตอร์ในแนวนอน

ขั้นตอนที่ 24: ร้อยสายไฟผ่านแขนเพื่อไม่ให้หย่อน

ตรวจสอบให้แน่ใจว่าคุณร้อยลวดผ่านรูให้มากที่สุดเท่าที่จะมากได้ ซึ่งจะเป็นการยึดไว้ชั่วคราวและถอดออกได้ง่าย

ขั้นตอนที่ 25: ทดสอบแขนและขันหรือคลายสายไฟตามต้องการ

ขั้นตอนที่ 26: ติดกาวสายไฟเข้ากับแขนเซอร์โวเพื่อให้เป็นแบบถาวร

ขั้นตอนที่ 27: หมายเหตุ

หมายเหตุ
หมายเหตุ

ฉันใช้ลวดเครื่องประดับ 0.5 มม. แต่ 0.4 มม. น่าจะใช้ได้ การออกแบบดั้งเดิมใช้ลวดพีวีซี แต่หักง่ายเกินไปและใช้งานยาก

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

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

ขั้นตอนที่ 28: การแก้ไขปัญหา

รูลวดปิดในองค์ประกอบที่พิมพ์ 3 มิติ:

คุณเพิ่มการรองรับสำหรับองค์ประกอบทั้งหมดแทนที่จะเป็นเพียงรูสลัก พิมพ์องค์ประกอบใหม่หรือเปิดรูด้วยเข็มที่ร้อนมาก

พอร์ต COM ปิดอยู่ คุณไม่สามารถสื่อสารกับ Arduino ได้:

Arduino ของคุณอาจไม่ยอมรับพอร์ต USB 3 (ของฉันไม่ได้) คุณสามารถซื้อสายต่อ USB 2 หรือใช้คอมพิวเตอร์ที่มีพอร์ต USB 2

รหัสไม่ทำงาน:

ทำตามบทช่วยสอนนี้และแก้ไขเพื่อสร้างโค้ดของคุณเอง

ส่วนหนึ่งของแขนไม่ขยับ:

สายไฟอาจพันกัน เพื่อตรวจสอบสิ่งนี้ให้ถอดแขนเซอร์โวออกจากเซอร์โวแล้วลองดึงสายไฟด้วยมือ คลายสายไฟและหากยังดึงสายไฟได้ยาก ให้ลองใช้ WD-40 หรือน้ำมันหล่อลื่นเพื่อให้เคลื่อนที่ได้ง่ายขึ้น

ขั้นตอนที่ 29: ลิงค์

แขนกลที่ไม่ใช่หุ่นยนต์:

แขน 3D Printables:

My Arm 3D พิมพ์ได้:

Arduino และการประมวลผล:

ขั้นตอนที่ 30: รหัส

แก้ไขจากรหัสนี้

รหัส Arduino:

#include //ประกาศมอเตอร์ Servo myservo1; เซอร์โว myservo2; เซอร์โว myservo3; เซอร์โว myservo4; เซอร์โว myservo5; เซอร์โว myservo6; // มอเตอร์ทั้งหมดถูกตั้งค่าไว้ที่ 90 องศาโดยค่าเริ่มต้น int current1 = 90; int ปัจจุบัน2 = 90; int ปัจจุบัน 3 = 90; int ปัจจุบัน4 = 90; int ปัจจุบัน 5 = 90; int ปัจจุบัน 6 = 90; // องศาต่ำสุดและสูงสุดที่มอเตอร์สามารถเข้าถึงได้ int mini1 = 0; int maxi1 = 180; int mini2 = 0; int maxi2 = 180; int mini3 = 0; int maxi3 = 180; int mini4 = 0; int maxi4 = 180; int mini5 = 0; int maxi5 = 180; int mini6 = 0; int maxi6 = 180; //องศาที่จะเพิ่มหรือลบออกจากตำแหน่งปัจจุบัน int องศาFoward = 5; // หน่วงเวลาเพื่อไม่ให้สองฟังก์ชันเกิดขึ้นในลำดับที่ไม่ถูกต้อง int delayBetweenSteps = 100; การตั้งค่าเป็นโมฆะ () {// ตั้งค่าพินควบคุมสำหรับมอเตอร์แต่ละตัว myservo1.attach (3); myservo2.attach(4); myservo3.attach(5); myservo4.attach(6); myservo5.attach(7); myservo6.attach(8); //ตั้งค่ามอเตอร์ทั้งหมดเป็นค่าเริ่มต้น myservo1.write(current1); myservo2.write(ปัจจุบัน2); myservo3.write(ปัจจุบัน3); myservo4.write (ปัจจุบัน 4) myservo5.write (ปัจจุบัน 5); myservo6.write(ปัจจุบัน6); //เริ่มการสื่อสารแบบอนุกรม @9600 bps Serial.begin(9600); } void loop(){ if(Serial.available()){ //if data is available to read ถ่าน val = Serial.read(); // ใส่ลงในถ่านนี้ // Motor Controls if (val == 'a' && current1 +degreeFoward mini1) { myservo1.write (current1 -degreeFoward); ปัจจุบัน1 = ปัจจุบัน1 - องศาไปข้างหน้า; ล่าช้า (delayBetweenSteps); } if(val == 'c' && current2 mini2){ myservo2.write(current2 - องศาโฟเวิร์ด); ปัจจุบัน2 = ปัจจุบัน2 - องศาไปข้างหน้า; ล่าช้า (delayBetweenSteps); } if(val == 'e' && current3 mini3){ myservo3.write(current3 - องศาโฟเวิร์ด); ปัจจุบัน3 = ปัจจุบัน3 - องศาไปข้างหน้า; ล่าช้า (delayBetweenSteps); } if(val == 'g' && current4 mini4){ myservo4.write (current4 - องศาโฟเวิร์ด); ปัจจุบัน4 = ปัจจุบัน4 - องศาไปข้างหน้า; ล่าช้า (delayBetweenSteps); } if(val == 'i' && current5 mini5){ myservo5.write (current5 - องศาโฟเวิร์ด); ปัจจุบัน5 = ปัจจุบัน5 - องศาไปข้างหน้า; ล่าช้า (delayBetweenSteps); } if(val == 'k' && current6 mini6){ myservo6.write(current6 - องศาโฟเวิร์ด); ปัจจุบัน6 = ปัจจุบัน6 - องศาไปข้างหน้า; ล่าช้า (delayBetweenSteps); } // ควบคุมความเร็ว if (val == 'w') { // ถ้ากดปุ่ม speed 1 องศาdegreeFoward = 1; ล่าช้า (delayBetweenSteps); } if(val == 'x'){ //ถ้าปุ่ม speed 5 กดปุ่มdegreeFoward = 5; ล่าช้า (delayBetweenSteps); } if(val == 'y'){ //ถ้าปุ่ม speed 10 กดปุ่ม degreeFoward = 10; ล่าช้า (delayBetweenSteps); } if(val == 'z'){ //ถ้าปุ่ม speed 20 กดปุ่ม degreeFoward = 20; ล่าช้า (delayBetweenSteps); } if(val == 'r'){ //ถ้าปุ่ม speed 20 กดปุ่ม myservo1.write(90); ปัจจุบัน1 = 90; myservo2.write(90); ปัจจุบัน2 = 90; myservo3.write(90); ปัจจุบัน3 = 90; myservo4.write(90); ปัจจุบัน4 = 90; myservo5.write(90); ปัจจุบัน5 = 90; myservo6.write(90); ปัจจุบัน6 = 90; ล่าช้า (delayBetweenSteps); } } }

รหัสประมวลผล:

นำเข้าการประมวลผล.ซีเรียล.*; การควบคุมการนำเข้าP5.*; //นำเข้าไลบรารี ControlP5 พอร์ตอนุกรม; ควบคุมP5 cp5; //สร้างฟอนต์ PFont วัตถุ ControlP5; การตั้งค่าเป็นโมฆะ () {// เหมือนกับขนาดโปรแกรม Arduino (300, 700); //ขนาดหน้าต่าง (ความกว้าง ความสูง) printArray(Serial.list()); //พิมพ์พอร์ตอนุกรมที่มีอยู่ทั้งหมด //หากคุณมีปัญหา อาจมาจากที่นี่ String portName = Serial.list()[0]; พอร์ต = ซีเรียลใหม่ (นี่, ชื่อพอร์ต, 9600); // ฉันเชื่อมต่อ arduino กับ com3 แล้ว มันจะแตกต่างกันใน linux และ mac os // ให้เพิ่มปุ่มไปที่หน้าต่างว่าง cp5 = new ControlP5 (นี่); แบบอักษร = createFont ("Arial", 13); // แบบอักษรที่กำหนดเองสำหรับปุ่มและชื่อ // ปุ่มควบคุมความเร็ว cp5.addButton("หนึ่ง") // "หนึ่ง" คือชื่อของปุ่ม.setPosition(50, 50) // พิกัด x และ y ที่มุมซ้ายบนของปุ่ม.setSize(55, 25) //(ความกว้าง ความสูง).setFont(แบบอักษร); cp5.addButton("ห้า").setPosition(110, 50).setSize(55, 25).setFont(ฟอนต์); cp5.addButton("สิบ").setPosition(170, 50).setSize(55, 25).setFont(ฟอนต์); cp5.addButton("ยี่สิบ").setPosition(230, 50).setSize(55, 25).setFont(ฟอนต์); cp5.addButton("รีเซ็ต").setPosition(110, 2).setSize(55, 25).setFont(ฟอนต์); cp5.addButton("Servo_1_Foward").setPosition(50, 90).setSize(190, 40).setFont(ฟอนต์); // ปุ่มควบคุมมอเตอร์ cp5.addButton("Servo_1_Back").setPosition(50, 140).setSize(190, 40).setFont(font); cp5.addButton("Servo_2_Foward").setPosition(50, 190).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_2_Back").setPosition(50, 240).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_3_Foward").setPosition(50, 290).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_3_Back").setPosition(50, 340).setSize(190, 40) //(ความกว้าง ความสูง).setFont(แบบอักษร); cp5.addButton("Servo_4_Foward").setPosition(50, 390).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_4_Back").setPosition(50, 440).setSize(190, 40) //(ความกว้าง ความสูง).setFont(แบบอักษร); cp5.addButton("Servo_5_Foward").setPosition(50, 490).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_5_Back").setPosition(50, 540).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_6_Foward").setPosition(50, 590).setSize(190, 40).setFont(ฟอนต์); cp5.addButton("Servo_6_Back").setPosition(50, 640).setSize(190, 40).setFont(แบบอักษร); } void draw (){ //เหมือนกับลูปในพื้นหลัง Arduino (192, 215, 249); // สีพื้นหลังของหน้าต่าง (r, g, b) หรือ (0 ถึง 255) // เพิ่มข้อความว่า speed control is speed control fill(0, 10, 25); //สีข้อความ (r, g, b) textFont(แบบอักษร); text("ควบคุมความเร็ว", 50, 40); // ("ข้อความ", พิกัด x, พิกัด y) } // ให้เพิ่มฟังก์ชันบางอย่างให้กับปุ่มของเรา // ดังนั้นเมื่อคุณกดปุ่มใดๆ มันจะส่งถ่านเฉพาะผ่านพอร์ตอนุกรม // ฉันแน่ใจว่ามันเป็นไปได้ที่จะส่งสตริง แทนที่จะเป็น chars และมันน่าจะสมเหตุสมผลกว่า แต่ฉันไม่รู้ว่าต้องทำอย่างไร //Speed Control Commands void One(){ port.write('w'); } โมฆะ Five(){ port.write('x'); } โมฆะ Ten(){ port.write('y'); } โมฆะยี่สิบ (){ port.write ('z'); } // คำสั่งควบคุมมอเตอร์เป็นโมฆะ Servo_1_Foward () { port.write ('a'); } เป็นโมฆะ Servo_1_Back(){ port.write('b'); } เป็นโมฆะ Servo_2_Foward(){ port.write('c'); } เป็นโมฆะ Servo_2_Back(){ port.write('d'); } เป็นโมฆะ Servo_3_Foward(){ port.write('e'); } เป็นโมฆะ Servo_3_Back(){ port.write('f'); } เป็นโมฆะ Servo_4_Foward(){ port.write('g'); } เป็นโมฆะ Servo_4_Back(){ port.write('h'); } เป็นโมฆะ Servo_5_Foward(){ port.write('i'); } เป็นโมฆะ Servo_5_Back(){ port.write('j'); } เป็นโมฆะ Servo_6_Foward(){ port.write('k'); } เป็นโมฆะ Servo_6_Back(){ port.write('l'); } เป็นโมฆะ รีเซ็ต(){ port.write('r'); }

ขั้นตอนที่ 31: รูปภาพเพิ่มเติม

แนะนำ: