Lập trình robot #1 : thiết kế robot và lập trình sử dụng tay ps2 không dây

Đào Hùng 09/04/2021
lap-trinh-robot-1-thiet-ke-robot-va-lap-trinh-su-dung-tay-ps2-khong-day

     Từ nhỏ, có lẽ chúng ta đều rất thích những đồ điện tử, nhất là chiếc xe điều khiển từ xa . Việc Sử dụng tay PS2 để chơi game đua xe trên các máy playstation chắc cũng là niềm đam mê của nhiều người . Vậy tại sao chúng ta không kết hợp chúng tại và tự tay tạo ra 1 chiếc xe điều khiển từ xa bằng tay PS2 không dây nhỉ  . Ngày hôm nay chúng ta cùng nhau tạo nên một chiếc xe điều khiển từ xa theo ý của mình nhé.

Thiết kế và lắp ráp robot

Video hướng dẫn thiết kế và lắp ghép robot

https://youtu.be/nRdVDmc3aIU

Các bạn có thể tải bản thiết kế tại đây :

File solid dành cho ai muốn chỉnh sửa thông số xe, logo …: file solid

File Gcode, cho vào máy in 3D là ra sản phẩm  : file in3D

File cắt mica : Cắt mica

Lập trình robot #1 : Thiết kế robot và lập trình sử dụng tay PS2 không dây

Thành quả sau khi lắp ráp

Lập trình robot #1 : Thiết kế robot và lập trình sử dụng tay PS2 không dây Lập trình robot #1 : Thiết kế robot và lập trình sử dụng tay PS2 không dây

Lắp ráp khung cho robot đã xong, chúng ta cùng bắt tay vào hoàn thiện và đi dây cho robot thôi nào

Chuẩn Bị

Phần cứng
Arduino Uno x1
Arduino motor shield L298 x1
PS2 Wireless Controller x1

Giới thiệu module Arduino motor shield L298

Lập trình robot #1 : Thiết kế robot và lập trình sử dụng tay PS2 không dây

Thông số kĩ thuật

Điện áp của tín hiệu điều khiển : 5V
Điện áp hoạt động : 6.5 -12V
Iss : ≤ 36mA
Dòng tối đa cho mỗi cầu H : ≤ 2A
Công suất tối đa : 25W (T= 75°C)
Nhiệt độ hoạt động : -25°C ~ +130°C

Kết nối chân của module Arduino motor shield với Arduino Uno

Tên kênh Chức năng Pin
Kênh A Enable 10
Direction 12
Kênh B Enable 11
Direction 13
Buzzer    4

Module này rất tiện lơi, nó có thể cắm trực tiếp được lên Arduino Uno hoặc Arduino Mega … Giờ chỉ cần lắp 2 động cơ và đúng header của mạch và lập trình thôi, Thật dễ dàng phải không các bạn.

Ngoài ra module motor shield còn tích hợp thêm còi báo, tích hợp jum cắm servo, blutooth… Khi nào dùng tới các chân đó mình sẽ hướng dẫn kĩ hơn nha.  À, robot này còn có chức năng dò line nữa, Trong bài hướng dẫn này bọn mình sẽ sử dụng module dò line do lamchucongnghe.com phát triển. Nếu chưa có module này các bạn có thể sử dụng các module dò line số tương tự trên thị trường nhé ( module này bên mình có thêm chức năng lấy mẫu sân và chống nhiễu nên dùng khá ok đó  )

Tay PS2 wireless controller

Lập trình robot #1 : Thiết kế robot và lập trình sử dụng tay PS2 không dây

Thông số kĩ thuật

Nền tảng làm việc : For PS2
Loại kết nối : 2.4G Wireless
Khoảng cách hoạt động : < 8m
Nhiệt độ hoạt động : -20~65°C
Độ ẩm hoạt động : 20%-80%

Các bạn đi dây theo sơ đồ này nhé

Lập trình robot #1 : Thiết kế robot và lập trình sử dụng tay PS2 không dây

Thư viện dùng cho tay PS2 : Tải tại đây

Code test tay Ps2

//***************************************************************//
//  Author       : RedFox                                        //
//  Website      : lamchucongnghe.com                            //
//  Fanpage      : fb.com//lamchucongnghevn                      //
//  Shop sendo   : sendo.vn/shop/lamchucongnghe_com              //
//  Shop shopee  : shopee.vn/lamchucongnghe                      //
//***************************************************************//
 
#include <PS2X_lib.h>
 
#define PS2_DAT     6       // Data Pin
#define PS2_CMD     7       // Command Pin
#define PS2_CS      8       // Attention Pin
#define PS2_CLK     9       // Clock Pin
 
PS2X ps2;                   // create PS2 Controller Class
 
void setup() {
  Serial.begin(9600);
  delay(300);
  // setup pins and settings: GamePad(clock, command, attention, data) check for error
  int ps2Config = ps2.config_gamepad(PS2_CLK, PS2_CMD, PS2_CS, PS2_DAT);
}
 
void loop() {
  ps2.read_gamepad();
  if(ps2.ButtonPressed(PSB_PAD_UP))
    Serial.println("Press UP");
  if(ps2.ButtonPressed(PSB_PAD_DOWN))
    Serial.println("Press DOWN");
  if(ps2.ButtonPressed(PSB_PAD_LEFT))
    Serial.println("Press LEFT");
  if(ps2.ButtonPressed(PSB_PAD_RIGHT))
    Serial.println("Press RIGHT");
  if(ps2.ButtonPressed(PSB_TRIANGLE))
    Serial.println("Press Y");
  if(ps2.ButtonPressed(PSB_CIRCLE))
    Serial.println("Press B");
  if(ps2.ButtonPressed(PSB_CROSS))
    Serial.println("Press A");
  if(ps2.ButtonPressed(PSB_SQUARE))
    Serial.println("Press X");
  if(ps2.ButtonPressed(PSB_L1))
    Serial.println("Press L1");
  if(ps2.ButtonPressed(PSB_L2))
    Serial.println("Press L2");
  if(ps2.ButtonPressed(PSB_L3))
    Serial.println("Press L3");
  if(ps2.ButtonPressed(PSB_R1))
    Serial.println("Press R1");
  if(ps2.ButtonPressed(PSB_R2))
    Serial.println("Press R2");
  if(ps2.ButtonPressed(PSB_R3))
    Serial.println("Press R3");
  if(ps2.Button(PSB_L1) || ps2.Button(PSB_R1)) { //print stick values if either is TRUE
    Serial.print("Stick Values:");
    Serial.print(ps2.Analog(PSS_LY), DEC); //Left stick, Y axis. Other options: LX, RY, RX  
    Serial.print(",");
    Serial.print(ps2.Analog(PSS_LX), DEC); 
    Serial.print(",");
    Serial.print(ps2.Analog(PSS_RY), DEC);
    Serial.print(",");
    Serial.println(ps2.Analog(PSS_RX), DEC); 
  }     
  delay(50);
}

Code sử dụng tay PS2 điều khiển robot

//***************************************************************//
//  Author       : RedFox                                        //
//  Website      : lamchucongnghe.com                            //
//  Fanpage      : fb.com//lamchucongnghevn                      //
//  Shop sendo   : sendo.vn/shop/lamchucongnghe_com              //
//  Shop shopee  : shopee.vn/lamchucongnghe                      //
//***************************************************************//
 
#include <PS2X_lib.h>
 
#define PS2_DAT       6       // Data Pin
#define PS2_CMD       7       // Command Pin
#define PS2_CS        8       // Attention Pin
#define PS2_CLK       9       // Clock Pin
#define dongCoTrai    13      // Đảo chiều động cơ trái ( 0: chạy thuận, 1: chạy ngược)
#define dongCoPhai    12      // Đảo chiều động cơ phải ( 1: chạy thuận, 0: chạy ngược)
#define bamXungTrai   11      // Băm xung điều chỉnh tốc độ động cơ trái
#define bamXungPhai   10      // Băm xung điều chỉnh tốc độ động cơ phải
#define Buzzer        4       // Chân còi chip
PS2X ps2;                     // create PS2 Controller Class
 
bool analog;
void setup() {
  Serial.begin(9600);
  // Khởi tạo còi chip, động cơ trái, động cơ phải là đầu ra
  pinMode(Buzzer, OUTPUT);
  digitalWrite(Buzzer, LOW); 
  pinMode(dongCoTrai, OUTPUT);
  pinMode(dongCoPhai, OUTPUT);
  // Khởi tạo kết nối tay PS2
  ps2.config_gamepad(PS2_CLK, PS2_CMD, PS2_CS, PS2_DAT);
}
 
void loop() {
  // Bắt đầu đọc dữ liệu nhấn nút từ tay PS2
  ps2.read_gamepad();
  delay(50);
  if(ps2.ButtonPressed(PSB_R1)) {         // chuyển chế độ điều khiển dùng joystick
    //Serial.println("Analog");
    analog = 1 - analog;
  }
  
  if(analog) {
    int analogLX = ps2.Analog(PSS_LX)-128;
    int analogLY = ps2.Analog(PSS_LY)-127;
    
    if(analogLY < 0 && analogLX == 0) {             
      dkDongCo(180, 180);
    }
    // Lùi
    else if(analogLY > 0 && analogLX == 0) {             
      dkDongCo(-120, -120);
    }
    // Quay trái
    else if(analogLY == 0 && analogLX < 0) {             
      dkDongCo(0, 180);
    }
    // Quay phải
    else if(analogLY == 0 && analogLX > 0) {             
      dkDongCo(180, 0);
    }
    // Cua trái
    else if(analogLY < 0 && analogLX < 0) {             
      dkDongCo(40, 150);
    }
    // Cua phải
    else if(analogLY > 0 && analogLX < 0) {            
      dkDongCo(150, 40);
    }
    // Lùi phải
    else if(analogLY > 0 && analogLX > 0) {            
      dkDongCo(-120, -40);
    }
    // Lùi trái
    else if(analogLY < 0 && analogLX > 1) {            
      dkDongCo(-40, -120);
    }
    // Dừng khi nhả các nút
    else if(analogLY == 0 && analogLX == 0) {
      dkDongCo(0, 0);
    }
  }
  else {
    int buttonUp = ps2.Button(PSB_PAD_UP);
    int buttonDown = ps2.Button(PSB_PAD_DOWN);
    int buttonLeft = ps2.Button(PSB_PAD_LEFT);
    int buttonRight = ps2.Button(PSB_PAD_RIGHT);
    if(buttonUp && !buttonDown && !buttonLeft && !buttonRight) {             
      dkDongCo(180, 180);
    }
    // Lùi
    else if(!buttonUp && buttonDown && !buttonLeft && !buttonRight) {             
      dkDongCo(-120, -120);
    }
    // Quay trái
    else if(!buttonUp && !buttonDown && buttonLeft && !buttonRight) {             
      dkDongCo(0, 180);
    }
    // Quay phải
    else if(!buttonUp && !buttonDown && !buttonLeft && buttonRight) {             
      dkDongCo(180, 0);
    }
    // Cua trái
    else if(buttonUp && !buttonDown && buttonLeft && !buttonRight) {             
      dkDongCo(40, 150);
    }
    // Cua phải
    else if(buttonUp && !buttonDown && !buttonLeft && buttonRight) {            
      dkDongCo(150, 40);
    }
    // Lùi phải
    else if(!buttonUp && buttonDown && !buttonLeft && buttonRight) {            
      dkDongCo(-120, -40);
    }
    // Lùi trái
    else if(!buttonUp && buttonDown && buttonLeft && !buttonRight) {            
      dkDongCo(-40, -120);
    }
    // Dừng khi nhả các nút
    else if(!buttonUp && !buttonDown && !buttonLeft && !buttonRight) {
      dkDongCo(0, 0);
    }
  }
}
 
void dkDongCo(float xungTrai, float xungPhai) {
  if(xungTrai >=0 )
    digitalWrite(dongCoTrai, HIGH);
  else
    digitalWrite(dongCoTrai, LOW);
  if(xungPhai >=0 )
    digitalWrite(dongCoPhai, HIGH);
  else
    digitalWrite(dongCoPhai, LOW);
  analogWrite(bamXungTrai, abs(xungTrai));
  analogWrite(bamXungPhai, abs(xungPhai));
}

Video hướng dẫn tổng thể

https://youtu.be/Zs7i9OgupJc

Video demo những pha bốc đầu thần thánh

https://www.youtube.com/watch?v=XOkllaC4Ods

Bình luận
Nội dung này chưa có bình luận, hãy gửi cho chúng tôi bình luận đầu tiên của bạn.
VIẾT BÌNH LUẬN