CÁNH TAY ROBOT ĐIỀU KHIỂN NUNCHUK
Bước 1: Chi tiết và linh kiện cần thiết
- Cây hàn và dây điện. Tôi phải hàn một số terminal với dây điện để nối nó với Arduino;
- Cánh tay robot 6 bậc tự do( liên kết )
- Nguồn điện 12V (2A trở lên);
- Bộ điều khiển Nunchuk. Nó giao tiếp với board Arduino, và nó được sử dụng để điều khiển cánh tay robot;
- Dây đực (4 dây);
- Arduino Mega( liên kết ). Chú ý rằng bộ cánh tay robot cũng sử dụng bo mạch và bộ điều khiển đi kèm với board Arduino này.
Các linh kiện cần thiết:
- Arduino Mega 2560 R3 ( liên kết)
- NRF24L01 + Module thu phát không dây ( liên kết)
- Cảm biến gia tốc góc MPU6050 ( liên kết)
- Đinh vít 71 x M3X8
- 47 x đai ốc M3
- 2 khung chữ U
- 5 x khung servo
- 4 x servo 20kg ( liên kết)
- 2 servo 9kg ( liên kết)
- 6 khung servo kim loại
- 3 khung chữ U
- 21 khung vuông
- 3 x khung đế
- 1 x kẹp
Bạn có thể tìm thấy bộ cánh tay robot tại ( liên kết ), hoặc thậm chí tự thiết kế các chi tiết. Ví dụ: chi tiết in 3D.
Bước 2: Lắp ráp chi tiết Pt1
Phần đầu tiên được lắp ráp là cơ sở của robot.
Nó được lắp từ hai khung chữ U, nối lại với bốn bu lông và đai ốc M3, như trong hình.
Bước 3: Lắp ráp chi tiết Pt2 – Servo # 1
Động cơ servo đầu tiên được gắn vuông góc đế nhờ khung servo bằng cách sử dụng bốn bu lông M3 và đai ốc cố định khung servo vào đế, như trong hình. Servo # 1 được gắn vào khung servo bằng cách sử dụng bốn bu lông M3 và đai ốc.
Sau đó, gắn vòng đai đi kèm vào trục servo.
Bước 4: Lắp ráp chi tiết Pt3 – Servo # 2
Một khung servo thứ 2 được gắn vuông góc với Pt1. Nó được nối với vòng đai trên servo #1 bằng cách sử dụng bốn bu lông M3. Servo # 2 được lắp vào khung servo bằng bốn bu lông M3 và đai ốc, và cũng lắp vòng đai đi kèm vào servo #2.
Một khung chữ U sau đó được gắn vào vòng đai trên servo #2 bằng bốn bu lông. Lưu ý rằng một bu lông M3 được sử dụng cho trục servo giúp giữ ổn định cho các chi tiết tiếp theo.
Bước 5: Lắp ráp chi tiết Pt4 – Servo # 3
Một khung chữ U khác được gắn bằng bốn bu lông M3 và đai ốc vào Pt3.
Lắp vòng đai vào servo # 3 sau đó cố định chúng vào khung chữ U trên bằng 4 bu lông.
Bước 6: Lắp ráp chi tiết Pt5 – Servo # 4
Một khung chữ U khác được nối tiếp vào phần trên bằng một bộ bốn bu lông M3 và đai ốc. Tương tự như bước trên, servo # 4 đang lắp vào khung chữ U bằng bốn bu lông.
Bước 7: Lắp ráp chi tiết Pt6 – Servo # 5
Servo thứ năm được nối vuông góc với servo # 4 bằng một khung servo bằng bốn bu lông M3 và đai ốc như hình.
Bước 8: Lắp ráp chi tiết Pt7 – Servo # 6
Đây là bước lắp ráp cuối cùng, kẹp được nối với trục servo # 5. Ở trên cùng, servo # 6 được nối bằng một số bu lông, đai ốc và một vòng đai. Lắp các bánh răng trên kẹp khớp với vòng đai của của servo.
Bước 9: Chuẩn bị bộ điều khiển Nunchuk
Đối với dự án này, tôi quyết định sử dụng bộ điều khiển Nintendo Nunchuk vì một số lý do:
- Giá rẻ!
- Dễ tìm!
- Nó có rất nhiều cảm biến! Mỗi bộ điều khiển có hai nút (nút Z và C), cần điều khiển hai trục (X và Y) và gia tốc kế ba trục;
- Nó có một thư viện Arduino. https://www.xarg.org/2016/12/using-a-wii-nunchuk-with-arduino/
Đầu tiên cắt đầu nối của cần điều khiển và tháo lớp cách điện của dây. Dựa vào màu dây, chúng ta có tên mỗi dây (Vcc, GND, SCL và SDA) như trên sơ đồ dây được hiển thị trong hình. Màu dây có thể thay đổi không giống trên hình bạn có thể tham khảo bên dưới:
Trên hình:
- SDA = xanh lục
- SCL = vàng
- 3V3 = màu đỏ
- GND = trắng
Bản số 1:
- SDA = vàng
- SCL = trắng
- 3V3 = xanh lục
- GND = màu đỏ
Bản số 2:
- SDA = màu lam
- SCL = trắng
- 3V3 = màu hồng
- GND = xanh lá cây
Hàn các dây này với dây đực để kết nối dễ dàng hơn với board Arduino.
Bước 10: Nối mạch hoàn chỉnh
Tôi sử dụng board điều khiển đi kèm với bộ cánh tay robot. Nó giúp kết nối của các linh kiện dễ dàng hơn, vì nó gồm các đầu nối cụ thể cho các động cơ servo, nguồn điện, vv
Kết nối các linh kiện như sau:
Nunchuk:
- Nunchuk chân 6 (SCL) => Arduino Mega chân 21 (SCL)
- Nunchuk chân 1 (SDA) => Arduino Mega chân 20 (SDA)
- Nunchuk chân 3 (VCC) => Ardino Mega chân 3V3
- Nunchuk chân 4 (Gnd) => Arduino Mega chân Gnd
Nếu bạn đang sử dụng Arduino Uno, chân SCL và SDA của Nunchuk sẽ được nối với các chân Arduino như sau:
- Nunchuk chân 6 (SCL) => Arduino Uno Chân A5
- Nunchuk chân 1 (SDA) => Arduino Uno Chân A4
- Nunchuk chân 3 (Vcc) => Ardino Uno Chân 3.3V
- Nunchuk chân 4 (Gnd) => Arduino Uno Chân Gnd
Servos:
- Control shield terminal 11 => Servo #1
- Control shield terminal 12 => Servo #2
- Control shield terminal 13 => Servo #3
- Control shield terminal 8 => Servo #4
- Control shield terminal 9 => Servo #5
- Control shield terminal 10 => Servo #6
Nếu bạn không sử dụng shield điều khiển, bạn nên sử dụng chân sau:
- Arduino Chân 11 => Servo # 1 (Sgn)
- Arduino Chân 12 => Servo # 2 (Sgn)
- Arduino Chân 13 => Servo # 3 (Sgn)
- Arduino Chân 8 => Servo # 4 (Sgn)
- Arduino Chân 9 => Servo # 5 (Sgn)
- Arduino Chân 10 => Servo # 6 (Sgn)
- Arduino Gnd => Servos Gnd
- Nguồn điện 6V => Servos Vcc
Bạn cần nối nguồn điện 12V, 2A cho sản phẩm hoạt động. Các servo tiêu thụ rất nhiều điện, nếu cung cấp điện không đủ mạnh, các servo sẽ bị rung, rất nóng và hoạt động không đúng hiệu suất.
Bước 11: Thiết lập Arduino IDE
Bây giờ phần cứng đã sẵn sàng, đã đến lúc làm việc trên Arduino.
- Tải xuống và cài đặt phiên bản mới nhất Arduino IDE
Bạn có thể tìm phiên bản mới nhất cho Windows, Linux hoặc MAC OSX trên trang web của Arduino: https://www.arduino.cc/en/main/software
Tải xuống miễn phí, cài đặt nó trên máy tính của bạn và khởi động nó.
- Thêm các thư viện
Đối với dự án này, tôi đã sử dụng thư viện Nunchuk Arduino của Robert Eisele. Tải xuống thư viện tại https://github.com/infusion/Fritzing/tree/master/Wii-Nunchuk
Trỏ chuột đến Sketch-> Include Library -> Manage Libraries … trên Arduino IDE của bạn để thêm thư viện.
Thư viện hoạt động như thế nào?
Thư viện Nunchuk đi kèm với một bộ chức năng để đọc cảm biến của bộ điều khiển:
- nunchuk_buttonZ (): trả về 1 nếu nút Z được nhấn, hoặc 0 nếu nó không được nhấn;
- nunchuk_buttonC (): trả về 1 nếu nhấn nút C, hoặc 0 nếu ngược lại;
- nunchuk_joystickX (): trả về giá trị x của cần điều khiển (giữa -127 và 127);
- nunchuk_joystickY (): trả về giá trị y của cần điều khiển (giữa -127 và 127);
- nunchuk_pitch (): trả về góc của bộ điều khiển theo radian (từ -180º đến 180º);
- nunchuk_roll (): trả về góc xoay của bộ điều khiển theo radian (từ -180º đến 180º).
Các góc được trả về bằng radian. Tôi đã chuyển đổi những giá trị này thành độ trong code Arduino.
Bước 12: Code Arduino
Tải xuống tệp sketch của Arduino.
Cắm cáp USB vào cổng USB của máy tính và tải code lên. Sau khi quá trình tải lên hoàn tất, rút cáp USB, kết nối nguồn điện và bật nút nguồn. Code sẽ bắt đầu hoạt động.
Cảnh báo: khi code bắt đầu chạy, cánh tay robot sẽ di chuyển rất nhanh đến vị trí đầu bạn đặt cho nó. Hãy cẩn thận để không bị thương hoặc làm hỏng thiết bị lân cận trong khi khởi động!
Bạn có thể sẽ phải thay đổi góc đầu của mỗi động cơ servo tùy thuộc vào cách các servo của bạn được lắp ráp.
Giải thích code:
Trước khi thiết lập, nhập các thư viện được cho sketch ( nunchuk.h, wire.h và servo.h ).
Các chân được sử dụng được xác định và các biến được khai báo. Các biến số nguyên # lưu trữ vị trí góc ban đầu cho mỗi servo. Nếu bạn muốn robot của bạn bắt đầu ở vị trí khác, hãy thay đổi giá trị trên các biến đó.
servo # _speed variables xác định tốc độ di chuyển của mỗi servo. Nếu bạn muốn một servo cụ thể di chuyển nhanh hơn, hãy tăng giá trị của nó. Các biến số min # và max # được sử dụng để giới hạn góc tối đa và tối thiểu cho mỗi servo. Bạn có thể thiết lập các biến đó để tránh các xung đột giữa các khớp liên tiếp của robot.
//Include libraries #include <nunchuk.h> #include <wire.h> #include <servo.h> //define variables #define SERV1 8 //servo 1 on digital port 8 #define SERV2 9 //servo 2 on digital port 9 #define SERV3 10 //servo 3 on digital port 10 #define SERV4 11 //servo 4 on digital port 11 #define SERV5 12 //servo 5 on digital port 12 #define SERV6 13 //servo 6 on digital port 13 Servo s1; //servo 1 Servo s2; //servo 2 Servo s3; //servo 3 Servo s4; //servo 4 Servo s5; //servo 5 Servo s6; //servo 6 //define starting angle for each servo //choose a safe position to start from //it will try to move instantaniously to that position when powered up! //those angles will depend on the angle of each servo during the assemble int angle1 = 90; //servo 1 current angle int angle2 = 30; //servo 2 current angle int angle3 = 0; //servo 3 current angle int angle4 = 90; //servo 4 current angle int angle5 = 90; //servo 5 current angle int angle6 = 45; //servo 6 current angle int servo1_speed = 3; //servo 1 speed int servo2_speed = 3; //servo 2 speed int servo3_speed = 3; //servo 3 speed int servo4_speed = 1; //servo 4 speed int servo5_speed = 1; //servo 5 speed //define restrictions for each servo //those angles will depend on the angle of each servo during the assemble int angle1min = 0; //servo 1 minimum angle int angle1max = 180; //servo 1 maximum angle int angle2min = 0; //servo 2 minimum angle int angle2max = 180; //servo 2 maximum angle int angle3min = 0; //servo 3 minimum angle int angle3max = 180; //servo 3 maximum angle int angle4min = 0; //servo 4 minimum angle int angle4max = 180; //servo 4 maximum angle int angle5min = 0; //servo 5 minimum angle int angle5max = 180; //servo 5 maximum angle int angle6min = 0; //servo 6 minimum angle int angle6max = 180; //servo 6 maximum angle boolean display_angles = true; //boolean used to update the angle of each servo on Serial Monitor
Trong quá trình cài đặt, mỗi servo được gắn vào một chân đặc biệt và vị trí của nó được bắt đầu.
Giao tiếp nối tiếp (đến serial monitor) và giao tiếp I2C với Nunchuk cũng được bắt đầu ở đây.
//SETUP void setup() { //attach each servo to a pin and start its position s1.attach(SERV1); s1.write(angle1); s2.attach(SERV2); s2.write(angle2); s3.attach(SERV3); s3.write(angle3); s4.attach(SERV4); s4.write(angle4); s5.attach(SERV5); s5.write(angle5); s6.attach(SERV6); s6.write(angle6); //start serial communication Serial.begin(9600); //start Nunchuk Wire.begin(); nunchuk_init(); }
Vòng lặp chính được lặp đi lặp lại nhiều lần. Trạng thái Nunchuk được đọc ở mỗi chu kỳ. Tùy thuộc vào các lần đọc, các lệnh khác nhau được thực hiện.
void loop() { //read Nunchuk sensors if (nunchuk_read()) { int x = nunchuk_joystickX(); //joystick X position int y = nunchuk_joystickY(); //joystick Y position boolean z = nunchuk_buttonZ(); //z button status boolean c = nunchuk_buttonC(); //c button status float pitch = nunchuk_pitch(); //pitch angle float roll = nunchuk_roll(); //roll angle
Phím điều khiển X sẽ được sử dụng để di chuyển servo # 1.
Đầu tiên nó sẽ kiểm tra xem giá trị của cần điều khiển có đủ lớn không. Bằng cách này. Nếu giá trị đáp ứng các yêu cầu, góc của servo sẽ được tăng / giảm ở một tốc độ nhất định.
//Turn left/right (at a fixed speed) //Turn left if (x > 90) { angle1 -= servo1_speed; display_angles = true; if (angle1 < angle1min) { angle1 = angle1min; } } //Turn right if (x < -90) { angle1 += servo1_speed; display_angles = true; if (angle1 > angle1max) { angle1 = angle1max; } } s1.write(angle1); //update servo position
Tương tự được sử dụng cho phím điều khiển y. Nó được sử dụng để thay đổi góc của servo # 3. Servo # 2 được giữ cố định trong code này.
Trục xoay kẹp hoạt động bằng cách xoay bộ điều khiển, được đo bằng gia tốc kế của nó. Để điều khiển cánh tay dễ dàng hơn, góc của kẹp chỉ hoạt động khi nhấn nút C hoặc Z.
Khi chỉ nhấn nút C, code đọc góc xoay và sử dụng nó làm điểm đặt. servo # 5 được xoay cho đến khi đạt đến điểm tối đa. Code tương tự được sử dụng cho servo # 4.
// Enable accelerometer only when the buttons are pressed // Rotate gripper (only Z button pressed) if (c && !z) { roll = roll * 57.0 + 90.0; //convert do degrees servo5_speed = abs(angle5 - roll)/10 + 1; //speed proportional do the error between actual and desired angle if (roll > angle5) { angle5 += servo5_speed; display_angles = true; } if (roll < angle5) { angle5 -=servo5_speed; display_angles = true; } s5.write(angle5); //update servo position }
Kẹp đóng khi nào cả hai nút C và Z được nhấn. Khi bất kỳ nút nào được nhả ra, kẹp sẽ mở ra.
//Open/close gripper (both buttons pressed) if(z && c) { s6.write(90); //close gripper display_angles = true; } else { s6.write(45); //open gripper }
Có một đoạn code ở cuối sketch. Nó sẽ hiển thị trên serial monitor góc thực của mỗi động cơ servo. Nó có thể hữu ích cho việc lựa chọn góc đầu của mỗi động cơ.
Toàn bộ sketch: Nunchuk.into
Bước 13: Sử dụng
Các video dưới đây hướng dẫn cách sử dụng cần điều khiển để điều khiển cánh tay robot 6 bậc tự do chúng ta vừa lắp ráp hoàn chỉnh.
Bạn có thể sửa code để có các chuyển động khác nhau dựa trên sự kết hợp giữa các nút và góc của cần điều khiển.