Hướng dẫn lắp ráp Arm 6 bậc sử dụng bộ điều khiển Nunchuck

CÁNH TAY ROBOT ĐIỀU KHIỂN NUNCHUK 

Bước 1: Chi tiết và linh kiện cần thiết

Picture of Tools and Materials
Picture of Tools and Materials Picture of Tools and MaterialsPicture of Tools and Materials
Picture of Tools and Materials
  • 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ự doliê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 Megaliê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

Picture of Assembling the Robotic Arm Pt1 - Base
Picture of Assembling the Robotic Arm Pt1 - Base Picture of Assembling the Robotic Arm Pt1 - Base

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

Picture of Assembling the Robotic Arm Pt2 - Servo #1 Picture of Assembling the Robotic Arm Pt2 - Servo #1 Picture of Assembling the Robotic Arm 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

Picture of Assembling the Robotic Arm Pt3 - Servo #2 Picture of Assembling the Robotic Arm Pt3 - Servo #2
Picture of Assembling the Robotic Arm Pt3 - Servo #2 Picture of Assembling the Robotic Arm Pt3 - Servo #2
Picture of Assembling the Robotic Arm Pt3 - Servo #2 Picture of Assembling the Robotic Arm Pt3 - Servo #2 Picture of Assembling the Robotic Arm 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

Picture of Assembling the Robotic Arm Pt4 - Servo #3 Picture of Assembling the Robotic Arm Pt4 - Servo #3
Picture of Assembling the Robotic Arm Pt4 - Servo #3 Picture of Assembling the Robotic Arm Pt4 - Servo #3
Picture of Assembling the Robotic Arm Pt4 - Servo #3 Picture of Assembling the Robotic Arm 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

Picture of Assembling the Robotic Arm Pt5 - Servo #4
Picture of Assembling the Robotic Arm Pt5 - Servo #4 Picture of Assembling the Robotic Arm 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

Picture of Assembling the Robotic Arm Pt6 - Servo #5
Picture of Assembling the Robotic Arm Pt6 - Servo #5 Picture of Assembling the Robotic Arm 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

Picture of Assembling the Robotic Arm Pt7 - Servo #6
Picture of Assembling the Robotic Arm Pt7 - Servo #6 Picture of Assembling the Robotic Arm 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

Picture of Preparing Nunchuk Controller
Picture of Preparing Nunchuk Controller Picture of Preparing Nunchuk Controller
Picture of Preparing Nunchuk Controller Picture of Preparing Nunchuk Controller

Đố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:

  1. Giá rẻ! 
  2. Dễ tìm! 
  3. 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;
  4. 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

Picture of Wiring Up the Circuits
Picture of Wiring Up the Circuits Picture of Wiring Up the Circuits

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

Picture of Setup Arduino IDE Picture of Setup Arduino IDE

Bây giờ phần cứng đã sẵn sàng, đã đến lúc làm việc trên Arduino.

  1. 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ó.

  1. 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

Picture of Arduino Code Picture of Arduino Code
Picture of Arduino Code Picture of Arduino Code Picture of Arduino Code

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.

Picture of Usage
Picture of Usage Picture of Usage

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.

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Chat hỗ trợ
Chat ngay