復古游戲掌機
60 多年過去了,盡管輝光管已經停產,有很多工程師仍然對它情有獨鐘。我用 8 塊液晶顯示屏制作了一個擬輝光管時鐘,感受復古元素的美感,表達對過去經典的敬意。
這是一款基于ESP32的開源復古游戲掌機,是很多年前的一個開源項目,我在開源項目基礎上做了一些優化,更改了顯示屏硬件,重新繪制了PCB,對原作者表示感謝!
復古游戲掌機使用Arduino IDE編程,游戲文件存放于存儲卡中,支持游戲選擇,理論游戲數量有很多,可以暢玩很多經典游戲,是一款兒時夢寐以求的指尖游戲機,一秒找回童年記憶。
演示視頻
材料介紹
主控
復古游戲掌機主控采用 ESP32-WROVER-E 模 塊( 見 圖 1),ESP32-WROVER-E 采用的芯片是ESP32 系列的 ESP32-D0WD-V3。ESP32-D0WD-V3芯片具有可擴展、自適應的特點。兩個 CPU 可以被單獨控制。CPU 時鐘頻率的調節范圍為 80~240 MHz,集成了豐富的外設,包括電容式觸摸傳感器、霍爾傳感器、Micro SD 卡接口、以太網 接 口、 高 速 SPI、UART、I2S和 IPC 等。模塊集成了傳統藍牙、低功耗藍牙和 Wi-Fi,具有廣泛的用途。
![]()
圖 1 ESP32-WROVER-E 模塊
選 用 ESP32-WROVER-E 模塊除了功能強大,還有一個重要原因是這個模塊擁有片外內存區 —— PSRAM,對于游戲文件超過 1MB 的情況就需要片外內存區了。這個模塊PSRAM 大小有 8MB,有 4MB 可用,足夠 1M 大小的游戲文件運行了。
液晶顯示屏
顯示屏使用 3.2 英寸液晶顯示屏( 見 圖 2), 分 辨 率 為 320 像素 ×240 像 素, 驅 動 芯 片 型 號 為ILI9341,ILI9341 驅 動 芯 片 提 供 8位 /9 位 /16 位 /18 位的并行 MCU 數據 總 線,6 位 /16 位 /18 位 RGB 接口數據總線以及 3 線 /4 線 SPI 接口,本項目采用通信方式為 4 線 SPI,接口方式為 40Pin 插接式。
![]()
圖 2 3.2 英寸液晶顯示屏
無聲貼片開關
復古游戲掌機按鍵采用無聲 貼 片 開 關( 見 圖 3), 大 小 為6mm×6mm×5mm,這款開關按力均勻,手感柔軟均勻舒適,壽命在 20萬次以上。
![]()
圖 3 無聲貼片開關
電路設計
主控部分
ESP32-WROVER-E 模 塊 的引腳分配給按鍵、顯示屏和存儲卡模塊,主控電路如圖 4 所示。
![]()
圖 4 主控電路
下載電路
本項目使用 CH340C 芯片,該芯片內置晶體振蕩器,可以省去晶體振蕩器電路,價格便宜,電路簡單,配合三極管可實現自動下載功能,下載電路如圖 5 所示。
![]()
圖 5 下載電路
供電及穩壓電路
供電電路使用了 2 個 Micro USB接口,方便后期從上下兩個方向供電。穩壓電路使用 LM1117S-3.3 芯片,這是一種常見的穩壓芯片,價格便宜,電路簡單,供電及穩壓電路如圖6所示。
![]()
圖 6 供電及穩壓電路
存儲電路
掌機存儲電路的卡座采用的是市面上常見的 Micro SD 卡卡座,體積小,通信接口為標準 SPI 接口,通過文件系統及 SPI 接口驅動程序,單片機系統即可完成 Micro SD 卡內的文件讀寫,存儲電路如圖 7 所示。
![]()
圖 7 存儲電路
鋰電池充電電路
鋰電池充電電路里使用了TP4056 芯片,TP4056 是一款完整的單節鋰電池恒定電流 / 恒定電壓線性充電芯片。充電電壓固定在 4.2V,而充電電流可通過一個電阻進行外部設置,在充電狀態時,充電指示燈 LED4(紅色)亮;充滿電后 LED4 滅,待機指示燈 LED3(綠色)亮。TP4056 芯片采用 ESOP8 封裝,配合較少的外圍元器件使其非常適用于便攜式產品,并且適合給 USB 電源以及適配器電源供電,鋰電池充電電路如圖 8 所示。
![]()
圖 8 鋰電池充電電路
音頻電路
音頻電路中使用了一個8Ω/1W、直徑為 13mm 的揚聲器用于播放游戲背景音樂,用一個開關控制揚聲器是否工作,電路中留出兩路供電電路來選擇揚聲器的音量,音頻電路如圖 9所示。這只是個簡單的音頻電路,俗話說“聽個響”,但是這種復古音質正好和復古游戲呼應,相得益彰。
![]()
圖 9 音頻電路
顯示屏驅動電路中采用了一個0.5mm 間距 FPC 上接抽拉式貼片連接器,通過短接開關可選擇 4 線SPI 連接方式,電路中還引出了兩組顯示屏接口,接口順序和市面上其他常見顯示屏模塊的引腳順序相同,通過修改程序,可以兼容更多 4 線SPI 驅動的顯示屏,顯示屏驅動電路如圖 10 所示。
![]()
圖 10 顯示屏驅動電路
PCB設計
為了方便電路板打樣,我把電路板的長寬都限制在邊長為 10cm 的正方形里,所以 PCB 設計時,所有元器件采用旋轉 45°放置的方式,充分利用正方形的對角線長度,液晶顯示屏居中放置,操作按鍵在顯示屏兩側。PCB整體布局如圖 11 所示,PCB 整體效果如圖 12 所示。
![]()
圖 11 PCB 整體布局
![]()
圖 12 PCB 整體效果
程序介紹
編程環境
使用 Arduino IDE 1.8.16 版本,軟件中的開發板管理器 ESP32 庫版本為 1.0.6(見圖 13)。
![]()
圖 13 Arduino IDE 版本以及 ESP32 庫版本
源程序說明
源程序文件包含如下內容。
● esp32gamepad.ino :主文件。
● controller.cpp:控 制 器, 主要是按鍵類型和搖桿類定義。
● display.cpp:顯 示 屏 驅 動文件。
● hw_config.h:文件系統定義、音頻引腳及按鍵引腳定義。
● osd.c :操作系統處理函數。
● sound.c:音頻系統函數。
一般只需要修改 esp32gamepad.ino、display.cpp、hw_config.h 這 3個文件即可。
程序編寫
1. 導入庫和選擇開發板類型
這 個 項 目 中 使 用 了 Arduino_GFX 庫 和 arduino-nofrendomaster 庫,需要將下載好的庫文件放置在 Arduino IDE 的 libraries 文件夾中,否則會編譯失敗。
Arduino 編譯時,開發板類型選擇 “ESP32 Wrover Module”( 見圖 14)。
![]()
圖 14 選擇開發板類型
2. 自定義按鍵
按照原理圖對游戲掌機的按鍵進行定義,如程序 1 所示。
![]()
顯示屏移植
原 項 目 使 用 的 是 ST7789 驅 動的 2.4 英 寸 液 晶 顯 示 屏, 我 這 里 改成 ILI9341 驅動的 3.2 英寸液晶顯示屏,所以程序中需要修改,需要注意的是原項目中定義總線類型的語句中,IPS 是否為高清屏的內容改成Arduino_ILI9341 驅動后需要刪除,因為庫文件中沒有相關的定義,不修改編譯無法通過,原項目相關程序如程序 2 所示,移植后的程序如程序3所示。如果需要其他類型顯示屏,可在 Arduino_GFX\sr\display 這個文件夾中查找,有列的就是支持的。
![]()
![]()
![]()
復古游戲掌機的使用
(1)準備一張 Micro SD 卡,格式化成 FAT32 格式,將提前下載好的擴展名是 .nes 的游戲文件復制到存儲卡根目錄,游戲名用英文。
(2)開機后顯示屏上如果提示“Filesystem mount failed! try to restart.”,說明存儲卡掛載失敗,可以嘗試斷電重啟,若兩三次重啟后仍然無法使用,請檢查存儲卡或者電路。
(3) 開 機 存 儲 卡 掛 載 成 功 后會顯示一張圖片,顯示屏上方顯示“waiting”字樣。
(4)在“waiting”字樣界面下,使用 left 和 right 按鍵可以調整亮度,立即生效,亮度最小 10,最大 255,支持重啟后記住之前的設定值。
(5)在“waiting”字樣界面下,按一次 A 鍵,則會瀏覽根目錄文件,如果不是游戲文件,則會顯示“Not a game file, please select again.”,需要繼續按 A 鍵繼續選擇,直到出現.nes 的游戲文件。
(6)出現 .nes 游戲文件名顯示后,按 mode 按鍵確認即可開始游戲。
(7)進入游戲后根據游戲中的按鍵提示進行操作即可。
成果展示
制作完成的復古游戲掌機如圖 15所示。
![]()
![]()
圖 15 NES 游戲掌機
復古游戲掌機做完后,我迫不及待打開了小時候玩的第一個游戲,伴隨著熟悉的背景音樂,以一種老玩家從容不迫的心態無傷通過了第一關,一切都是那么熟悉,此時手里捧著的不再是一臺游戲機,而是童年時期的夢想。
現在,畫面震撼、玩法多樣的游戲每年都會推陳出新,自制游戲機項目每年也在不斷革新,我在自己能力范圍內制作了屬于自己的復古游戲掌機,也算是還了一個“童年債”。每次玩起這些老游戲,我總能想起那些遙遠的、計算機還沒普及的寒暑假,打開游戲機,選擇好上次沒能通關的游戲,那時候我最不缺的就是時間。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.