minhsondaklak gửi vào
- 24386 lượt xem
Trong các nhóm Game mô phỏng lái xe (như ETS2), nhiều bạn đã chế thành công bộ volant dùng vi điều khiển từ A tới Z, từ phần cứng tới phần mềm; dựa trên các vi điều khiển quen thuộc như Pic, 8051 .. Nếu so cùng giá tiền, làm từ vđk & encoder thì đặc tính volant tốt hơn nhiều so với dùng gamepad, tuy nhiên sẽ cực hơn một chút. Tức là ta sẽ tự chế ra một cái gamepad xịn (b1), rồi từ đó lắp ráp thành bộ volant (b2).
Rất hay là giờ đây đã có thêm một lựa chọn mới. Đã có người bắt tay chế bộ volant từ board Arduino, tuy nhiên chỉ dùng biến trở, chưa thấy cái nào chạy encoder. Trong bài này mình hướng dẫn các bạn làm b1, còn b2 thì đã có nhiều trên mạng và nó khá dễ.
Mình đã viết bài này từ 2015, nó là 1 dự án nhỏ dùng Arduino có tính trọn gói, mình thiết nghĩ sẽ rất tốt cho các bạn mới làm quen https://vnsimulator.com/threads/che-bo-volant-tu-board-arduino-r3.434/
Vì sao mình lại sử dụng board Arduino
Theo mình, so với dùng các vđk rời, board mạch vđk này có các ưu điểm rất hấp dẫn với người không chuyên:
- Là một board mạch vi điều khiển hoàn chỉnh, chỉ việc cắm vào cổng USB máy tính, cài driver là chạy. Mạch dùng để chạy và cũng nạp code trực tiếp từ máy tính luôn.
- Rất dễ viết code: nếu dùng 8051, Pic .. phải viết cả trang code thì với Arduino chỉ còn vài dòng là xong (tuyệt vời, nhờ thư viện mở của Arduino liên tục phát triển trên cộng đồng mạng, trong hơn 10 năm qua). Tuy nhiên ở đây, code thì cũng đã free sẵn luôn rồi, coi như xong.
- Giá chỉ bằng cái gamepad TQ
Tóm lại, nó đang rất hot trong giới hâm mộ kể cả chuyên và không chuyên, cũng mới có mặt tại VN ba bốn năm nay.
Và qua bài viết này, bạn chỉ cần nắm thao tác nạp code (nôm na giống như PC thì cần phải nạp Hệ điều hành vậy), rồi mua mạch về là chiến thôi... chỉ cần có tay nghề "vọc" là ok.
Về phần điện, từ mạch Arduino được chia sẻ trên mạng, mình đã cải tiến được một điểm quan trọng, đó là sử dụng encoder mô phỏng volant thay vì dùng biến trở (giúp volant quay mịn hơn, khống chế góc quay volant 2,5 vòng từ trong phần mềm nên sẽ chính xác hơn, đơn giản hơn so với làm từ biến trở).
Các bạn chỉ cần biết để lựa chọn phương án như vậy thôi, việc còn lại chỉ là lắp ráp và dùng thôi.
Hình dưới đây là dòng board Arduino Uno, phiên bản R3, được dùng phổ biến và cũng là board dùng trong bài viết này, chip vđk ứng dụng trên board này là ATmega328. Các bạn hãy lưu ý về ký hiệu chân trên board để đấu nối cho đúng hướng dẫn (thứ tự chân được ghi trên board, không sử dụng thứ tự chân của con chip vđk nhé).
Ngoài ra trên board còn có vđk giao tiếp ATmega16 (để chuyển USB to Serial).
Nối mạch
Chúng ta cần chuẩn bị thêm một số linh kiện, và đấu nối chúng vào board mạch như sau :
- Chân số 2, 3 lần lượt nối với kênh A và kênh B encoder, để làm volant (chân nào cũng được, khi test bị ngược chiều thì đảo lại thôi)
- Chân A0, A1, A2 lần lượt nối với chân giữa của mỗi biến trở để làm các bàn đạp ga, côn, phanh (biến trở tầm 20k).
- Chân số từ 4 đến 12 và chân A3, A4, A5 sẽ nối lần lượt với mỗi chân của contac bấm, dùng cho đèn, còi, cam, hộp số ... tất cả có 12 chân, nối được cho 12 contac.
- Chân cấp nguồn + của encoder, một chân ngoài của mỗi biến trở (chân ngoài nào cũng được, khi test bị ngược chiều thì đảo lại), nhập làm một mối, nối đến chân 5v trên board.
- Chân GND của encoder, chân còn lại của các biến trở, chân còn lại của các contac bấm, tất cả nhập làm một mối, nối đến chân GND trên board.
Cần nối đủ encoder và 3 biến trở. Riêng các contac để sau cũng được, cần đến đâu nối đến đó.
- Encoder
- Biến trở (chiếc áp)
- Contac bấm
Bây giờ đến phần mềm, các bạn tải và giải nén trình Arduino IDE, dùng để soạn thảo và nạp code cho board qua cổng USB: http://arduino.vn/bai-viet/68-cai-dat-driver-va-arduino-ide
Linh hồn cho board mạch vđk, các bạn hãy tải về giải nén để lát nạp vào board.
Quy trình thực hiện
- Bước 1. Cắm board vào cổng USB, cài đặt Driver cho board Arduino: Vào thư mục UnojoyWin chạy UnoJoyDriverInstaller.exe
- Rồi khởi động trình Arduino IDE đã tải ở trên (chạy file Arduino.exe).
- Bước 2. Xác định cổng COM nào đã kết nối trên PC : Trên windows > vào Device Manager > Pors (Com & LPT) > Arduino (COM…) ; ví dụ là Arduino (COM1) có nghĩa là board Arduino đang nối vào cổng COM1 trên PC.
- Bước 3. Chọn cổng COM tương ứng cho Arduino IDE : Trên IDE > Tools > Serial Port > COM1
- Bước 4. Chọn đúng dòng board Arduino trên Arduino IDE : Trên IDE > Tools > Board > Arduino Uno
- Bước 5. Mở file code trên Arduino IDE : Trên IDE > File > Open > chọn mở file code đã tải về ở trên, tại đường dẫn: UnojoyWin \ UnoJoyArduinoSample \ UnoJoyArduinoSample.ino
- Bước 6. Nạp code cho board mạch : trên Arduino IDE > Bấm dấu check (verify) để biên dịch > rồi bấm Upload (biểu tượng mũi tên nằm ngang, thứ 2 từ bên trái) để nạp. Khi nạp xong sẽ có thông báo (lưu ý, bước này là nạp file hex cho chip ứng dụng ATmega328)
Đối với một ứng dụng thông thường, dùng board Arduino để điều khiển trực tiếp các thiết bị ngoại vi khác (động cơ, LCD, mạch wifi ...) thì qua 6 bước như vậy là xong.
Nhưng với ứng dụng này, chúng ta muốn dùng Arduino giao tiếp với PC, cần PC nhận nó là một gamepad thì phải qua thêm một bước nữa.
Có thể hiểu board Arduino bao gồm phần cứng và phần mềm, và giờ ta thay phần mềm khác cho nó, bản thân Arduino trở thành một thiết bị khác, làm nhiệm vụ khác.
- Bước 7: Thay file hex khác cho chip giao tiếp ATmega16u trên board Arduino:
- Các bạn tải và cài phần mềm Flip để hỗ trợ nạp file hex cho chip giao tiếp http://www.atmel.com/images/Flip Installer - 3.4.7.112.exe (mirror)
- Dùng dây dẫn điện quẹt cho chạm chân GDN lên chân Reset, tại cụm đầu nối ICSP1 như hình 1 ở trên (2 chân đánh dấu đỏ), gọi là set mode DFU cho board mạch Arduino.
- Vào thư mục UnoJoyWin đã tải về, chạy file TurnIntoAJoystick.bat để nạp file hex mới cho chip giao tiếp.
- Sau khi nạp xong, bạn rút và cắm lại dây USB, lúc này PC sẽ nhận board Arduino là một Gamepad, vậy là xong !
Trên windows, bạn vào mục Devices and Prints để test Gamepad rồi vào game mô phỏng (như ETS2) để chạy thử bộ volant mới này xem sao.
LƯU Ý
- Board Arduino có thể dùng nguồn từ cổng USB hoặc nguồn ngoài 7-9v cắm vào đầu jack 2.1ly.
- Nếu dùng nguồn từ cổng USB trên PC thì cẩn thận, nếu để chạm mạch trên board có thể làm hỏng cổng USB của PC.
- Trên board có 01 cầu chì tự ngắt mạch khi bị chạm và sau đó tự phục hồi, tuy nhiên cẩn thận thì hơn.
- Nếu dùng nguồn ngoài cắm vào jack 2.1ly thì phải chú ý chân âm dương, nếu bị ngược sẽ làm cháy board mạch ngay tức khắc.
File code mình đã viết cho encoder có độ phân giải 20 xung, nếu các bạn dùng loại encoder có độ phân giải khác, thì cần sửa code như sau
Khôi phục lại file hex cho chip ATmega16u, để board Arduino trở về mặc định ban đầu :
Làm như bước 7, nhưng chạy file UnojoyWin\ TurnIntoAnArduino.bat (thay vì file TurnIntoAJoystick.bat ).
- Sửa code: Mở file code trên IDE (bước 5), tìm đến dòng thứ 6 "int n = 20;" và sửa theo độ phân giải mới. Ví dụ: encoder của bạn là loại 100 xung thì sửa dòng 6 thành "int n = 100;"
- Nạp code: Bấm dấu check (verify) trên IDE để biên dịch lại code, rồi bấm Upload nạp lại code cho chip ATmega328 (bước 6).
- Nạp lại file hex cho chip ATmega16u, để board Arduino lại trở thành gamepad : làm đúng chính xác như bước 7, nạp file UnojoyWin\TurnIntoAJoystick.bat
Encoder phân giải cao thì volant quay càng mượt, với mạch này các bạn nên chọn loại có độ phân giải tầm 100 xung là vừa, cao hơn nữa thì đắt tiền nhưng cũng không mượt hơn.
Các biến trở dùng cho các bàn đạp các bạn chọn tầm 20kOhm, loại như hình dưới này nhé.
Dưới đây là clip mình đã mô phỏng, test kết quả hoạt động của board mạch (clip 1)
(ở đây là mình test mạch điện ảo theo kiểu chuyên nghiệp và con nhà nghèo...hi, khi các bạn làm với mạch Arduino thực thì cắm vào pc test nó trên win)
Các bạn quan sát board mạch Arduino hình bên trái, được mình mô phỏng trên phần mềm proteus:
- Cái motor quay quay, làm quay cái encoder tích hợp trong nó, là giã lập cho sự quay của volant (trên mạch điện ảo, phải dùng motor để làm quay quay encoder)
- Các biến trở kéo trượt lên xuống là giã lập cho hành trình các chân đạp pedal
- Các phím bấm thì rõ rồi, dùng cho các nút đèn, còi, số ...
Các động tác trên mạch này là do mình điều khiển các nút bấm và kéo các chiếc áp, mô phỏng các động tác trên mạch thực, trong đó bao gồm điều khiển tốc độ và chiều quay motor, tức để quay encoder (coi như quay volant).
Hình gamepad bên phải: Phản ánh kết quả tín hiệu nhận được trên PC khi ta thao tác trên board mạch Arduino ảo nêu trên. Tín hiệu này sẽ được PC chuyển vào game mô phỏng như tín hiệu từ một gamepad.
Ở kết quả mô phỏng này, quan trọng là xem đáp ứng của tín hiệu volant.
Hãy so sánh sự dịch chuyển cái dấu cộng stick bên hình phải (đối tượng bị điều khiển) với sự quay của cái motor bên hình trái (đối tượng điều khiển). Nói chung, nhìn cái gamepad này bị điều khiển chạy ok thì trong game cũng sẽ ok như thế.
Tiêu chí đánh giá:
- Sự di chuyển của stick phải mịn màng và chấp hành theo sự quay của motor, không bị nhiễu giật lung tung.
- Từ vị trí cân bằng (stick ở giữa), khi cho motor quay vừa đủ 2.5 vòng/2 (900 độ/2) thì stick di chuyển vừa kịch đến biên (viền khung chữ nhật màu đỏ),
- Khi motor quay tiếp lố 2.5 vòng/2 thì stick vẫn đứng yên,
- Khi motor đảo chiều thì stick cũng đảo chiều ngay (bất kể khi nào).
Còn lại, 3 chiếc áp ở giữa và các phím bấm, khi thao tác thấy có đáp ứng ở hình bên phải là được rồi.
(Trong board mạch, có thêm 1 contac và 1 chiếc áp để đảo chiều và tăng giảm tốc độ cho motor)
Rất vui lòng và cám ơn các bạn đã xem !
ps: Các bạn xem thêm clip gốc hướng dẫn thực hiện dưới đây (clip 2)