Thiết Kế Robot Và Lập Trình Sử Dụng Tay PS2 Không Dây - MTE

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

Từ khóa » Thư Viện Ps2