monsieurvechai gửi vào
- 111962 lượt xem
Pro Micro là 1 Board Arduino độc đáo với chức năng HID (Human Interface Device) có thể giả lập chuột và bàn phím. Bài này tui sẽ hướng dẫn các bạn làm 1 con chuột độc đáo với Pro Micro và Joystick.
Nguyên lý

Joystick thực ra là 2 cái potentiometer hoạt động độc lập, và ta chỉ cần đọc giá trị thay đổi của chúng rồi dùng thư viện Mouse.h của Arduino để di chuyển chuột tùy theo cái joystick đi nhiều hay ít. Ngoài ra joystick này còn có 1 nút bấm. Ta mặc định đây là nút Left Click của chuột. Đơn giản quá phải hem? 
Phần cứng
Joystick có 5 chân. Các bạn nối vời Pro Micro theo bảng sau:
| Joystick | Pro Micro |
| 5V | 5V |
| GD | GD |
| Rx | A1 |
| Ry | A0 |
| SW | 9 |
Phần mềm
/* HID Joystick Mouse Example */
//Taken from https://www.sparkfun.com/tutorials/3...
#include <Mouse.h>
int horzPin = A0; // Chân nối vô biến trở ngang
int vertPin = A1; // Chân nối vô biến trở dọc
int selPin = 9; // chân nối vô nút nhấn trên joystick
int vertZero, horzZero; //lưu giá trị khởi tạo lúc ban đầu joystick chưa bị xê dịch (thường là 512 - đồ mới, khác 512 đồ cũ)
int vertValue, horzValue; // lưu giá trị analog hiện thời của mỗi biến trở
const int sensitivity = 100; // Tốc độ chuột, càng lớn càng chậm. Nên để bé hơn 500ms
int mouseClickFlag = 0;
void setup()
{
pinMode(selPin, INPUT); // nút nhấn trên joystick là input
digitalWrite(selPin, HIGH); // biến selPin thành INPUT_PULLUP, có thể để pinMode là INPUT_PULLUP không cần dòng này
delay(500); // dừng 500ms
vertZero = analogRead(vertPin); // lấy giá trị khởi điểm cho biến trở dọc
delay(500);
horzZero = analogRead(horzPin); // lấy giá trị khởi điểm cho biến trở ngang
delay(500);
}
void loop()
{
vertValue = analogRead(vertPin) - vertZero; // đọc giá trị tương đối của trục dọc
delay(1);
horzValue = analogRead(horzPin) - horzZero; // đọc giá trị tương đối của trục ngang
delay(1);
if (vertValue != 0)
Mouse.move(0, vertValue/sensitivity, 0); // di chuyển trục chỉ theo trục y
if (horzValue != 0)
Mouse.move(horzValue/sensitivity, 0, 0); // di chuyển trục chỉ theo trục x
if ((digitalRead(selPin) == 0) && (!mouseClickFlag)) // Nếu nhấn nút và trước đó chưa nhấn nút
{
mouseClickFlag = 1;
Mouse.press(MOUSE_LEFT); // event chuột trái phát ra
}
else if ((digitalRead(selPin))&&(mouseClickFlag)) // nếu không còn nhấn nút nữa và trc đó đã nhấn nút
{
mouseClickFlag = 0;
Mouse.release(MOUSE_LEFT); // thả left button
}
}
Lưu ý
Các bạn có thể chỉnh độ nhạy của chuột bằng cách thay đổi biến:
const int sensitivity = 100;
Biến càng cao thì chuột càng chậm, và thường thì dưới 500 thì okê.
Gợi ý nâng cao
- Các bạn có thể gắn thêm 1 potentiometer để điều khiển độ nhạy của chuột.
- Làm 1 case thật oách cho chuột promicro của mình.


