สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12
กลุ่มนี้ประกอบด้วยวิศวกรระบบอัตโนมัติ 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
คุณสามารถดูการตั้งค่าบนกระดานได้ที่นี่ ซึ่งง่ายมาก
ด้านซ้ายมือคือพาวเวอร์ซัพพลาย
อันกลางสำหรับเซอร์โวตัวแรกซึ่งต่อมาเชื่อมต่อกับเซอร์โวอื่น ๆ เซอร์โวโดยเซอร์โว
ด้านล่างเป็นที่ที่เราควบคุมบอร์ดจากพีซีหรือแล็ปท็อปที่มีอินพุต 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: บทสรุป
โดยสรุปแล้ว หุ่นยนต์เป็นโปรเจ็กต์เล็กๆ ที่สนุกสนานสำหรับเราและเป็นสิ่งที่น่าสนุกให้ลองเล่นและทดลองด้วย ฉันแนะนำให้คุณลองและปรับแต่งมันเช่นกัน
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง