Professional Documents
Culture Documents
HCM
===== ● =====
ĐỒ ÁN MÔN HỌC 2
i
DANH MỤC BẢNG
Bảng 3.2.1. So sánh các dòng vi xử lý. ------------------------------------------------------- 19
Bảng 3.2.2. So sánh các công nghệ không dây.---------------------------------------------- 20
ii
LỜI MỞ ĐẦU
Trên thị trường hiện tại có rất nhiều tay cầm kết nối không dây chơi game, chúng
thì được thiết kế khá nhỏ gọn phù hợp với người chơi. Tuy nhiên thường những tay cầm
này có giá thành rất cao, kèm theo đó là chỉ có thể chơi một số game nhất định, với lại
trong các game thường thì người chơi hay cấu hình game theo ý của mình nhưng đối với
các tay cầm hiện tại hầu như không có tính năng là thay đổi cấu hình để phù hợp cấu
hình game mà người chơi đã cấu hình trước đó điều này phần nào dẫn đến cảm giác khó
chịu khi đang chơi game.
Vì những lý do này, nhóm thực hiện đã chọn đề tài “ THIẾT KẾ KEY BOARD
GAME" trong quá trình thực hiện đề tài này, không tránh khỏi những sai sót do kiến
thức có giới hạn, cũng như tham khảo từ nhiều nguồn tài liệu từ internet, sách, báo,…
Rất mong nhận được sự đóng góp của quý thầy cô và bạn bè để đề tài thực hiện thành
công và phát triển hơn nữa.
iii
LỜI CẢM ƠN
Đầu tiên, nhóm thực hiện đề tài xin gửi lời cảm ơn sâu sắc và chân thành đến thầy
PHAN VĂN CA đã tận tình giúp đỡ, chỉ bảo, hướng dẫn nhóm thực hiện trong suốt quá
trình thực hiện đề tài này. Trong thời gian làm việc với thầy, nhóm không những tiếp
thu thêm nhiều kiến thức bổ ích mà còn học tập được tinh thần làm việc, thái độ nghiên
cứu khoa học nghiêm túc hiệu quả của thầy. Đây là những điều cần thiết cho nhóm trong
quá trình học tập và công tác sau này.
Nhóm thực hiện cũng xin chân thành cảm ơn các bạn ngành công nghệ kỹ thuật
máy tính lớp 151191A , đã luôn đồng hành, giúp đỡ để nhóm có thể thực hiện đề tài này
thành công.
Quá trình biên soạn báo cáo khó có thể tránh hoàn toàn các sai phạm. Kính mong
nhận được lời góp ý mang tính xây dựng từ mọi người.
iv
DANH SÁCH CÁC TỪ VIẾT TẮT
TỪ VIẾT TẮT TỪ TIẾNG ANH Ý NGHĨA
v
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Theo dõi các giá trị góc nghiêng thông qua cảm biến MPU6050, tử các góc nghiêng
đó sẽ bắt đầu gửi các lệnh tương ứng.
Điều khiển led RGB.
Điều khiển module Joystick.
Điều khiển các nút nhấn.
Gửi các chuỗi điều khiển thông qua Bluetooth.
Phần mềm trên máy tính sau khi nhận được các chuỗi sẽ tiến hành gửi các lệnh điều
khiển tương ứng để điều khiển game.
Phần mềm có thể thiết lập cấu hình game và lưu thiết lập đó trên database.
1
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Phương pháp tham khảo tài liệu: bằng cách thu thập thông tin từ sách, tạp chí về
điện tử, truy cập từ mạng internet.
Phương pháp quan sát: khảo sát một số mạch điện từ mạng internet, khảo sát các
tay cầm người ta tự chế.
Phương pháp khảo sát và thực nghiệm: từ những ý tưởng và kiến thức của nhóm,
kết hơp sự hướng dẫn của giáo viên, nhóm đã thiết kế thử nghiệm thành công
tay cầm chơi game.
1.6. Bố cục đồ án
Giới thiệu sơ lược về tình hình nghiên cứu hiện nay cũng như đối tượng
nghiên cứu, phương pháp nghiên cứu.
Chương 2: Cơ sở lý thuyết
Nêu các lý thuyết cần thiết của các cảm biến, chuẩn giao tiếp, giao thức sử
dụng trong đề tài.
Đưa ra các phương pháp lựa chọn phần cứng và xác định lựa chọn phù hợp
với yêu cầu của đề tài.
Trình bày kết quả đã thực hiện về phần cứng và phần mềm.
3
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
CHƯƠNG 2 : CƠ SỞ LÝ THUYẾT
Để tiến hành thiết kế phần cứng cũng như phần mềm nhóm đã tìm hiểu một số khái niệm
sau:
4
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Trong giao tiếp này, có hai loại UART có sẵn là truyền UART và nhận UART và
giao tiếp giữa hai loại này có thể được thực hiện trực tiếp với nhau. Đối với điều này, chỉ
cần hai cáp để giao tiếp giữa hai UART. Luồng dữ liệu sẽ từ cả hai chân truyền (Tx) và
nhận (Rx) của UARTs. Trong UART, việc truyền dữ liệu từ Tx UART sang Rx UART có
thể được thực hiện không đồng bộ.
Những ưu và nhược điểm của UART bao gồm những điều sau đây
Nó chỉ cần hai dây để truyền dữ liệu
Tín hiệu CLK là không cần thiết.
Nó bao gồm một bit chẵn lẻ để cho phép kiểm tra lỗi
Sắp xếp gói dữ liệu có thể được sửa đổi vì cả hai mặt được sắp xếp
Kích thước khung dữ liệu tối đa là 9 bit
Nó không chứa một số hệ thống phụ (hoặc)
Tốc độ truyền của UART phải ở mức 10% của nhau
5
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Nếu ứng dụng của bạn mà kích thước chương trình lớn dần và độ phức tạp tăng lên thì
RTOS sẽ rất hữu dụng trong trường hợp này, lúc đó RTOS sẽ chia các ứng dụng phức tạp
thành các phần nhỏ hơn và dễ quản lý hơn.
Chia sẻ tài nguyên một cách đơn giản: cung cấp cơ chế để phân chia các yêu cầu về bộ
nhớ và ngoại vi của MCU.
Dễ debug và phát triển: Mọi người trong nhóm có thể làm việc một cách độc lập, các
lập trình viên thì có thể tránh được các tương tác với ngắt, timer, với phần cứng (cái
này mình không khuyến khích lắm vì hiểu được phần cứng vẫn sẽ tốt hơn nhiều).
Tăng tính linh động và dễ dàng bảo trì: thông qua API của RTOS,….
Kernel
6
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Kernel sẽ có nhiệm vụ quản lý nhiều task cùng chạy 1 lúc, mỗi task thường chạy mất vài
ms. Tại lúc kết thúc task thường:
Một task trong RTOS thường có các trạng thái như sau
7
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Ban đầu, Python được phát triển để chạy trên nền Unix. Nhưng rồi theo thời gian,
nó đã "bành trướng" sang mọi hệ điều hành từ MS-DOS đến Mac OS, OS/2, Windows,
Linux và các hệ điều hành khác thuộc họ Unix. Mặc dù sự phát triển của Python có sự đóng
góp của rất nhiều cá nhân, nhưng Guido van Rossum hiện nay vẫn là tác giả chủ yếu của
Python. Ông giữ vai trò chủ chốt trong việc quyết định hướng phát triển của Python.
Python is Interpreted: Nhờ chức năng thông dịch mà trình thông dịch (Interpreter) của
Python có thể xử lý lệnh tại thời điểm chạy chương trình (runtime). Nhờ đó mà ta không
cần biên dịch chương trình trước khi thực hiện nó (tương tự như Perl và PHP).
Python is Interactive: Tính năng tương tác của Python giúp ta có thể tương tác trực tiếp với
trình thông dịch của nó ngay tại dấu nhắc lệnh. Cụ thể: Ta có thể thực hiện lệnh một cách
trực tiếp tại dấu nhắc của Python.
Python is Object-Oriented: Python hỗ trợ mạnh cho phong cách lập trình hướng đối tương
và kỹ thuật lập trình gói mã trong đối tượng.
Python is a Beginner's Language: Mặc dầu Python được xem là ngôn ngữ lập trình dành
cho những ai mới làm quen với việc lập trình trên máy tính, nhưng nó hỗ trợ mạnh cho
việc phát triển nhiều loại ứng dụng khác nhau, từ các chương trình xử lý văn bản đơn giản
đến các ứng dụng web, đến các chương trình game,…
Tính năng
Python là một ngôn ngữ lập trình dễ học, dễ đọc. Python tăng cường sử dụng từ khóa
tiếng Anh, hạn chế các kí hiệu và cấu trúc cú pháp so với các ngôn ngữ khác.
Mã nguồn của Python là tương đối dễ để bảo trì và duy trì và có khả năng mở rộng.
Python có một tiêu chuẩn thư viện rộng, có nền tảng tương thích trên nhiều hệ điều hành
hiện nay như: UNIX, Windows, and Macintosh. Đây cũng là một trong những điểm mạnh
đáng kể của Python.
8
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Python có thể được sử dụng như ngôn ngữ script, hoặc ngôn ngữ biên dịch, nhờ đó mà ta
có thể buil các chương trình lớn trên nó.
Khi chế độ Interactive, ta có thể nhập kết quả từ các đầu cuối khác nhau vào chương trình
Python,do đó mà việc test hay debug lỗi code trở nên đơn giản hơn.
Python cho phép người dùng tích hợp vào các module để có thể sử dụng trong các chương
trình khác. Nó cũng cung cấp sẵn một tập hợp các modules chuẩn mà lập trình viên có thể
sử dụng lại trong chương trình của họ. Các module này cung cấp nhiều chức năng hữu ích,
như các hàm truy xuất tập tin, các lời gọi hệ thống, trợ giúp lập trình mạng (socket),…
Python cung cấp giao diện cho tất cả các cơ sở dữ liệu thương mại lớn.
Có thế dễ dàng tích hợp với C, C++, COM, CORBA, ActiveX, Java.
2.5. Tương tác với cơ sở dữ liệu
Cơ sở dữ liệu là tập hợp dữ liệu được tổ chức có cấu trúc liên quan với nhau và được
lưu trữ trong máy tính.CSDL được thiết kế, xây dựng cho phép người dùng lưu trữ dữ liệu,
truy xuất thông tin hoặc cập nhật dữ liệu.CSDL được tổ chức có cấu trúc. Các dữ liệu được
lưu trữ có cấu trúc thành các bản ghi (record), các trường dữ liệu (field). Các dữ liệu lưu
trữ có mối quan hệ (relation) với nhauCSDL được cấu trúc để dễ dàng truy cập, quản lý và
cập nhật.
Dữ liệu được lưu trữ trong các file riêng biệt. Ví dụ: các chương trình lưu trữ thông
tin bằng hệ thống các file dạng text.
9
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Quản lý dữ liệu bằng CSDL giúp dữ liệu được lưu trữ một cách hiệu quả và có tổ
chức, cho phép quản lý dữ liệu nhanh chóng và hiệu quả.
Sử dụng các câu lệnh SELECT,INSERT, UPDATE, DELETE để tương tác với dữ
liệu trong cơ sở dữ liệu.
Thông số kỹ thuật:
10
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Tốc độ 72Mhz.
Hoạt động ở nhiệt độ từ - 40 đến 85 độ C.
Liên kết: CAN, I²C, IrDA, LIN, SPI, UART/USART, USB.
Ngoại vi: DMA, Motor Control PWM, PDR, POR, PVD, PWM, Temp Sensor, WDT.
Nguồn cung cấp: 2.6 ~ 3.6V.
Bộ ADC 12 bit.
Ưu điểm:
Giá rẻ.
Nhỏ gọn.
Siêu tiết kiệm điện.
GPU mạnh.
Phục vụ cho nhiều mục đích.
Khả năng hoạt động liên tục 24/7.
Khả năng debug chương trình mạnh. Vì sử dụng chuẩn nạp code JATG.
Nhược điểm:
Không phù hợp với hệ thống lớn, phức tạp.
Cấu hình còn thấp.
2.7. Module Joystick
Mạch điều khiển Joysticks được thiết kế để có thể giúp bạn điều khiển các thiết bị
theo mong muốn. Tương tự như trên các tay cầm game, nó sử dụng 2 biến trở trên 2 trục
X và Y, nhờ đó xuất mức điện áp đưa đến đầu vào analog của các vi điều khiển, nhờ đó dễ
dàng xử lý các tín hiệu này để điều khiển các thiết bị chấp hành theo mong muốn. Hơn nữa,
mạch Joystick còn cung cấp thêm 1 nút nhấn và có thể sử dụng nó với chức năng
accept/enter.
11
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
12
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
13
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
kết nối tiện dụng, đèn báo đang sạc và sạc đầy hiển thị trạng thái pin, thích hợp cho các
ứng dụng sử dụng pin sạc: Robot, mạch cảm biến không dây,...
Thông sỗ kỹ thuật:
IC chính: TP4056
Nguồn đầu vào:
o 4.5~8VDC: Chân nguồn vào + / -
o 5VDC qua cổng Micro USB.
Nguồn sạc đầy: 4.2VDC
Dòng sạc: 1A có thể biến đổi theo trạng thái pin.
Chức năng ngắt tải bảo vệ pin khi điện áp xuống quá thấp để tránh làm hư hỏng pin
(chai pin).
Đèn trạng thái sạc:
o Đèn đỏ: đang sạc, chưa đầy
o Đèn xanh lá: Đã sạc đầy.
Kích thước: 17x22x5mm.
2.10. Module Bluetooth HC05
14
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Bluetooth là chuẩn truyền thông không dây để trao đổi dữ liệu ở khoảng cách
ngắn.Chuẩn truyền thông này sử dụng sóng radio ngắn(UHF radio) trong dải tần số ISM
(2.4 tới 2.485 GHz). Khoảng cách truyền của module này vào khoảng 10m. Module này
được thiết kế dựa trên chip BC417. Con chip này khá phức tạp và sử dụng bộ nhớ flash
ngoài 8Mbit. Nhưng việc sử dụng module này hoàn toàn đơn giản bởi nhà sản xuất đã tích
hợp mọi thứ cho bạn trên module HC-05.
Module thu phát bluetooth HC-05 dùng để thiết lập kết nối Serial giữa 2 thiết bị
bằng sóng bluetooth. Điểm đặc biệt của module bluetooth HC-05 là module có thể hoạt
động được ở 2 chế độ: MASTER hoặc SLAVE. Trong khi đó, bluetooth module HC-06
chỉ hoạt động ở chế độ SLAVE.
+ Ở chê độ SLAVE: bạn cần thiết lập kết nối từ smartphone, laptop, usb bluetooth để dò
tìm module sau đó pair với mã PIN là 1234. Sau khi pair thành công, bạn đã có 1 cổng
serial từ xa hoạt động ở baud rate 9600.
Thông số kỹ thuật:
15
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Thông số kỹ thuật:
16
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
17
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Sử dụng ngôn ngữ Python để lập trình phần mềm trên máy tính và chọn SQLite làm
cơ sở dữ liệu lưu trữ thông tin cấu hình game.
3.2.Sơ đồ khối
Lõi : ARM 32 bit Cortex-M3 Tần số hoạt động lên tới 72 Mhz
ADC : 2×12 bit, tần số lấy mẫu 1Mhz DMA : Điều khiển 7 kênh DMA
Giao diện kết nối : 2xI2C, 3xUSART, 2xSPI, CAN, USB 2.0 full-speed.
+ Các thiết bị ngoại vi có thể được cấu hình một cách thích hợp. Lõi của bộ vi xử lý Cortex-
M3 được thiết kế để đáp ứng yêu cầu bộ nhớ tối thiểu, năng lượng tiêu thụ thấp và thiết kế
nhỏ gọn.
+ Tần số hoạt động lên tới 72 Mhz cho phép sử lý các tập lệnh nhanh chóng.
18
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
+ Bộ ADC của ARM có độ phân giải 12 bits tức là giá trị đọc về nằm trong khoảng 0 -
+ Có nhiều chuẩn kết nối phù hợp trong việc phát triển cho hệ thống sau này.
Bus Width 8 bit cho core 8/16/32- bit 8/32-bit Hầu như 32bit,
chuẩn số ít 64 bit
19
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Khối cảm biến: Thu thập dữ liệu từ các cảm biến rồi gửi về khối xử lý trung tâm.
Khối truyền thông:
Chọn Bluetooth.
Nguyên lý hoạt động chung:
Bộ xử lý trung tâm sau khi nhận được dữ liệu được gửi về từ cảm biến,từ đó sẽ gửi
các chuỗi thông qua Bluetooth kết nối với máy tính, phần mềm trên máy tính sẽ tiến hành
so sánh nếu đúng là chuỗi gửi, thì tương ứng từng chuỗi sẽ xuất lệnh điều khiển tương ứng
với cấu hình game.
20
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
21
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
• Nút nhấn: Có 6 nút nhấn nối lần lượt nối vào các chân PA12, PA11,
PA10, PA9, PA8, PB15.
Giải thích nguyên lý
• Joystick: Khi sử dụng sẽ trả về giá trị ADC trên 2 trục,bộ xử lý trung
tâm sẽ gửi các chuỗi lệnh tương ứng từ các giá trị này.
• Nút nhấn: Khi nhấn thì bộ xử lý trung tâm sẽ gửi chuỗi tương ứng
từng nút.
22
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Để thực hiện được những công việc điều khiển như trên ta có thể sử dụng các loại vi
điều khiển như 8051, AVR, PIC… Tuy nhiên những dòng vi xử lý trên có bộ vi xử lý
thấp chỉ có 8bit cũng có thể xử lý được nhưng hiệu suất không cao.
Lựa chọn
Trong đề tài này ta sử dụng chip STM32F103C8T6 vì:
chip STM32F103C8T6 hiện là đang là vi điều khiển được phát triển rộng rãi và sử
dụng phổ biến.
chip STM32F103C8T6 tiết kiệm năng lượng.
Tốc độ xử lý cao với bộ xử lý 32 bit.
23
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
3.4.1.2. Database
Bảng trên gồm có hàng , 18 cột:
• Hàng chứa các thiết đặt của các game khác nhau
• 18 cột là các trường bao gồm: tên game(GAME),thời gian thiết đặt (TIME), hiệu ứng
led(LED), trạng thái MPU6050(MPU), các nút nhấn, các hướng của Joystick.
Lựa chọn:
Có rất nhiều hệ cơ sở dữ liệu nổi tiếng hiện tại như MSAccess, SQL Server, MySQL,
Oracle,…Ở đây đối với đề tài này chúng em cần đến database là chỉ để lưu trữ và cho phép
truy vấn các thiết lập cấu hình trong game nên không cần sử dụng đến các hệ cở sở dữ liệu
lớn chỉ cần sử dụng SQLite hoặc MSAccess là đủ. Nhóm quyết định chọn SQLite làm
database cho đề tài này.
Chức năng: Lưu trữ và cho phép truy vấn các thiết lập game.
24
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
25
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
26
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
4.1.2. Schematic
Sau khi thiết kế sơ đồ khối, sơ đồ nguyên lí toàn mạch ta tiến hành vẽ mạch in đã
thiết kế.
27
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
28
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
29
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
Hoàn thành đề tài này đã giúp cho nhóm nắm thêm được nhiều kiến thức bổ ích như:
Bên cạnh đó do thời gian cũng như kiến thức còn hạn hẹp nên cũng không tránh khỏi
một số khuyết điểm như:
Kỹ thuật hàn còn thấp.
Bố trí chưa đẹp lắm.
Tư duy viết code còn nhiều sai sót.
Qua các khuyết điểm cần cải thiện được nêu ra đề tài có thể được phát triển theo các
hướng rộng hơn và hoàn thiện hơn như:
Tích hợp, thay thế thêm nhiều cảm biến để nâng tính ổn định, thông minh cho hệ thống.
Làm thêm các hiệu ứng cho đẹp sản phầm.
Kết hợp thêm các tấm pin năng lượng mặt trời nhỏ để khi hết điện chỉ cần để ngoài
nắng là có thể tự động sạc được.
30
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
[2]. Giáo trình “THỰC TẬP VI ĐIỀU KHIỂN PIC – Nguyễn Đình Phú” – Đại Học Sư
Phạm Kỹ Thuật Tp.HCM tháng 8/2015.
[3]. Giáo trình “VI XỬ LÝ NÂNG CAO STM32 – Thầy Phan Vân Hoàn” – Đại Học Sư
Phạm Kỹ Thuật Tp.HCM.
[4]. https://hocarm.org/hoc-rtos/
[5].https://advancecad.edu.vn/su-khac-biet-giua-vi-dieu-khien-avr-arm-8051-va-
pic/?fbclid=IwAR2lgZMCATRdsp9bRA2cu43O6WDil9Y3NumwrGH02tUfRd3rBC68o
khlwbg
31
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
PHỤ LỤC
Code điều khiển phần cứng.
#include "main.h"
#include "stm32f1xx_hal.h"
#include "cmsis_os.h"
#include "sd_hal_mpu6050.h"
#include "math.h"
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
I2C_HandleTypeDef hi2c1;
I2C_HandleTypeDef hi2c2;
UART_HandleTypeDef huart2;
osThreadId BUTTON_TASKHandle;
osThreadId JOYSTICK_TASKHandle;
osThreadId MPU6050_TASKHandle;
osThreadId RGB_TASKHandle;
uint8_t rx_buffer[100],rx_index=0,rx_data[2],Transfer_cplt,len,len1;
uint16_t ADC_value[2];
uint16_t x,y;
int stop = 0;
int sp = 0;
unsigned char buffer[100];
char Buffer[100];
SD_MPU6050 mpu1;
int16_t g_x,g_y,g_z,a_x,a_y,a_z;
int minVal=265;
int maxVal=402;
double rad_to_deg = 180/3.141592654;
double Acc_angle_x;
uint8_t data[14];
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_ADC1_Init(void);
static void MX_I2C1_Init(void);
static void MX_I2C2_Init(void);
void BUTTON(void const * argument);// TASK BUTTON
void JOYSTICK(void const * argument);// TASK JOYSTICK
void MPU6050(void const * argument);// TASKMPU6050
void RGB(void const * argument);//TASK LED RGB
32
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
/**
* @brief The application entry point.
*
* @retval None
*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
MX_ADC1_Init();
MX_I2C1_Init();
MX_I2C2_Init();
33
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
osKernelStart();
while (1)
{ }
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
34
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
ADC_ChannelConfTypeDef sConfig;
/**Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 2;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
35
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
hi2c2.Instance = I2C2;
hi2c2.Init.ClockSpeed = 400000;
hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c2.Init.OwnAddress1 = 0;
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c2.Init.OwnAddress2 = 0;
hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
36
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
__HAL_RCC_DMA1_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
//BUTTON
37
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
{
//CHỐNG DỘI
osDelay(30);
if(!HAL_GPIO_ReadPin(BT1_GPIO_Port,BT1_Pin)) // TIẾP TỤC KIẾM TRA
NHẤN PHÍM
{
// NẾU CÓ NHẤN THÌ TIẾN HÀNH ĐƯA CHUỖI "1U" VÀO MẢNG BUFFER
//HÀM SPRINTF CHỨC NĂNG TRẢ VỀ SỐ KÝ TỰ TRONG MẢNG BUFFER
TỨC ĐỘ DÀI CỦA CHUỖI TRUYỀN
len1 = sprintf((char *)Buffer, "1U|");
//TRUYỀN MẢNG BUFFER CHỨA CHUỖI ĐIỀU KHIỂN
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
// CHỞ NHÀ NÚT NHẤN
while(!HAL_GPIO_ReadPin(BT1_GPIO_Port,BT1_Pin))
{
osDelay(1);
}
// SAU KHI NHẢ NÚT THÌ LƯU CHUỖI "1D" VÀO MẢNG
len1 = sprintf((char *)Buffer, "1D|");
//TRUYỀN MẢNG BUFFER CHỨA CHUỖI "1D"
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
//TƯƠNG TỰ CHO CÁC NÚT NHẤN CÒN LẠI
else if(!HAL_GPIO_ReadPin(BT2_GPIO_Port,BT2_Pin))
{
osDelay(30);
if(!HAL_GPIO_ReadPin(BT2_GPIO_Port,BT2_Pin))
{
len1 = sprintf((char *)Buffer, "2U|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
while(!HAL_GPIO_ReadPin(BT2_GPIO_Port,BT2_Pin))
{
osDelay(1);
}
len1 = sprintf((char *)Buffer, "2D|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
////
else if(!HAL_GPIO_ReadPin(BT3_GPIO_Port,BT3_Pin))
{
osDelay(30);
if(!HAL_GPIO_ReadPin(BT3_GPIO_Port,BT3_Pin))
{
len1 = sprintf((char *)Buffer, "3U|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
while(!HAL_GPIO_ReadPin(BT3_GPIO_Port,BT3_Pin))
{
osDelay(1);
}
len1 = sprintf((char *)Buffer, "3D|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
/////
else if(!HAL_GPIO_ReadPin(BT3_GPIO_Port,BT3_Pin))
38
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
{
osDelay(30);
if(!HAL_GPIO_ReadPin(BT2_GPIO_Port,BT2_Pin))
{
len1 = sprintf((char *)Buffer, "3U|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
while(!HAL_GPIO_ReadPin(BT2_GPIO_Port,BT2_Pin))
{
osDelay(1);
}
len1 = sprintf((char *)Buffer, "3D|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
/////
else if(!HAL_GPIO_ReadPin(BT4_GPIO_Port,BT4_Pin))
{
osDelay(30);
if(!HAL_GPIO_ReadPin(BT4_GPIO_Port,BT4_Pin))
{
len1 = sprintf((char *)Buffer, "4U|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
while(!HAL_GPIO_ReadPin(BT4_GPIO_Port,BT4_Pin))
{
osDelay(1);
}
len1 = sprintf((char *)Buffer, "4D|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
/////
else if(!HAL_GPIO_ReadPin(BT5_GPIO_Port,BT5_Pin))
{
osDelay(30);
if(!HAL_GPIO_ReadPin(BT5_GPIO_Port,BT5_Pin))
{
len1 = sprintf((char *)Buffer, "5U|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
while(!HAL_GPIO_ReadPin(BT5_GPIO_Port,BT5_Pin))
{
osDelay(1);
}
len1 = sprintf((char *)Buffer, "5D|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
/////
else if(!HAL_GPIO_ReadPin(BT6_GPIO_Port,BT6_Pin))
{
osDelay(30);
if(!HAL_GPIO_ReadPin(BT6_GPIO_Port,BT6_Pin))
{
len1 = sprintf((char *)Buffer, "6U|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
while(!HAL_GPIO_ReadPin(BT6_GPIO_Port,BT6_Pin))
{
osDelay(1);
39
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
}
len1 = sprintf((char *)Buffer, "6D|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
}
}
osDelay(1);
}
/* USER CODE END 5 */
}
//JOYSTICK
void JOYSTICK(void const * argument)
{
/* USER CODE BEGIN JOYSTICK */
/* Infinite loop */
for(;;)
{
//ĐỌC GIÁ TRỊ ADC GỬI VỀ TỪ JOYSTICK
/**
* @param hadc: hadc1 VÌ SỬ DỤNG BỘ ADC1
@param pData: NƠI LƯU TRỮ DỮ LIỆU ĐỌC VỀ, Ở ĐÂY LÀ ĐỊA CHỈ MẢNG
ADC_value
@param length: ĐỘ DÀI DỮ LIỆU ĐƯỢC TRUYỀN VỀ TỪ ADC NGOẠI VI ĐẾN
BỘ NHỚ CHIP
*/
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_value,2);
osDelay(30);
//KẾT THÚC QUÁ TRÌNH ĐỌC ADC
HAL_ADC_Stop_DMA(&hadc1);
// GIÁ TRỊ ADC TRỤC X SẼ ĐƯỢC LƯU VÀO PHẦN TỬ ĐẦU TIÊN CỦA MẢNG
ADC_value
y = ADC_value[0];
// GIÁ TRỊ ADC TRỤC X SẼ ĐƯỢC LƯU VÀO PHẦN TỬ TH Ứ 2 CỦA MẢNG
ADC_value
x = ADC_value[1];
// SỬ DỤNG HÀM MAP ĐỂ CHUYỂN ĐỔI GIÁ TRỊ TỪ 0 ĐẾN 1023 THÀNH 0 ĐẾN
3200
x=map(x,0,1023,0,3200);
x=map(y,0,1023,0,3200);
// NẾU x>3000
if (x > 3000)
//TIẾP TỤC KIỂM TRA NẾU y>3000
if (y > 3000)
{
//LƯU CHUỖI "DR" VÀO TRONG MẢNG buffer TRẢ VỀ ĐỘ DÀI
CHUỖI LƯU TRONG BIẾN len1
len1 = sprintf((char *)Buffer, "DR|");
// TRUYỀN CUỖI ĐÓ
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1,
1000);
stop= 0;
}
//TƯƠNG TỰ CHO CÁC TRƯỜNG HỢP CÒN LẠI
else if (y<1000)
{
40
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
if (stop == 0)
{
stop = 1;
len1 = sprintf((char *)Buffer, "ST|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1,
1000);
41
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
}
}
osDelay(1);
}
/* USER CODE END JOYSTICK */
}
//MPU6050
void MPU6050(void const * argument)
{
/* USER CODE BEGIN MPU6050 */
/* Infinite loop */
for(;;)
{
osDelay(2);
SD_MPU6050_ReadTemperature(&hi2c1,&mpu1);
float temper = mpu1.Temperature;
//ĐỌC GIÁ TRỊ GÓC QUAY VÀ LƯU VÀO 3 BIẾN TƯƠNG ỨNG VỚI 3 TRỤC
SD_MPU6050_ReadGyroscope(&hi2c1,&mpu1);
g_x = mpu1.Gyroscope_X;
g_y = mpu1.Gyroscope_Y;
g_z = mpu1.Gyroscope_Z;
SD_MPU6050_ReadAccelerometer(&hi2c1,&mpu1);
//ĐỌC GIÁ TRỊ GIA TỐC GÓC VÀ LƯU VÀO 3 BIẾN TƯƠNG ỨNG VỚI 3 TRỤC
a_x = mpu1.Accelerometer_X;
a_y = mpu1.Accelerometer_Y;
a_z = mpu1.Accelerometer_Z;
// TỪ 3 GIÁ TRỊ NÀY TÍNH RA GÓC NGHIÊNG
Acc_angle_x = (atan((a_y)/sqrt(pow((a_x),2) +
pow((a_z),2)))*rad_to_deg);
//KIỂM TRA NẾU GÓC NGHIÊNG LỚN HƠN 30 ĐỘ THÌ TRUYỀN CHUỖI ĐIỀU KHIỂN RP
if (Acc_angle_x > 30)
{
len1 = sprintf((char *)Buffer, "RP|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
sp = 1;
}
//KIỂM TRA NẾU GÓC NGHIÊNG NHỎ HƠN -30 ĐỘ THÌ TRUYỀN CHUỖI ĐIỀU
KHIỂN LP
else if (Acc_angle_x <-30)
{
len1 = sprintf((char *)Buffer, "LP|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
sp =1;
}
//NGƯỢC LẠI THÌ DỪNG
else
{
if(sp==1)
{
len1 = sprintf((char *)Buffer, "SP|");
HAL_UART_Transmit(&huart2, (uint8_t*)Buffer, len1, 1000);
sp = 0;
42
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
}
}
}
}
/* USER CODE END MPU6050 */
//LED RGB
void RGB(void const * argument)
{
/* USER CODE BEGIN RGB */
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_SET);
43
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_RESET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,R1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,R2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,G2_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,B2_Pin,GPIO_PIN_RESET);
osDelay(500);
}
/* USER CODE END RGB */
}
while(1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
}
#endif /* USE_FULL_ASSERT */
44
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
import pyautogui
import serial
bt1 = 0
bt2 = 0
bt3 = 0
bt4 = 0
bt5 = 0
bt6 = 0
bt_up = 0
bt_down = 0
bt_right = 0
bt_left = 0
up ='W'
right ='D'
down ='S'
left='A'
command = ""
val_btn1 = 'U'
val_btn2 = 'I'
val_btn3 = 'O'
val_btn4 = 'J'
val_btn5 = 'K'
val_btn6 = 'L'
val_RP='right'
val_LP='left'
RP=0
LP=0
def doSomething():
global bt1,bt2,bt3,bt4,bt5,bt6,bt_down,bt_left
global bt_right,bt_up
global up,right,down,left
global val_btn1,val_btn2,val_btn3,val_btn4,val_btn5,val_btn6
global val_LP,val_RP
global command
global LP,RP
sr = serial.Serial('com8',baudrate=115200,parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS,timeout=0)
time.sleep(3)
while(True):
#try:
#
a = sr.read().decode('utf-8')
command = command + a
if (a == '|'):
print(command[0:len(command)-1])
command = command[0:len(command)-1]
#Button1 nhấn
if(command == "1U" ):
if(bt1 == 0):
pyautogui.keyDown(val_btn1) #Holds down the val_btn1
key
bt1 = 1;
45
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
#Button1 nhả
elif(command == "1D" ):
if(bt1 == 1):
pyautogui.keyUp(val_btn1) #Lets go of the val_btn1
key
bt1 =0;
#Button2 nhấn
elif(command == "2U" ):
if(bt2 == 0):
pyautogui.keyDown(val_btn2)
bt2 = 1;
#Button2 nhả
elif(command == "2D" ):
if(bt2 == 1):
pyautogui.keyUp(val_btn2)
bt2 =0;
#Button3 nhấn
elif(command == "3U" ):
if(bt3 == 0):
pyautogui.keyDown(val_btn3)
bt3 = 1;
#Button3 nhả
elif(command == "3D" ):
if(bt3 == 1):
pyautogui.keyUp(val_btn3)
bt3 =0;
#Button4 nhấn
elif(command == "4U" ):
if(bt4 == 0):
pyautogui.keyDown(val_btn4)
bt4 = 1;
#Button4 nhả
elif(command == "4D" ):
if(bt4 == 1):
pyautogui.keyUp(val_btn4)
bt4 =0;
#Button5 nhấn
elif(command == "5U" ):
if(bt5 == 0):
pyautogui.keyDown(val_btn5)
bt5 = 1;
#Button5 nhả
elif(command == "5D" ):
if(bt5 == 1):
pyautogui.keyUp(val_btn5)
bt5 =0;
#Button6 nhấn
elif(command == "6U" ):
if(bt6 == 0):
pyautogui.keyDown(val_btn6)
bt6 = 1;
#Button6 nhả
46
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
elif(command == "6D" ):
if(bt6 == 1):
pyautogui.keyUp(val_btn6)
bt6 =0;
#Joystick UP
elif(command == "UP"):
if(bt_up == 0 ):
pyautogui.keyDown(up)
bt_up = 1
if(bt_left==1):
pyautogui.keyUp(left)
bt_left = 0
if(bt_right == 1):
pyautogui.keyUp(right)
bt_right = 0
if(bt_down == 1):
pyautogui.keyUp(down)
bt_down = 0
#Joystick DOWN
elif(command == "DW"):
if(bt_down == 0 ):
pyautogui.keyDown(down)
bt_down = 1
if(bt_left==1):
pyautogui.keyUp(left)
bt_left = 0
if(bt_right == 1):
pyautogui.keyUp(right)
bt_right = 0
if(bt_up==1):
pyautogui.keyUp(up)
bt_up = 0
#Joystick RIGHT
elif(command == "RT"):
if(bt_right == 0 ):
pyautogui.keyDown(right)
bt_right = 1
if(bt_up==1):
pyautogui.keyUp(up)
bt_up = 0
if(bt_down == 1):
pyautogui.keyUp(down)
bt_down = 0
if(bt_left==1):
pyautogui.keyUp(left)
bt_left = 0
#Joystick LEFT
elif(command == "LT"):
if(bt_left == 0 ):
pyautogui.keyDown(left)
bt_left = 1
if(bt_up==1):
pyautogui.keyUp(up)
bt_up = 0
if(bt_down == 1):
pyautogui.keyUp(down)
bt_down = 0
47
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
if(bt_right == 1):
pyautogui.keyUp(right)
bt_right = 0
#Joystick DOWN + LEFT
elif(command == "DL"):
if(bt_left == 0 ):
pyautogui.keyDown(left)
bt_left = 1
if(bt_down == 0 ):
pyautogui.keyDown(down)
bt_down = 1
if(bt_up==1):
pyautogui.keyUp(up)
bt_up = 0
if(bt_right == 1):
pyautogui.keyUp(right)
bt_right = 0
#Joystick UP + LEFT
elif(command == "UL"):
if(bt_left == 0 ):
pyautogui.keyDown(left)
bt_left = 1
if(bt_up == 0 ):
pyautogui.keyDown(up)
bt_up = 1
if(bt_down==1):
pyautogui.keyUp(down)
bt_down = 0
if(bt_right == 1):
pyautogui.keyUp(right)
bt_right = 0
#Joystick UP + RIGHT
elif(command == "UR"):
if(bt_right == 0 ):
pyautogui.keyDown(right)
bt_right = 1
if(bt_up == 0 ):
pyautogui.keyDown(up)
bt_up = 1
if(bt_down==1):
pyautogui.keyUp(down)
bt_down = 0
if(bt_left == 1):
pyautogui.keyUp(left)
bt_left = 0
#Joystick DOWN + RIGHT
elif(command == "DR"):
if(bt_right == 0 ):
pyautogui.keyDown(right)
bt_right = 1
if(bt_down == 0 ):
pyautogui.keyDown(down)
bt_down = 1
if(bt_up==1):
pyautogui.keyUp(up)
bt_up = 0
if(bt_left == 1):
48
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
pyautogui.keyUp(left)
bt_left = 0
#Joystick do nothing
elif(command == "ST"):
if(bt_right == 1):
pyautogui.keyUp(right)
bt_right = 0
if(bt_down==1):
pyautogui.keyUp(down)
bt_down = 0
if(bt_up==1):
pyautogui.keyUp(up)
bt_up = 0
if(bt_left == 1):
pyautogui.keyUp(left)
bt_left = 0
#MPU sensor right
elif(command == "RP"):
if(RP == 0):
pyautogui.keyDown(val_RP)
RP = 1
if(LP == 1):
pyautogui.keyUp(val_LP)
LP = 0
#MPU sensor left
elif(command == "LP"):
if(LP == 0):
pyautogui.keyDown(val_LP)
LP = 1
if(RP == 1):
pyautogui.keyUp(val_RP)
RP = 0
#MPU sensor stop
elif(command == "SP"):
if(RP == 1):
pyautogui.keyUp(val_RP)
RP = 0
if(LP == 1):
pyautogui.keyUp(val_LP)
LP = 0
command = ""
#except:
# print("error")
# time.sleep(1)
def runThread():
myThread = Thread(target=doSomething)
myThread.start()
runThread()
root = Tk()
root.title("DRIVER GAME") # Đat ten cho cua so
root.resizable(height=True,width=True) # cho phep thay doi chieu rong va
chieu cao cua cua so
root.minsize(height=545,width=880) #xat chieu cao, chieu rong cua so
root.update_idletasks()
width = root.winfo_width()
49
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
height = root.winfo_height()
x = (root.winfo_screenwidth() // 2) - (width // 2)
y = (root.winfo_screenheight() // 2) - (height // 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))
Label(root,text="SAVE MY WORLD",bg="#009896",font="NONE 15").pack(fill=X)
#lựa chọn game đã được thiết lập và hiển thị cài đặt( mặc đinh ban đầu hoặc lần
cập nhật sau cùng)
def customizeGame():
global game,var1
game = game + 1
lable_blu_2 = Label(frame_mid, width="11", height="3", bg="#A1C1DA")
lable_blu_2.grid(row=6, column=2, sticky="WE")
if game == 1:
lable_blu_2["text"] = "LOL"
var1=IntVar(value=1)
elif game == 2:
lable_blu_2["text"] = "FIFA"
var1 = IntVar(value=1)
elif game == 3:
lable_blu_2["text"] = "SAMURAI"
var1 = IntVar(value=1)
elif game == 4:
lable_blu_2["text"] = "RACING"
var1 = IntVar(value=0)
elif game == 5:
game = 0
Checkbutton(frame_1, text="IS MPU ACTIVE ?", height="3", width="45",
variable=var1, bg="#A1C1DA").place(x=0,y=320)
if lable_blu_2["text"]== "LOL":
conn = sqlite3.connect('tutorial_rac26_1.db')
c = conn.cursor()
c.execute(
"SELECT
GAME,TIME,LED,MPU,BUTTON1,BUTTON2,BUTTON3,BUTTON4,BUTTON5,BUTTON6"
",LEFT_UP,UP,UP_RIGHT,RIGHT,RIGHT_DOWN,DOWN,DOWN_LEFT,LEFT from
stuffToPlot where GAME='LOL'")
elif lable_blu_2["text"]== "FIFA":
conn = sqlite3.connect('tutorial_rac26_1.db')
c = conn.cursor()
c.execute(
"SELECT
GAME,TIME,LED,MPU,BUTTON1,BUTTON2,BUTTON3,BUTTON4,BUTTON5,BUTTON6"
",LEFT_UP,UP,UP_RIGHT,RIGHT,RIGHT_DOWN,DOWN,DOWN_LEFT,LEFT from
stuffToPlot where GAME='FIFA'")
elif lable_blu_2["text"] == "SAMURAI":
conn = sqlite3.connect('tutorial_rac26_1.db')
c = conn.cursor()
c.execute(
"SELECT
GAME,TIME,LED,MPU,BUTTON1,BUTTON2,BUTTON3,BUTTON4,BUTTON5,BUTTON6"
",LEFT_UP,UP,UP_RIGHT,RIGHT,RIGHT_DOWN,DOWN,DOWN_LEFT,LEFT from
stuffToPlot where GAME='SAMURAI'")
elif lable_blu_2["text"] == "RACING":
conn = sqlite3.connect('tutorial_rac26_1.db')
c = conn.cursor()
c.execute(
50
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
"SELECT
GAME,TIME,LED,MPU,BUTTON1,BUTTON2,BUTTON3,BUTTON4,BUTTON5,BUTTON6"
",LEFT_UP,UP,UP_RIGHT,RIGHT,RIGHT_DOWN,DOWN,DOWN_LEFT,LEFT from
stuffToPlot where GAME='RACING'")
for row in c:
entry_btn1.delete(0, END) # xóa ki tự trong ô entry
entry_btn1.insert(0,row[4]) #btn1 # chèn giá
trị chứa trong row vào entry
entry_btn2.delete(0, END)
entry_btn2.insert(0,row[5]) #btn2
entry_btn3.delete(0, END)
entry_btn3.insert(0,row[6]) ##btn3
entry_btn4.delete(0, END)
entry_btn4.insert(0,row[7]) #btn4
entry_btn5.delete(0, END)
entry_btn5.insert(0,row[8]) #btn5
entry_btn6.delete(0, END)
entry_btn6.insert(0,row[9]) #btn6
entry_1.delete(0,END)
entry_1.insert(0,row[10]) #lu
entry_2.delete(0, END)
entry_2.insert(0, row[11]) #up
entry_3.delete(0, END)
entry_3.insert(0, row[12]) #ur
entry_4.delete(0, END)
entry_4.insert(0, row[13]) #right
entry_5.delete(0, END)
entry_5.insert(0, row[14]) #rd
entry_6.delete(0, END)
entry_6.insert(0, row[15]) #down
entry_7.delete(0, END)
entry_7.insert(0, row[16]) #DL
entry_8.delete(0, END)
entry_8.insert(0, row[17]) #LEFT
51
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
lu = entry_1.get()
up = entry_2.get()
ur = entry_3.get()
right = entry_4.get()
rd = entry_5.get()
down = entry_6.get()
dl = entry_7.get()
left = entry_8.get()
port= combo.get()
ledeffect()
print("LU = ", lu)
print("UP = ", up)
print("UR = ", ur)
print("RIGHT = ", right)
print("RD = ", rd)
print("DOWN = ", down)
print("DL = ", dl)
print("LEFT = ", left)
print("port, LED :" ,port,led)
print("var1 = ",str(var1.get()))
# database
conn = sqlite3.connect('tutorial_rac26_1.db')
c = conn.cursor()
c.execute(
"CREATE TABLE IF NOT EXISTS stuffToPlot(GAME TEXT,TIME TEXT,LED
TEXT,MPU TEXT,BUTTON1 TEXT,BUTTON2 TEXT,BUTTON3 TEXT,BUTTON4 TEXT,BUTTON5
TEXT,BUTTON6 TEXT,LEFT_UP TEXT,UP TEXT,UP_RIGHT TEXT,RIGHT TEXT,RIGHT_DOWN
TEXT,DOWN TEXT,DOWN_LEFT TEXT,LEFT TEXT)")
# cập nhật giá trị cho bảng
if (game == 1):
52
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
nameofgame = 'LOL'
elif(game == 2):
nameofgame = 'FIFA'
elif (game == 3):
nameofgame = 'SAMURAI'
elif (game == 4):
nameofgame = 'RACING'
c.execute("UPDATE stuffToPlot set
TIME='"+localtime+"',LED='"+port+"',MPU='"+str(var1.get())+"',BUTTON1 =
'"+val_btn1+"',BUTTON2 = '"+val_btn2+"',BUTTON3 = '"+val_btn3+"',BUTTON4 =
'"+val_btn4+"',BUTTON5 = '"+val_btn5+"',BUTTON6 =
'"+val_btn6+"',LEFT_UP='"+lu+"',UP = '"+up+"',UP_RIGHT='"+ur+"',RIGHT =
'"+right+"',RIGHT_DOWN = '"+rd+"',DOWN = '"+down+"',DOWN_LEFT = '"+dl+"',LEFT
= '"+left+"' where GAME = '"+nameofgame+"'")
conn.commit()
53
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
entry_btn2 = Entry(frame_2,width=5)
entry_btn2.grid(row=6, column=1)
entry_btn3 = Entry(frame_2,width=5)
entry_btn3.grid(row=7, column=1)
entry_btn4 = Entry(frame_2,width=5)
entry_btn4.grid(row=8, column=1)
entry_btn5 = Entry(frame_2,width=5)
entry_btn5.grid(row=9, column=1)
entry_btn6 = Entry(frame_2,width=5)
entry_btn6.grid(row=10, column=1)
#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx
#XỬ LÝ TRÊN frame_1
# tạo các lable và entry cho Joystic
# 3 lable hàng 0
#lable_1=Label(frame_1,text="LU",width="10",height="3",bg="white",foreground=
"#859751").grid(row=0, column=0)
lable_2=Label(frame_1,text="UP",width="10",height="3",bg="white",foreground="
#00a4c7" ).grid(row=0, column=2)
#lable_3=Label(frame_1,text="UR",width="10",height="3",bg="white",foreground=
"orange" ).grid(row=0, column=4)
#3 entry hàng 1
entry_1=Entry(frame_1,width=5,bg="#fef2f6")
#entry_1.grid(row=1, column=1)
entry_2=Entry(frame_1,width=5,bg="#fef2f6")
entry_2.grid(row=1, column=2)
entry_3=Entry(frame_1,width=5,bg="#fef2f6")
#entry_3.grid(row=1, column=3)
# 3 entry hàng 3
entry_7=Entry(frame_1,width=5,bg="#fef2f6")
#entry_7.grid(row=3, column=1)
entry_6=Entry(frame_1,width=5,bg="#fef2f6")
entry_6.grid(row=3, column=2)
entry_5=Entry(frame_1,width=5,bg="#fef2f6")
#entry_5.grid(row=3, column=3)
# 3 lable hàng 4
#lable_6=Label(frame_1,text="DL",width="10",height="3",bg="white"
,foreground="#c55805").grid(row=4, column=0)
lable_7=Label(frame_1,text="DOWN",width="10",height="3",bg="white"
).grid(row=4, column=2)
54
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
#lable_8=Label(frame_1,text="RD",width="10",height="3",bg="white",foreground=
"green").grid(row=4, column=4)
#hàng 1
button_3=Button(frame_2,text="BUTTON
3",width="10",bg="#00a4c7",height="3").grid(row=1,column=0)
button_4=Button(frame_2,text="BUTTON
4",width="10",bg="#FFE40F",height="3").grid(row=1,column=1)
#hàng 2
button_5=Button(frame_2,text="BUTTON
5",width="10",bg="#FFE40F",height="3").grid(row=2,column=0)
button_6=Button(frame_2,text="BUTTON
6",width="10",bg="#00a4c7",height="3").grid(row=2,column=1)
#hang 3: khi click để chọn thể loại game
Btn_CUSTOM=Button(frame_2,text="SELECT GAME",
width=18,height=3,bg="#64b8a1",padx=10,pady=10,command=customizeGame).grid(co
lumnspan=2)
customizeGame()
root.mainloop()
55
ĐỒ ÁN 2: THIẾT KẾ KEYBOARD GAME GVHD: PGS.TS PHAN VĂN CA
56