CHẾ BỘ VOLANT TỪ BOARD VI ĐIỀU KHIỂN ARDUINO & ENCODER
(Bài thực hành ứng dụng sinh động cho các bạn trẻ chuyên ngành điện tử, điều khiển tự động...)
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 thì đặc tính volant tốt hơn 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).
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ễ, trong Gr cũng có đấy.
Rất hay là giờ đây đã có thêm một lựa chọn mới. Ngay trong Gr, đã 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.
Để hiểu rõ Arduino là gì, vì sao chọn Arduino thay vì chọn Pic, 8051 hay AVR thì mời các bạn tham khảo ở đây
http://arduino.vn/bai-viet/42-arduino-uno-r3-la-gi.
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 gầ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: Board Arduino Uno r3 chíp thường 170k, chíp dán 90k (hàng TQ):
http://dientuachau.com/page/index.php?_m=mod_product&_a=view&p_id=1107
Tóm lại, nó đang rất hot trong giới hâm mộ kể cả chuyên và không chuyên, mới có mặt tại VN hơn một 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ới sức hấp dẫn của Arduino như thế, nên vừa rồi thấy có bác đưa quá trình chế bộ volant từ board mạch Arduino này lên Gr, mình đã tham gia nhiệt tình. Rất tiếc, chủ đề đó đã bị xóa nên mình viết bài này để giữ lại, chia sẻ cùng các bạn, cũng là hệ thống lại kiến thức của mình sau gần một tháng làm quen với Arduino.
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.
Loại chip thường:
Loại chíp dán:
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:
http://shop.honeynet.vn/san-pham/module-encoder-100-xung/
Biến trở (chiếc áp) :
http://linhkientudong.vn/bien-tro-don-triet-ap-don-20k_i1437_c156.aspx
Contac bấm:
http://phukienaqua.com/shops/Linh-Kien-DIY-Den-Led/Cong-tac-bam-den-17/
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
Còn đây là file code, linh hồn cho board mạch vđk, tải về giải nén để lát nạp vào board :
mega.nz/#!IgBgzTSa!a001YBRGBW91R-3cgW8YZ4fZajJcUSOoR_HynO-YGWI
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
- 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 ETS2 để chạy thử bộ volant mới này xem sao.
Các bạn xem thêm clip gốc hướng dẫn thực hiện
LƯU Ý:
a) 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 5ly.
- 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 5ly 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.
b) 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\ TurnIntoAn
Arduino.bat (thay vì file TurnIntoA
Joystick.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\TurnIntoA
Joystick.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ác biến trở dùng cho các bàn đạp các bạn chọn tầm 20k, 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
(ở đâ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 ETS2)
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 ETS2 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 ETS2 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 !