Mục lục:

Cánh tay rô bốt chơi đàn piano: 5 bước
Cánh tay rô bốt chơi đàn piano: 5 bước

Video: Cánh tay rô bốt chơi đàn piano: 5 bước

Video: Cánh tay rô bốt chơi đàn piano: 5 bước
Video: cách đánh đàn piano bài /see tình/ 2024, Tháng bảy
Anonim
Cánh tay robot chơi đàn piano
Cánh tay robot chơi đàn piano

Nhóm bao gồm 2 Kỹ sư Tự động hóa từ UCN, những người đã đưa ra một ý tưởng tuyệt vời mà chúng tôi có động lực để thực hiện và phát triển. Ý tưởng dựa trên một bảng Arduino điều khiển một cánh tay robot. Bảng Arduino là bộ não của hoạt động và sau đó là cơ quan truyền động của hoạt động, cánh tay Robotic, sẽ làm những gì nó cần. Phần giải thích sâu hơn sẽ đến sau.

Bước 1: Thiết bị

Trang thiết bị
Trang thiết bị

Cánh tay robot:

Bộ cánh tay robot Phantomx Pincher Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Phần mềm cho robot- https://www.arduino.cc/en/Main/OldSoftwareRelease… Camera phát hiện màu:

Máy ảnh CMUcam5 Pixy - (https://charmedlabs.com/default/pixy-cmucam5/)

Phần mềm - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Bước 2: Thiết lập Arduino

Thiết lập Arduino
Thiết lập Arduino

Bạn có thể xem thiết lập trên bảng ở đây, rất dễ dàng.

Bên trái là Nguồn điện.

Cái ở giữa dành cho servo đầu tiên, sau này được kết nối với các servo khác, servo bằng servo.

Phần dưới cùng là nơi chúng tôi điều khiển bo mạch từ PC hoặc Máy tính xách tay, có đầu vào USB ở đầu kia.

Bước 3: Chương trình cuối cùng

||| CHƯƠNG TRÌNH |||

#bao gồm

#include #include "pose.h" #include // Thư viện Pixy #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; boolean IDCheck; boolean RunCheck;

void setup () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // đặt thanh ghi số 1 32 thành tốc độ 50. ax12SetRegister2 (2, 32, 50); // đặt thanh ghi số 2 32 thành tốc độ 50. ax12SetRegister2 (3, 32, 50); // thiết lập thanh ghi số 3 32 thành tốc độ 50. ax12SetRegister2 (4, 32, 50); // thiết lập thanh ghi số 4 32 thành tốc độ 50. ax12SetRegister2 (5, 32, 100); // thiết lập thanh ghi số 5 32 đến tốc độ 100. // khởi tạo các biến id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // mở cổng nối tiếp Serial.begin (9600); chậm trễ (500); Serial.println ("#############################"); Serial.println ("Giao tiếp nối tiếp được thiết lập.");

// Kiểm tra điện áp pin Lipo CheckVoltage ();

// Quét Servos, trả về vị trí MoveTest (); Chuyển nhà(); Tùy chọn menu(); RunCheck = 1; }

void loop () {// đọc cảm biến: int inByte = Serial.read ();

chuyển đổi (inByte) {

case '1': MovePose1 (); nghỉ;

case '2': MovePose2 (); nghỉ; case '3': MovePose3 (); nghỉ;

case '4': MovePose4 (); nghỉ;

case '5': MoveHome (); nghỉ; case '6': Grab (); nghỉ;

case '7': LEDTest (); nghỉ;

case '8': RelaxServos (); nghỉ; }}

void CheckVoltage () {// đợi, sau đó kiểm tra điện áp (an toàn LiPO) floattage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("#############################"); Serial.print ("Điện áp Hệ thống:"); Serial.print (điện áp); Serial.println ("vôn."); if (điện áp 10.0) {Serial.println ("Mức điện áp danh định."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("#############################"); }

void MoveHome () {delay (100); // khuyến nghị tạm dừng bioloid.loadPose (Trang chủ); // tải tư thế từ FLASH, vào bộ đệm nextPose bioloid.readPose (); // đọc ở các vị trí servo hiện tại vào bộ đệm curPose Serial.println ("############################"); Serial.println ("Di chuyển servos đến vị trí Trang chủ"); Serial.println ("#############################"); chậm trễ (1000); bioloid.interpolateSetup (1000); // thiết lập nội suy từ hiện tại-> tiếp theo hơn 1/2 giây trong khi (bioloid.interpolating> 0) {// thực hiện điều này khi chúng ta chưa đạt đến tư thế mới bioloid.interpolateStep (); // di chuyển servos, nếu cần. chậm trễ (3); } if (RunCheck == 1) {MenuOptions (); }}

void MovePose1 () {delay (100); // khuyến nghị tạm dừng bioloid.loadPose (Pose1); // tải tư thế từ FLASH, vào bộ đệm nextPose bioloid.readPose (); // đọc ở các vị trí servo hiện tại tới bộ đệm curPose Serial.println ("############################"); Serial.println ("Di chuyển servos lên vị trí đầu tiên"); Serial.println ("#############################"); chậm trễ (1000); bioloid.interpolateSetup (1000); // thiết lập nội suy từ hiện tại-> tiếp theo hơn 1/2 giây trong khi (bioloid.interpolating> 0) {// thực hiện điều này khi chúng ta chưa đạt đến tư thế mới bioloid.interpolateStep (); // di chuyển servos, nếu cần. chậm trễ (3); } SetPosition (3, 291); // đặt vị trí của khớp 3 thành '0' delay (100); // đợi khớp di chuyển if (RunCheck == 1) {MenuOptions (); }}

void MovePose2 () {delay (100); // khuyến nghị tạm dừng bioloid.loadPose (Pose2); // tải tư thế từ FLASH, vào bộ đệm nextPose bioloid.readPose (); // đọc ở các vị trí servo hiện tại tới bộ đệm curPose Serial.println ("############################"); Serial.println ("Di chuyển servos lên vị trí thứ 2"); Serial.println ("#############################"); chậm trễ (1000); bioloid.interpolateSetup (1000); // thiết lập nội suy từ hiện tại-> tiếp theo hơn 1/2 giây trong khi (bioloid.interpolating> 0) {// thực hiện điều này khi chúng ta chưa đạt đến tư thế mới bioloid.interpolateStep (); // di chuyển servos, nếu cần. chậm trễ (3); } SetPosition (3, 291); // đặt vị trí của khớp 3 thành '0' delay (100); // đợi khớp di chuyển if (RunCheck == 1) {MenuOptions (); }} void MovePose3 () {delay (100); // khuyến nghị tạm dừng bioloid.loadPose (Pose3); // tải tư thế từ FLASH, vào bộ đệm nextPose bioloid.readPose (); // đọc ở các vị trí servo hiện tại tới bộ đệm curPose Serial.println ("############################"); Serial.println ("Di chuyển servos lên vị trí thứ 3"); Serial.println ("#############################"); chậm trễ (1000); bioloid.interpolateSetup (1000); // thiết lập nội suy từ hiện tại-> tiếp theo hơn 1/2 giây trong khi (bioloid.interpolating> 0) {// thực hiện việc này khi chúng ta chưa đạt đến tư thế mới bioloid.interpolateStep (); // di chuyển servos, nếu cần. chậm trễ (3); } SetPosition (3, 291); // đặt vị trí của khớp 3 thành '0' delay (100); // đợi khớp di chuyển if (RunCheck == 1) {MenuOptions (); }}

void MovePose4 () {delay (100); // khuyến nghị tạm dừng bioloid.loadPose (Pose4); // tải tư thế từ FLASH, vào bộ đệm nextPose bioloid.readPose (); // đọc ở các vị trí servo hiện tại tới bộ đệm curPose Serial.println ("############################"); Serial.println ("Di chuyển servos lên vị trí thứ 4"); Serial.println ("#############################"); chậm trễ (1000); bioloid.interpolateSetup (1000); // thiết lập nội suy từ hiện tại-> tiếp theo hơn 1/2 giây trong khi (bioloid.interpolating> 0) {// thực hiện điều này khi chúng ta chưa đạt đến tư thế mới bioloid.interpolateStep (); // di chuyển servos, nếu cần. chậm trễ (3); } SetPosition (3, 291); // đặt vị trí của khớp 3 thành '0' delay (100); // đợi khớp di chuyển if (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("#############################"); Serial.println ("Khởi tạo Kiểm tra Dấu hiệu Chuyển động"); Serial.println ("#############################"); chậm trễ (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Đang di chuyển ID Servo:"); Serial.println (id);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; chậm trễ (10); }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; chậm trễ (10); }

// lặp tới ID servo tiếp theo id = id ++;

} if (RunCheck == 1) {MenuOptions (); }}

void MenuOptions () {Serial.println ("#############################"); Serial.println ("Vui lòng nhập tùy chọn 1-5 để chạy lại các bài kiểm tra riêng lẻ."); Serial.println ("1) Vị trí thứ nhất"); Serial.println ("2) Vị trí thứ 2"); Serial.println ("3) Vị trí thứ 3"); Serial.println ("4) Vị trí thứ 4"); Serial.println ("5) Vị trí Nhà"); Serial.println ("6) Kiểm tra điện áp hệ thống"); Serial.println ("7) Thực hiện Kiểm tra LED"); Serial.println ("8) Thư giãn Servos"); Serial.println ("#############################"); }

void RelaxServos () {id = 1; Serial.println ("#############################"); Serial.println ("Các Servos thư giãn."); Serial.println ("#############################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)% SERVOCOUNT; chậm trễ (50); } if (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("#############################"); Serial.println ("Chạy thử nghiệm LED"); Serial.println ("#############################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - Servo ID:"); Serial.println (id); chậm trễ (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED TẮT - ID Servo:"); Serial.println (id); chậm trễ (3000); id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // đặt vị trí của khớp 1 thành '0' delay (100); // đợi khớp di chuyển

}

Chúng tôi đã dựa trên chương trình của mình dựa trên chương trình PincherTest của nhà sản xuất với một số điều chỉnh lớn trong trường hợp định vị. Chúng tôi đã sử dụng các tư thế.h để robot có các vị trí trong bộ nhớ. Đầu tiên, chúng tôi đã cố gắng tạo cánh tay chơi của mình với Pixycam thành tự động, nhưng do các vấn đề về ánh sáng và màn hình nhỏ, điều đó không thể xảy ra. Robot có một vị trí nhà cơ bản, sau khi tải lên chương trình, nó sẽ kiểm tra tất cả các Servos được tìm thấy trong robot. Chúng tôi đã thiết lập các tư thế cho các nút 1-4, vì vậy sẽ rất dễ nhớ. Hãy thoải mái sử dụng chương trình.

Bước 4: Hướng dẫn bằng video

Bước 5: Kết luận

Tóm lại, robot là một dự án nhỏ thú vị đối với chúng tôi và là một niềm vui thú vị để chơi xung quanh và thử nghiệm. Tôi khuyến khích bạn thử và tùy chỉnh nó.

Đề xuất: