สารบัญ:

กระเบื้องเปียโนเล่นแขนหุ่นยนต์: 5 ขั้นตอน
กระเบื้องเปียโนเล่นแขนหุ่นยนต์: 5 ขั้นตอน

วีดีโอ: กระเบื้องเปียโนเล่นแขนหุ่นยนต์: 5 ขั้นตอน

วีดีโอ: กระเบื้องเปียโนเล่นแขนหุ่นยนต์: 5 ขั้นตอน
วีดีโอ: #shorts #หินปูนเกาะหนามาก #scaling 2024, กรกฎาคม
Anonim
กระเบื้องเปียโนเล่นแขนหุ่นยนต์
กระเบื้องเปียโนเล่นแขนหุ่นยนต์

กลุ่มนี้ประกอบด้วยวิศวกรระบบอัตโนมัติ 2 คนจาก UCN ซึ่งเกิดแนวคิดที่ยอดเยี่ยมว่าเรามีแรงจูงใจที่จะทำและพัฒนา แนวคิดนี้ใช้บอร์ด Arduino ที่ควบคุมแขนหุ่นยนต์ บอร์ด Arduino เป็นสมองของการทำงาน จากนั้นตัวกระตุ้นของการทำงาน แขนหุ่นยนต์ จะทำในสิ่งที่ต้องการ คำอธิบายเชิงลึกเพิ่มเติมจะมาในภายหลัง

ขั้นตอนที่ 1: อุปกรณ์

อุปกรณ์
อุปกรณ์

แขนหุ่นยนต์:

Phantomx Pincher Robot Arm Kit Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

ซอฟต์แวร์สำหรับหุ่นยนต์- https://www.arduino.cc/en/Main/OldSoftwareRelease… กล้องตรวจจับสี:

กล้อง CMUcam5 Pixy - (https://charmedlabs.com/default/pixy-cmucam5/)

ซอฟต์แวร์ - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

ขั้นตอนที่ 2: การตั้งค่า Arduino

Arduino Setup
Arduino Setup

คุณสามารถดูการตั้งค่าบนกระดานได้ที่นี่ ซึ่งง่ายมาก

ด้านซ้ายมือคือพาวเวอร์ซัพพลาย

อันกลางสำหรับเซอร์โวตัวแรกซึ่งต่อมาเชื่อมต่อกับเซอร์โวอื่น ๆ เซอร์โวโดยเซอร์โว

ด้านล่างเป็นที่ที่เราควบคุมบอร์ดจากพีซีหรือแล็ปท็อปที่มีอินพุต USB ที่ปลายอีกด้านหนึ่ง

ขั้นตอนที่ 3: โปรแกรมสุดท้าย

||| โปรแกรม |||

#รวม

#include #include "poses.h" #include //Pixy Library #include

#define POSECOUNT 5

BioloidController ไบโอลอยด์ = BioloidController (1000000);

const int SERVOCOUNT = 5; รหัสภายใน; ตำแหน่งภายใน; IDCheck บูลีน; RunCheck บูลีน;

การตั้งค่าเป็นโมฆะ () { pinMode (0, OUTPUT); ax12SetRegister2(1, 32, 50);// ตั้งค่าข้อต่อหมายเลข 1 register 32 เพื่อเร่ง 50 ax12SetRegister2(2, 32, 50); // ตั้งค่าข้อต่อหมายเลข 2 register 32 เพื่อความเร็ว 50 ax12SetRegister2(3, 32, 50);//ชุดร่วมหมายเลข 3 register 32 ความเร็ว 50. ax12SetRegister2(4, 32, 50);//ชุดข้อต่อหมายเลข 4 register 32 ความเร็ว 50. ax12SetRegister2(5, 32, 100);//ชุดข้อต่อหมายเลข 5 register 32 เพื่อเพิ่มความเร็ว 100 // เริ่มต้นตัวแปร id = 1; ตำแหน่ง = 0; IDCheck = 1; RunCheck = 0; //เปิดพอร์ตอนุกรม Serial.begin(9600); ล่าช้า (500); Serial.println("##############################"); Serial.println ("สร้างการสื่อสารแบบอนุกรมแล้ว");

// ตรวจสอบแรงดันไฟแบตเตอรี่ Lipo CheckVoltage();

//สแกนเซอร์โว กลับตำแหน่ง MoveTest(); มูฟโฮม(); เมนูตัวเลือก(); RunCheck = 1; }

วงเป็นโมฆะ () { // อ่านเซ็นเซอร์: int inByte = Serial.read ();

สวิตช์ (เป็นไบต์) {

กรณี '1': MovePose1(); หยุดพัก;

กรณี '2': MovePose2(); หยุดพัก; กรณี '3': MovePose3(); หยุดพัก;

กรณี '4': MovePose4(); หยุดพัก;

กรณี '5': MoveHome(); หยุดพัก; กรณี '6': Grab(); หยุดพัก;

กรณี '7': LEDTest(); หยุดพัก;

กรณี '8': RelaxServos(); หยุดพัก; } }

เป็นโมฆะ CheckVoltage(){ // รอ แล้วตรวจสอบแรงดันไฟ (ความปลอดภัย LiPO) แรงดันลอย = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println("##############################"); Serial.print ("แรงดันระบบ: "); Serial.print (แรงดัน); Serial.println (" โวลต์."); if (แรงดันไฟฟ้า 10.0) { Serial.println ("ระดับแรงดันไฟฟ้าที่ระบุ"); } ถ้า (RunCheck == 1){ MenuOptions(); } Serial.println("##############################"); }

โมฆะ MoveHome(){ ล่าช้า (100); // แนะนำให้หยุด bioloid.loadPose (หน้าแรก); // โหลดท่าจาก FLASH ลงในบัฟเฟอร์ nextPose bioloid.readPose(); // อ่านในตำแหน่งเซอร์โวปัจจุบันไปยังบัฟเฟอร์ curPose Serial.println("##############################"); Serial.println ("การย้ายเซอร์โวไปที่ตำแหน่งหลัก"); Serial.println("##############################"); ล่าช้า (1000); bioloid.interpolateSetup (1000); // ตั้งค่าสำหรับการแก้ไขจากปัจจุบัน -> ถัดไปมากกว่า 1/2 วินาที while(bioloid.interpolating > 0){ // ทำสิ่งนี้ในขณะที่เรายังไม่ถึงตำแหน่งใหม่ของเรา bioloid.interpolateStep(); // ย้ายเซอร์โว ถ้าจำเป็น ล่าช้า(3); } ถ้า (RunCheck == 1){ MenuOptions(); } }

เป็นโมฆะ MovePose1 () { ล่าช้า (100); // แนะนำให้หยุด bioloid.loadPose(Pose1); // โหลดท่าจาก FLASH ลงในบัฟเฟอร์ nextPose bioloid.readPose(); // อ่านในตำแหน่งเซอร์โวปัจจุบันไปยังบัฟเฟอร์ curPose Serial.println("##############################"); Serial.println("ย้ายเซอร์โวไปยังตำแหน่งที่ 1"); Serial.println("##############################"); ล่าช้า (1000); bioloid.interpolateSetup (1000); // ตั้งค่าสำหรับการแก้ไขจากปัจจุบัน -> ถัดไปมากกว่า 1/2 วินาที while(bioloid.interpolating > 0){ // ทำสิ่งนี้ในขณะที่เรายังไม่ถึงตำแหน่งใหม่ของเรา bioloid.interpolateStep(); // ย้ายเซอร์โว ถ้าจำเป็น ล่าช้า(3); } SetPosition(3, 291); //กำหนดตำแหน่งของข้อต่อ 3 เป็น '0' ดีเลย์(100);//รอให้ข้อต่อเคลื่อนที่ถ้า (RunCheck == 1){ MenuOptions(); } }

เป็นโมฆะ MovePose2 () { ล่าช้า (100); // แนะนำให้หยุด bioloid.loadPose(Pose2); // โหลดท่าจาก FLASH ลงในบัฟเฟอร์ nextPose bioloid.readPose(); // อ่านในตำแหน่งเซอร์โวปัจจุบันไปยังบัฟเฟอร์ curPose Serial.println("##############################"); Serial.println("ย้ายเซอร์โวไปยังตำแหน่งที่ 2"); Serial.println("##############################"); ล่าช้า (1000); bioloid.interpolateSetup (1000); // ตั้งค่าสำหรับการแก้ไขจากปัจจุบัน -> ถัดไปมากกว่า 1/2 วินาที while(bioloid.interpolating > 0){ // ทำสิ่งนี้ในขณะที่เรายังไม่ถึงตำแหน่งใหม่ของเรา bioloid.interpolateStep(); // ย้ายเซอร์โว ถ้าจำเป็น ล่าช้า(3); } SetPosition(3, 291); //กำหนดตำแหน่งของข้อต่อ 3 เป็น '0' ดีเลย์(100);//รอให้ข้อต่อเคลื่อนที่ถ้า (RunCheck == 1){ MenuOptions(); } } โมฆะ MovePose3(){ ล่าช้า (100); // แนะนำให้หยุด bioloid.loadPose(Pose3); // โหลดท่าจาก FLASH ลงในบัฟเฟอร์ nextPose bioloid.readPose(); // อ่านในตำแหน่งเซอร์โวปัจจุบันไปยังบัฟเฟอร์ curPose Serial.println("##############################"); Serial.println("ย้ายเซอร์โวไปยังตำแหน่งที่ 3"); Serial.println("##############################"); ล่าช้า (1000); bioloid.interpolateSetup (1000); // ตั้งค่าสำหรับการแก้ไขจากปัจจุบัน -> ถัดไปมากกว่า 1/2 วินาที while(bioloid.interpolating > 0){ // ทำสิ่งนี้ในขณะที่เรายังไม่ถึงตำแหน่งใหม่ของเรา bioloid.interpolateStep(); // ย้ายเซอร์โว ถ้าจำเป็น ล่าช้า(3); } SetPosition(3, 291); //กำหนดตำแหน่งของข้อต่อ 3 เป็น '0' ดีเลย์(100);//รอให้ข้อต่อเคลื่อนที่ถ้า (RunCheck == 1){ MenuOptions(); } }

เป็นโมฆะ MovePose4 () { ล่าช้า (100); // แนะนำให้หยุด bioloid.loadPose(Pose4); // โหลดท่าจาก FLASH ลงในบัฟเฟอร์ nextPose bioloid.readPose(); // อ่านในตำแหน่งเซอร์โวปัจจุบันไปยังบัฟเฟอร์ curPose Serial.println("##############################"); Serial.println("ย้ายเซอร์โวไปยังตำแหน่งที่ 4"); Serial.println("##############################"); ล่าช้า (1000); bioloid.interpolateSetup (1000); // ตั้งค่าสำหรับการแก้ไขจากปัจจุบัน -> ถัดไปมากกว่า 1/2 วินาที while(bioloid.interpolating > 0){ // ทำสิ่งนี้ในขณะที่เรายังไม่ถึงตำแหน่งใหม่ของเรา bioloid.interpolateStep(); // ย้ายเซอร์โว ถ้าจำเป็น ล่าช้า(3); } SetPosition(3, 291); //กำหนดตำแหน่งของข้อต่อ 3 เป็น '0' ดีเลย์(100);//รอให้ข้อต่อเคลื่อนที่ถ้า (RunCheck == 1){ MenuOptions(); } }

โมฆะ MoveTest(){ Serial.println("###########################"); Serial.println("กำลังเริ่มต้นการทดสอบสัญญาณการเคลื่อนไหว"); Serial.println("##############################"); ล่าช้า (500); รหัส = 1; ตำแหน่ง = 512; ในขณะที่ (id <= SERVOCOUNT) { Serial.print ("การย้าย ID เซอร์โว: "); Serial.println(id);

ในขณะที่ (pos >= 312){ SetPosition(id, pos); โพส = โพส--; ล่าช้า(10); }

ในขณะที่ (pos <= 512) { SetPosition (id, pos); โพส = โพส++; ล่าช้า(10); }

// วนซ้ำไปยัง servo ID id ถัดไป = id++;

} ถ้า (RunCheck == 1){ MenuOptions(); } }

เป็นโมฆะ MenuOptions(){ Serial.println("###########################"); Serial.println("โปรดป้อนตัวเลือก 1-5 เพื่อเรียกใช้การทดสอบแต่ละรายการอีกครั้ง"); Serial.println("1) ตำแหน่งที่ 1"); Serial.println("2) ตำแหน่งที่ 2"); Serial.println("3) ตำแหน่งที่ 3"); Serial.println("4) ตำแหน่งที่ 4"); Serial.println("5) ตำแหน่งหน้าแรก"); Serial.println("6) ตรวจสอบแรงดันของระบบ"); Serial.println("7) ทำการทดสอบ LED"); Serial.println ("8) เซอร์โวผ่อนคลาย"); Serial.println("##############################"); }

เป็นโมฆะ RelaxServos (){ id = 1; Serial.println("##############################"); Serial.println("เซอร์โวผ่อนคลาย"); Serial.println("##############################"); ในขณะที่ (id <= SERVOCOUNT) { ผ่อนคลาย (id); id = (id++)%SERVOCOUNT; ล่าช้า (50); } ถ้า (RunCheck == 1){ MenuOptions(); } }

เป็นโมฆะ LEDTest () {id = 1; Serial.println("##############################"); Serial.println ("การทดสอบ LED กำลังรัน"); Serial.println("##############################"); ในขณะที่ (id <= SERVOCOUNT) { ax12SetRegister (id, 25, 1); Serial.print("LED ON - Servo ID: "); Serial.println(id); ล่าช้า (3000); ax12SetRegister(id, 25, 0); Serial.print("LED OFF - Servo ID: "); Serial.println(id); ล่าช้า (3000); id = id++; } ถ้า (RunCheck == 1){ MenuOptions(); } }

ถือเป็นโมฆะ Grab(){ SetPosition(5, 800); //กำหนดตำแหน่งของข้อต่อ 1 เป็น '0' ดีเลย์(100);//รอให้ข้อต่อเคลื่อนที่

}

เราได้ใช้โปรแกรมของเราตามโปรแกรม PincherTest ของผู้ผลิต โดยมีการปรับแต่งที่สำคัญบางประการในกรณีของการวางตำแหน่ง เราใช้ poses.h เพื่อให้หุ่นยนต์มีตำแหน่งในหน่วยความจำ ประการแรก เราพยายามสร้างแขนเล่นด้วย Pixycam ให้เป็นแบบอัตโนมัติ แต่เนื่องจากปัญหาด้านแสงและหน้าจอขนาดเล็ก สิ่งนั้นไม่อาจเกิดขึ้นได้ หุ่นยนต์มีตำแหน่งเริ่มต้นพื้นฐาน หลังจากอัปโหลดโปรแกรม มันจะทดสอบเซอร์โวทั้งหมดที่พบในหุ่นยนต์ เราได้ตั้งค่าท่าสำหรับปุ่ม 1-4 ไว้เพื่อให้จำง่าย รู้สึกอิสระที่จะใช้โปรแกรม

ขั้นตอนที่ 4: คู่มือวิดีโอ

ขั้นตอนที่ 5: บทสรุป

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

แนะนำ: