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
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
Thành quả sau khi lắp ráp
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
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
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é
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