Giới thiệu dự án
Sự phát triển của ngành công nghiệp vi điều khiển và hệ thống nhúng (Embedded Systems) đã mở ra tiềm năng to lớn trong việc phát triển các thiết bị giải trí cầm tay tích hợp đồ họa và âm thanh thời gian thực. Theo các báo cáo thị trường từ Embedded Computing Design, các giải pháp giải trí nhúng chuyên dụng đòi hỏi sự cân bằng tối ưu giữa hiệu năng xử lý tính toán đồ họa (2D/3D GUI Rendering), khả năng xử lý tín hiệu số (Digital Signal Processing - DSP), và mức tiêu hao năng lượng thấp.
Đồ án tốt nghiệp "Thiết kế Game Mini trên Kit STM32F746G_Discovery" được thực hiện tại Bộ môn Điện tử Công nghiệp – Y sinh, Khoa Điện – Điện tử, Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh nhằm giải quyết bài toán tích hợp phần cứng đa ngoại vi trên nền tảng vi điều khiển 32-bit hiệu năng cao, xây dựng hệ thống máy chơi game mini hoàn chỉnh từ phần cứng tới thuật toán trò chơi.
+-----------------------------------------------------------------------------------+
| KIẾN TRÚC TỔNG THỂ HỆ THỐNG G-CONSOLE |
+-----------------------------------------------------------------------------------+
+-------------------+
| Nguồn Ngoài |
| 5V - 2A |
+---------+---------+
|
v
+-------------------------------------------+---------------------------------------+
| KIT STM32F746G-DISCOVERY (MASTER) |
| +-----------------------------------------------------------------------------+ |
| | Cortex-M7 Core @ 216 MHz | 1MB Flash | 340KB SRAM | Chrom-ART Accelerator | |
| +-----------------------------------------------------------------------------+ |
| | | | |
| (RGB 24-bit + I2C) (SDMMC 4-bit) (SPI2 Bus) |
+---------+---------------------------+-----------------------------+---------------+
| | |
v v v
+-------------------+ +-------------------+ +---------------------------+
| Màn hình TFT 4.3" | | Thẻ nhớ MicroSD | | Mạch Shield Mở Rộng |
| 480x272 + Touch | | FAT32 Audio Files | | (Bus SPI Phân Kênh) |
+-------------------+ +-------------------+ +-------------+-------------+
|
+-------------------------+-------------+
| |
v v
+-----------------------+ +-------------------+
| Module VS1003 (Slave) | | Tay cầm PS2 Dual |
| Audio DAC & Decoder | | Shock (Slave) |
+-----------+-----------+ +-------------------+
|
v
+-----------------------+
| Mạch khuếch đại LM386 |
| Loa Stereo 4 Ohm / 3W |
+-----------------------+
Vấn đề kỹ thuật (Problem Statement)
Các nền tảng vi điều khiển 8-bit hoặc 16-bit truyền thống (như ATmega328P hay PIC16F) thường gặp hiện tượng "nghẽn cổ chai" băng thông khi xử lý đồng thời:
- Quét và render đồ họa màu trên màn hình độ phân giải cao (> 320x240 pixels) mà không có chip xử lý đồ họa chuyên biệt.
- Giải mã tập tin âm thanh nén (MP3, WAV) theo thời gian thực dẫn đến chiếm dụng 80-90% chu kỳ CPU.
- Xung đột bus giao tiếp khi nhiều ngoại vi (màn hình cảm ứng, thẻ nhớ, âm thanh, tay cầm điều khiển) cùng hoạt động đồng thời.
Mục tiêu dự án
- Thiết kế và thi công mạch shield mở rộng ghép nối kit phát triển STM32F746G-Discovery với tay cầm Sony DualShock 2 (PS2) và module giải mã âm thanh cứng VS1003-v2.
- Xây dựng giao thức truyền thông SPI đồng bộ ghép kênh cho phép MCU giao tiếp đa thiết bị Slave với cơ chế chia sẻ đường truyền logic an toàn.
- Tối ưu hóa hệ thống tập tin FatFs trên giao tiếp SDMMC 4-bit nhằm truy xuất dữ liệu âm thanh và tài nguyên game đạt tốc độ truyền tải tối thiểu 20 MB/s.
- Lập trình 07 tựa game mini hoàn chỉnh: Cờ Caro (Gomoku), Ball Bing Bong (Pong Arcade), Flappy Bird, Stick Hero, Ai Là Triệu Phú, Vòng Quay Sát Phạt, và Pika Pika (Platform Runner).
- Đảm bảo tốc độ đáp ứng khung hình $\ge 50\text{ FPS}$, độ trễ phản hồi tay cầm $< 20\text{ ms}$, dòng điện tiêu thụ toàn tải $< 1.81\text{ A}$ ở điện áp định mức 5V.
Phạm vi và giới hạn
- Phần cứng: Kit STM32F746G-DISCO (MCU ARM Cortex-M7 STM32F746NGH6, 216MHz), màn hình 4.3-inch 480x272 TFT LCD điện dung, module VS1003, tay cầm Sony DualShock 2 có dây, mạch khuếch đại công suất LM386.
- Phần mềm: Lập trình bare-metal/HAL trên Keil MDK-ARM v5.25 kết hợp STM32CubeMX; chưa tích hợp hệ điều hành thời gian thực (RTOS).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng và so sánh giải pháp
| Tiêu chí kỹ thuật |
Giải pháp STM32F746G (Đồ án) |
Giải pháp Arduino Mega 2560 Shield |
Giải pháp Raspberry Pi 3 Model B |
| Kiến trúc vi xử lý |
ARM Cortex-M7 32-bit @ 216MHz |
AVR 8-bit @ 16MHz |
Quad Cortex-A53 64-bit @ 1.2GHz |
| Bộ nhớ Flash / RAM |
1 MB Flash / 340 KB SRAM |
256 KB Flash / 8 KB SRAM |
Thẻ MicroSD / 1 GB LPDDR2 |
| Độ trễ thời gian thực |
Deterministic (Cực thấp, vài $\mu s$) |
Thấp nhưng thiếu tài nguyên |
Không xác định (Hệ điều hành Linux) |
| Xử lý đồ họa |
LCD-TFT Controller + DMA2D hardware |
Bit-bang SPI / Không hỗ trợ phần cứng |
VideoCore IV 3D GPU |
| Mức tiêu thụ dòng điện |
$\approx 210\text{ mA}$ (MCU core) |
$\approx 80\text{ mA}$ |
$\approx 800 - 1200\text{ mA}$ |
| Chi phí triển khai (BOM) |
Tối ưu cho thiết bị nhúng công nghiệp |
Thấp nhưng năng lực rất hạn chế |
Cao, dư thừa tài nguyên cho game 2D |
Phân tích yêu cầu hệ thống (Mô hình MoSCoW)
- Must Have: Giao tiếp SPI đọc nút bấm tay cầm PS2 chu kỳ 20ms; giải mã MP3/WAV qua module VS1003; quét cảm ứng điện dung I2C; điều khiển LCD 480x272 qua bộ điều khiển LTDC tích hợp; 07 game hoạt động ổn định.
- Should Have: Đồng bộ hóa âm thanh nền theo từng sự kiện game; chuyển đổi linh hoạt giữa giao diện cảm ứng và tay cầm nút vật lý.
- Could Have: Tăng tốc phần cứng đổ màu với Chrom-ART Accelerator (DMA2D); lưu trữ điểm số cao vào bộ nhớ Flash nội.
- Won't Have: Kết nối không dây Bluetooth/Wi-Fi cho tay cầm; hỗ trợ xuất hình qua cổng HDMI ngoài.
Thiết kế kiến trúc phần cứng và sơ đồ kết nối
+-----------------------------------------------------------------------------------+
| SƠ ĐỒ PHÂN BỔ TÍN HIỆU ARDUINO HEADERS |
+-----------------------------------------------------------------------------------+
STM32F746G Discovery
+--------------------+
| Arduino Connectors |
+---------+----------+
|
+----------------------------+----------------------------+
| (SPI2 Bus & Control) | (Power & Reset)
v v
+--------------------+ +--------------------+
| D13 (PI1) - SCK |---> SPI Clock chung | +5V (CN6-Pin5) |
| D12 (PB14) - MISO |<--- Data In (PS2/VS1003) | +3V3 (CN6-Pin4) |
| D11 (PB15) - MOSI |---> Data Out (Command) | GND (CN6-Pin6/7) |
| D6 (PH6) - ATT |---> PS2 Chip Select | NRST (CN6-Pin3) |
| D7 (PI3) - XDCS |---> VS1003 Data Select +--------------------+
| D8 (PI2) - XCS |---> VS1003 Command Select
| D9 (PA15) - DREQ |<--- VS1003 Data Request
+--------------------+
Bảng ánh xạ kết nối phần cứng chi tiết
| Chân ngoại vi |
Chân Arduino Header |
Chân STM32F746 |
Chức năng kỹ thuật |
| PS2 CLK |
D13 (CN7) |
PI1 |
Xung nhịp đồng bộ SPI2_SCK (100–500 kHz) |
| PS2 DATA |
D12 (CN7) |
PB14 |
Dữ liệu nút bấm trả về SPI2_MISO (Open-drain, Pull-up 10k$\Omega$) |
| PS2 CMD |
D11 (CN7) |
PB15 |
Lệnh điều khiển gửi từ MCU SPI2_MOSI |
| PS2 ATT |
D6 (CN4) |
PH6 |
Tín hiệu Slave Select cho tay cầm PS2 (Active LOW) |
| VS1003 SCLK |
D13 (CN7) |
PI1 |
Xung clock dữ liệu SPI2_SCK |
| VS1003 MOSI |
D11 (CN7) |
PB15 |
Dữ liệu luồng MP3 / Lệnh cấu hình |
| VS1003 MISO |
D12 (CN7) |
PB14 |
Đọc thanh ghi trạng thái VS1003 |
| VS1003 XCS |
D8 (CN4) |
PI2 |
Chip Select cho thanh ghi lệnh (SCI) |
| VS1003 XDCS |
D7 (CN4) |
PI3 |
Chip Select cho luồng dữ liệu âm thanh (SDI) |
| VS1003 DREQ |
D9 (CN5) |
PA15 |
Data Request ngắt (Mức HIGH: Sẵn sàng nhận 32 bytes) |
| Audio Amp IN |
Jack 3.5mm |
Analog Out |
Tín hiệu âm thanh sau giải mã đưa vào LM386 |
Tính toán công suất nguồn cấp
Tổng cường độ dòng điện tiêu thụ định mức của toàn hệ thống được tính toán theo công thức:
$$\sum I = I_{\text{MCU}} + I_{\text{PS2}} + I_{\text{VS1003}} + I_{\text{Loa}}$$
Trong đó:
- $I_{\text{MCU}} = \frac{P_{\text{core}}}{U} = \frac{690\text{ mW}}{3.3\text{ V}} \approx 210\text{ mA}$
- $I_{\text{PS2}} \approx 300\text{ mA}$ (Chế độ quét nút bấm & mô-tơ rung)
- $I_{\text{VS1003}} \approx 800\text{ mA}$ (Dòng tức thời khi giải mã đa luồng)
- $I_{\text{Loa}} = \sqrt{\frac{P_{\text{out}}}{R_{\text{load}}}} = \sqrt{\frac{1\text{ W}}{4\ \Omega}} = 500\text{ mA}$
$$\sum I = 210 + 300 + 800 + 500 = 1810\text{ mA} = 1.81\text{ A}$$
Do đó, mạch yêu cầu bộ nguồn xung DC 5V với dòng tải tối thiểu $\ge 2.0\text{ A}$ để đảm bảo độ sụt áp $< 5%$ khi toàn bộ hệ thống hoạt động ở công suất đỉnh.
Implementation và kết quả
Quy trình phát triển và thuật toán cốt lõi
+-----------------------------------------------------------------------------------+
| VÒNG LẶP ĐIỀU KHIỂN CHÍNH (MAIN ENGINE LOOP) |
+-----------------------------------------------------------------------------------+
|
v
+--------------------+
| Khởi tạo ngoại vi |
| (LTDC, SPI, SD) |
+----------+---------+
|
v
+--------------------------------+
| Đọc trạng thái tay cầm PS2 | <-----------------+
| (Gửi 0x01, 0x42 qua SPI2) | |
+----------------+---------------+ |
| |
v |
+--------------------------------+ |
| Đọc tọa độ cảm ứng điện dung | |
| (I2C4 Polling / Interrupt) | |
+----------------+---------------+ |
| |
v |
+--------------------------------+ |
| Cập nhật trạng thái Logic Game| |
| (Xử lý va chạm, tọa độ sprite)| |
+----------------+---------------+ |
| |
v |
+--------------------------------+ |
| Kiểm tra bộ đệm âm thanh | |
| (DREQ == HIGH -> Gửi 32 bytes)| |
+----------------+---------------+ |
| |
v |
+--------------------------------+ |
| Render đồ họa ra màn hình LCD | |
| (Frame Buffer 480x272) | |
+----------------+---------------+ |
| |
+-----------------------------------+
1. Thuật toán giao tiếp và đọc dữ liệu nút bấm Sony DualShock 2
Tay cầm PS2 hoạt động theo giao thức SPI truyền bit có trọng số thấp trước (LSB First). Quá trình đọc trạng thái nút bấm diễn ra thông qua việc gửi khung truyền 5-byte thăm dò chuẩn:
/**
* @brief Đọc trạng thái các nút bấm từ tay cầm Sony DualShock 2 qua SPI2
* @param pDataBuffer: Con trỏ mảng 2 byte lưu trạng thái nút
* @retval 0: Thành công, 1: Lỗi timeout
*/
uint8_t PS2_ReadButtons(uint8_t *pDataBuffer) {
uint8_t cmd_poll[5] = {0x01, 0x42, 0x00, 0x00, 0x00};
uint8_t rx_data[5] = {0};
// Kéo chân Attention (PH6) xuống LOW để chọn Slave PS2
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_RESET);
DWT_Delay_us(20);
// Truyền nhận 5 byte cấu hình và dữ liệu
for (uint8_t i = 0; i < 5; i++) {
HAL_SPI_TransmitReceive(&hspi2, &cmd_poll[i], &rx_data[i], 1, 10);
DWT_Delay_us(10);
}
// Kéo Attention lên HIGH để kết thúc phiên giao tiếp
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_6, GPIO_PIN_SET);
// Kiểm tra phản hồi nhận diện tay cầm: 0x41 (Digital) hoặc 0x73 (Analog)
if (rx_data[1] == 0x41 || rx_data[1] == 0x73) {
pDataBuffer[0] = rx_data[3]; // Byte 4: Nút điều hướng (Up, Down, Left, Right, L3, R3)
pDataBuffer[1] = rx_data[4]; // Byte 5: Nút chức năng (X, O, Triangle, Square, L1, R1)
return 0;
}
return 1; // Lỗi truyền thông
}
2. Thuật toán truyền dữ liệu âm thanh MP3 đến VS1003
Việc giải mã âm thanh nền trong game được thực hiện bằng cách nạp liên tục từng khối 32-byte dữ liệu nhị phân vào bộ đệm SDI của VS1003 mỗi khi chân DREQ (PA15) được kích hoạt ở mức logic 1:
/**
* @brief Truyền luồng dữ liệu MP3 từ thẻ nhớ sang IC giải mã VS1003
* @param filePtr: Con trỏ file FatFs
* @retval None
*/
void VS1003_FeedMusicStream(FIL *filePtr) {
uint8_t audioBuffer[32];
UINT bytesRead = 0;
// Kiểm tra VS1003 đã sẵn sàng nhận khối dữ liệu mới chưa
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15) == GPIO_PIN_SET) {
if (f_read(filePtr, audioBuffer, 32, &bytesRead) == FR_OK && bytesRead > 0) {
// Kéo chân XDCS (PI3) xuống LOW để ghi dữ liệu âm thanh SDI
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi2, audioBuffer, bytesRead, 10);
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_3, GPIO_PIN_SET);
} else {
// Quay lại đầu tập tin để phát lặp lại (Loop Playback)
f_lseek(filePtr, 0);
}
}
}
3. Thuật toán kiểm tra thắng thua Game Cờ Caro (Ma trận 9x9)
Thuật toán quét 4 hướng (ngang, dọc, 2 đường chéo) từ tọa độ nước đi vừa đánh $(x_0, y_0)$ với độ phức tạp $O(1)$, tối ưu tài nguyên tính toán:
/**
* @brief Kiểm tra chuỗi 5 quân cờ liên tiếp từ vị trí (r, c)
* @param board: Ma trận bàn cờ 9x9 (0: Trống, 1: X, 2: O)
* @param r: Chỉ số hàng (0-8), c: Chỉ số cột (0-8)
* @param player: Giá trị quân cờ (1 hoặc 2)
* @retval 1 nếu thắng cuộc, 0 nếu chưa thắng
*/
uint8_t Caro_CheckWin(uint8_t board[9][9], int8_t r, int8_t c, uint8_t player) {
const int8_t dx[4] = {1, 0, 1, 1};
const int8_t dy[4] = {0, 1, 1, -1};
for (uint8_t dir = 0; dir < 4; dir++) {
uint8_t count = 1;
// Quét theo chiều dương
for (int8_t step = 1; step < 5; step++) {
int8_t nr = r + dx[dir] * step, nc = c + dy[dir] * step;
if (nr >= 0 && nr < 9 && nc >= 0 && nc < 9 && board[nr][nc] == player) count++;
else break;
}
// Quét theo chiều âm
for (int8_t step = 1; step < 5; step++) {
int8_t nr = r - dx[dir] * step, nc = c - dy[dir] * step;
if (nr >= 0 && nr < 9 && nc >= 0 && nc < 9 && board[nr][nc] == player) count++;
else break;
}
if (count >= 5) return 1;
}
return 0;
}
Kết quả thử nghiệm và đánh giá thực tế
+-----------------------------------------------------------------------------------+
| KẾT QUẢ TRIỂN KHAI VÀ BENCHMARK HỆ THỐNG |
+-----------------------------------------------------------------------------------+
| Thông số kiểm tra | Giá trị thiết kế | Kết quả thực nghiệm (Bench) |
+----------------------------+-----------------------+-----------------------------+
| Tần số quét nút PS2 | 50 Hz (20 ms) | 50 Hz (19.85 ms) |
| Độ trễ màn hình cảm ứng | < 50 ms | 32.4 ms |
| Tốc độ khung hình Game | >= 50 FPS | 58.6 - 60.0 FPS |
| Tốc độ truyền dữ liệu SD | > 15 MB/s | 22.4 MB/s (SDMMC 4-bit) |
| Tỷ lệ giải mã MP3 lỗi | 0 % | 0 % (Bitrate 128 - 320kbps) |
| Mức sử dụng RAM tĩnh | < 300 KB | 184 KB / 340 KB (54.1%) |
| Điện áp ổn định VCC 3.3V | 3.30 V +/- 5% | 3.28 V (Full load) |
+----------------------------+-----------------------+-----------------------------+
Hệ thống đã triển khai thành công 07/07 trò chơi với trải nghiệm mượt mà:
- Cờ Caro: Chế độ 2 người chơi thao tác trực tiếp trên màn cảm ứng điện dung, tự động nhận diện chiến thắng và phát âm thanh tương ứng.
- Ball Bing Bong: Tái hiện gameplay Pong Arcade kinh điển, điều khiển thanh trượt bằng joystick analog của PS2 với xử lý va chạm góc chính xác.
- Flappy Bird: Xử lý đồ họa chuyển động đa lớp (Parallax Scrolling), mô phỏng gia tốc trọng trường vật lý cho nhân vật.
- Stick Hero: Căn chỉnh độ dài cây gậy theo thời gian giữ nút bấm, kiểm tra tiếp xúc điểm rơi chính xác theo pixel.
- Ai Là Triệu Phú: Hiển thị ngân hàng 50 câu hỏi từ thẻ nhớ, lồng ghép nhạc nền gốc định dạng MP3.
- Vòng Quay Sát Phạt: Mô phỏng vật lý chuyển động quay tròn giảm tốc góc với công thức giảm vận tốc $\omega(t) = \omega_0 - \alpha t$.
- Pika Pika: Trò chơi chạy vượt chướng ngại vật đòi hỏi phản hồi nhanh dưới 15ms qua nút bấm vật lý.
Đổi mới và đóng góp
- Phân kênh SPI thông minh không xung đột (Dual-Device Bus Multiplexing): Giải quyết triệt để xung đột giữa tay cầm PS2 (yêu cầu truyền nhận LSB First, tốc độ $< 500\text{ kHz}$) và IC giải mã VS1003 (yêu cầu MSB First, tốc độ lên tới $10\text{ MHz}$). Hệ thống tái cấu hình thanh ghi
SPI_CR1 theo thời gian thực trước mỗi phiên giao tiếp, tiết kiệm tài nguyên chân GPIO của MCU.
- Kiến trúc giải mã âm thanh phần cứng chuyên biệt: Việc sử dụng module VS1003 giải mã MP3/WAV độc lập giúp giải phóng 100% thời gian xử lý DSP của nhân ARM Cortex-M7, cho phép MCU dành toàn bộ băng thông cho pipeline render đồ họa 60 FPS.
- Giảm thiểu chi phí phần cứng (BOM Cost Optimization): Giảm giá thành sản xuất nguyên mẫu xuống 45% so với các giải pháp máy chơi game mini sử dụng máy tính nhúng Single Board Computer (Raspberry Pi/Odroid), đồng thời loại bỏ nguy cơ hỏng hệ điều hành khi mất nguồn đột ngột.
Ứng dụng thực tế và triển khai
Khả năng ứng dụng
- Thiết bị học tập chuyên sâu (STEM & Embedded Lab Kit): Làm giáo cụ trực quan cho các môn học Kiến trúc Máy tính, Vi điều khiển nâng cao, và Xử lý Tín hiệu Số tại các trường đại học khối kỹ thuật.
- Hệ thống điều khiển công nghiệp HMI: Kiến trúc ghép nối có thể chuyển đổi thành giao diện điều khiển máy móc công nghiệp tích hợp âm thanh cảnh báo và bảng điều khiển cảm ứng.
- Máy giải trí Arcade độc lập: Lắp đặt trong các không gian công cộng, khu vui chơi mini mà không đòi hỏi bảo trì phần mềm phức tạp.
+-----------------------------------------------------------------------------------+
| LỘ TRÌNH TRIỂN KHAI VÀ THƯƠNG MẠI HÓA |
+-----------------------------------------------------------------------------------+
Tháng 1-3 Tháng 4-6 Tháng 7-9 Tháng 10-12
+------------+ +------------+ +------------+ +------------+
| Hoàn thiện | ====> | Thiết kế | ====> | Tích hợp | ====> | Đóng gói |
| Firmware & | | Shield PCB | | FreeRTOS & | | Vỏ Acrylic |
| 7 Game | | Chuẩn Hóa | | Bluetooth | | & Phổ biến |
+------------+ +------------+ +------------+ +------------+
Phân tích chi phí và hiệu quả đầu tư (Bill of Materials)
| Linh kiện / Hạng mục |
Số lượng |
Đơn giá ước tính (VND) |
Tỷ trọng chi phí |
| Kit STM32F746G-Discovery |
01 |
1,450,000 |
70.7 % |
| Module giải mã âm thanh VS1003 |
01 |
160,000 |
7.8 % |
| Tay cầm Sony DualShock 2 |
01 |
150,000 |
7.3 % |
| Mạch khuếch đại LM386 + Loa 3W |
01 |
45,000 |
2.2 % |
| Mạch in PCB mở rộng + Header |
01 |
95,000 |
4.6 % |
| Nguồn Adapter 5V - 2A |
01 |
70,000 |
3.4 % |
| Khung vỏ mica cắt laser |
01 |
80,000 |
3.9 % |
| Tổng chi phí phần cứng |
|
2,050,000 VND |
100 % |
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Vấn đề kết nối vật lý: Tay cầm PS2 sử dụng chuẩn có dây giới hạn khoảng cách người chơi; dây kết nối qua header có thể suy hao tín hiệu nếu dây dẫn kéo dài.
- Cơ chế đồ họa: Chưa khai thác tối đa bộ gia tốc phần cứng Chrom-ART Accelerator (DMA2D) để vẽ các sprite hoạt hình phức tạp mà vẫn sử dụng các hàm vẽ điểm (pixel-by-pixel) cho một số hiệu ứng cơ bản.
- Cấu trúc mã nguồn: Toàn bộ chương trình chạy trong một vòng lặp tuần hoàn (
while(1)), chưa có RTOS để phân chia mức độ ưu tiên giữa luồng đọc nút bấm, phát âm thanh và dựng hình.
Hướng phát triển tiếp theo
- Nâng cấp module giao tiếp tay cầm không dây qua sóng vô tuyến 2.4 GHz hoặc Bluetooth HID.
- Chuyển đổi mã nguồn sang nền tảng hệ điều hành thời gian thực FreeRTOS để tách luồng xử lý GUI và luồng nạp âm thanh thành 2 Tasks độc lập.
- Tích hợp thêm các bộ giả lập máy chơi game cổ điển (NES, GameBoy) tận dụng sức mạnh xử lý tính toán của lõi ARM Cortex-M7 216MHz.
Đối tượng hưởng lợi
- Sinh viên ngành Kỹ thuật Điện tử / Nhúng / IoT: Tiếp cận mã nguồn mẫu về kỹ thuật ghép kênh bus SPI, xử lý màn hình TFT-LCD màu và đọc cảm ứng điện dung trên nền tảng vi điều khiển cao cấp STM32F7.
- Kỹ sư phát triển sản phẩm HMI: Tham khảo sơ đồ nguyên lý phần cứng shield mở rộng và giải pháp giảm tải xử lý âm thanh thời gian thực.
- Nhà giáo dục / Giảng viên: Sử dụng đề tài làm tài liệu tham khảo cho các môn học Đồ án Thiết kế Hệ thống Nhúng, Vi điều khiển ARM.
Câu hỏi thường gặp
1. Yêu cầu nguồn điện thực tế để vận hành hệ thống ổn định là gì?
Hệ thống yêu cầu nguồn cấp DC 5V với dòng định mức tối thiểu 2A. Do module VS1003 và mạch khuếch đại âm thanh LM386 tạo ra dòng đỉnh tức thời khi phát các dải âm trầm (Bass), việc sử dụng cổng USB máy tính (giới hạn 500mA) có thể gây sụt áp làm reset chip STM32.
2. Làm thế nào để giải quyết xung đột khi tay cầm PS2 và VS1003 dùng chung bus SPI2?
Hệ thống sử dụng các đường Chip Select riêng biệt: PH6 (PS2 ATT), PI2 (VS1003 XCS cho lệnh) và PI3 (VS1003 XDCS cho dữ liệu). Trước khi giao tiếp với PS2, cấu hình SPI2 ở chế độ LSB First, tốc độ clock 250kHz. Khi nạp dữ liệu cho VS1003, cấu hình lại SPI2 sang MSB First với tốc độ clock lên tới 8MHz.
3. Hệ thống có thể mở rộng thêm các định dạng âm thanh khác không?
IC VS1003 hỗ trợ giải mã phần cứng trực tiếp các định dạng MP3, WMA, WAV, và MIDI. Để phát các tệp âm thanh mới, chỉ cần lưu tệp đúng định dạng vào thẻ nhớ MicroSD theo hệ thống tập tin FAT32.
4. Hiệu năng vẽ giao diện trên màn hình 480x272 có bị giật/lag khi game chuyển động nhanh không?
Bộ điều khiển LTDC tích hợp sẵn trên vi điều khiển STM32F746NGH6 tự động quét dữ liệu từ bộ nhớ SRAM hiển thị lên màn hình LCD mà không làm gián đoạn chu kỳ CPU, duy trì tốc độ khung hình ổn định ở mức 58 - 60 FPS.
5. Làm sao để nạp thêm các game mới vào hệ thống?
Cấu trúc phần mềm được module hóa thành các hàm logic riêng biệt. Lập trình viên chỉ cần khai báo hàm khởi tạo và hàm vòng lặp game mới trong main.c, đồng thời bổ sung một phần tử lựa chọn vào menu chính của tay cầm PS2.
Kết luận
Đồ án "Thiết kế Game Mini trên Kit STM32F746G_Discovery" đã nghiên cứu, thiết kế và chế tạo thành công một máy chơi game nhúng đa năng với độ hoàn thiện cao. Đề tài khẳng định năng lực ứng dụng chuyên sâu dòng vi điều khiển 32-bit hiệu năng cao ARM Cortex-M7 trong việc làm chủ các giao tiếp ngoại vi phức tạp (SPI, SDMMC, I2C, LTDC), kết hợp thành công giữa thao tác điều khiển cơ học từ tay cầm Sony DualShock 2 với giao diện cảm ứng điện dung hiện đại và âm thanh đa âm chất lượng cao. Đây là nền tảng kỹ thuật vững chắc mở ra nhiều hướng ứng dụng trong thiết kế thiết bị giải trí cầm tay và hệ thống điều khiển công nghiệp thông minh.