日本遊戲大廠「任天堂」(Nintendo)在去年(2016.09.30)發表一款名為「迷你任天堂」(Mini Famicom)的遊戲主機,其外觀仿造自家在上世紀 1983 年推出的遊戲銘機「紅白機」的經典造型並等比例縮小,內建 30 款曾經發行的紅白機遊戲,日幣定價僅 5,980 元,於 2016 年 11 月 12 日僅在日本上市就一機難求,成功製造話題,台灣甚至有少數水貨(ㄐㄧ ㄢ)商把日幣定價當台幣賣。任天堂對這款遊戲主機並非限量發行,入手的玩家越來越多,有人拆解得知其架構是一顆四核心 Cortex A7 搭建定製版 Linux 系統的「模擬器方案」(即將開賣的 mini SFC 也使用相同的主板),並非硬體重製復刻方案,以及手把太小與線太短導致遊戲體驗太差、復刻精緻度不足等因素,收藏指數偏低,熱度便逐漸下滑。
官方版的復刻遊戲主機採用模擬器方案也說明了長久以來的現實:家裡的紅白主機或遊戲卡匣至今大多已除役,不過拜科技所賜,玩家不須屈就於紅白主機的硬體故障或限制,只須透過「模擬器」就能讓讓過去的經典遊戲體驗得以繼續保存,模擬器所代表的「數位資產保存」意義早已遠超出助長盜版的爭議,對官方來說,推出復刻版小主機也省去重建舊硬體架構的開發成本。就我個人的經驗,就連 2005 年的 Nokia 6680 這款搭載 Symbian Series 60 作業系統的手機上也有紅白機的模擬器,更不用說其他一狗票的 3C 產品如電腦、PDA(HP iPAQ h4150)、遊戲主機 DreamCast、PlayStation 2、XBox、Wii、掌機 PSP、手機 iPhone / iPad 、SAMSUNG Note 3 等,通通都有紅白機模擬器。這些 3C 裝置有個共通點:幾乎都有光碟、或記憶卡等這些通用的資料媒體,只要找對紅白機模擬器軟體,透過資料媒體就可在裝置內實現運行紅白機模擬器玩機遊戲。然而這些 3C 產品的原始市場價格通通都不便宜,上述這些設備的原始價格以 PSP 最便宜,但也是 6000 元起跳。
既然接觸模擬器的歷史很久了,且模擬紅白機的裝置需求不高,心裏不禁有個疑問:有沒有辦法自己打造一個成本低廉,且能運作遊玩紅白機遊戲的硬體裝置呢?
答案是肯定的!這篇文章就是要說明,怎樣利用便宜的單晶片系統(比上述 3C 產品更低階的裝置),親手製作能玩紅白機遊戲的裝置。
寫到這裡先說結論:這篇文章其實不能帶來好的紅白機遊戲體驗,而是學習用單晶片系統製作紅白遊戲機的過程紀錄。
最早我是參考這個教學影片,結果失敗了,多次卡關才發現是版本的問題,影片中的指令必須做一些修正。難度不高,但是已經跳離 Arduino IDE 的舒適圈,所以操作過程要留意細節,否則很容易失敗,這也是撰寫本文的主要目的。
主要硬體裝置
- 系統單晶片:NodeMCU-32S 開發板(使用 ESP-WROOM-32 模組)。台灣網拍目前的價格大約在 450 - 650 元之間,所以我從對岸淘來的,39 + 6(境內運費) = 45 (RMB),約台幣 208 元(轉寄台灣運費另計)
- TFT LCD螢幕:ILI9341 驅動 320x240 SPI 介面,台幣 280 元。
- 連接上述兩元件的杜邦線若干。
附加選配
- 小喇叭/蜂鳴器
- PlayStation 2 遊戲搖桿
操作環境準備
- 一台安裝並運行 Ubuntu 64-bit 16.04 作業系統且與 Internet 連線的電腦:本篇主要以 Ubuntu 為操作範例,其實 Windows / macOS 也可以。
- micro USB 連接線:用來連接與供電給 NodeMCU-32S 開發板。
- 任何一款容量小於 512 KB 的紅白機遊戲 ROM 檔,檔案太大可能會有問題。
操作方法大致可區分為三個項目
- 安裝 Toolchain 與 ESP-IDF。本篇文章僅概略帶過,詳細教學可參考原廠的線上說明文件。
- 下載紅白機模擬程式原始碼、編譯測試。
- 連接裝置,編譯設定並上傳程式碼與遊戲 ROM 檔至單晶片。
接下來就要進入說明重點了。
先在「家目錄」底下建立一個叫 esp 的目錄名稱,之後所有的操作都會在這個目錄下進行。
- 安裝 Toolchain 與 ESP-IDF
(1) 安裝 Toolchain
Toolchain 叫做「工具鍊」,在個人電腦上開發給另一種 CPU 架構運作的軟體時,就必須安裝這個工具軟體。不同的晶片就有不同的 Toolchain,通常由晶片廠商提供。
有兩種安裝方式:直接下載 Binary(編譯後的二進位檔)或編譯原始碼(教學),用直接下載的方式就行了,省事也省時間。
下載位置:
https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-61-gab8375a-5.2.0.tar.gz
若是下載官方線上文件的版本,最後會在編譯時失敗。解開依照目錄結構放在 ~esp/ 底下。直接用拖拉的省事。
(2) 安裝 ESP-IDF
ESP-IDF 全名叫做 Espressif IoT Development Framework,是晶片開發商上海樂鑫(Espressif)為其系統單晶片產品 ESP32 提供的 SDK (開發套件程式庫),這邊一定要挑到對的版本,不然最後也會失敗。操作方式如下:
(2.1) 開啟一個終端機視窗,安裝基本套件
sudo apt-get install git wget make libncurses-dev flex bison gperf python python-serial cutecom
等一下跑完,執行
cd esp
git clone -b release/v2.1 --recursive https://github.com/espressif/esp-idf.git
會下載一堆東西,等跑完
再執行以下指令,強迫程式碼依照版本進行同步
cd esp-idf
git submodule update --init --recursive
這樣 ESP-IDF 也安裝完成了。回到上一層,執行指令
cd ..
另一種下載建置 ESF-IDF v2.1 的方法:直接到這裡下載 esp-idf-v2.1.zip,解開之後把目錄名稱改回 esp-if ,放到 ~/esp 底下。
- 下載紅白機模擬程式原始碼、編譯測試。
繼續原來的終端機視窗,執行
git clone https://github.com/benjenq/esp32-nesemu.git (註:已更新至新版支援 ESP-IDF v3.0 dev,詳見文章最後說明)
然後執行 ls 查看是否把所有的檔案都準備好了:
也就是說在 ~/esp/ 底下要有三個目錄匣:esp32-nesemu、esp-if、xtensa-esp32-elf。三者缺一不可。如果有少的,或是目錄的位置結構不一樣的情況,表示上面的動作有錯誤,請重新檢查一遍。
確認三個目錄都有之後,繼續在終端機視窗內,執行以下的指令:
export PATH="$PATH:$HOME/esp/xtensa-esp32-elf/bin"
export IDF_PATH=~/esp/esp-idf
alias get_esp32='export PATH="$PATH:$HOME/esp/xtensa-esp32-elf/bin"'
cd esp32-nesemu
git checkout 89c1f7d04fcc86a30942698340110b51a7e4bfc2
make
正常來說會一路跑到結束
這表示先前的動作全都沒有出錯,編譯模擬器程式的環境沒有任何問題。就可以把環境參數寫到帳號的設定。輸入
sudo usermod -a -G dialout $USER
nano ~/.profile
然後把以下三行貼到檔案最後面
export PATH="$PATH:$HOME/esp/xtensa-esp32-elf/bin"
export IDF_PATH=~/esp/esp-idf
alias get_esp32='export PATH="$PATH:$HOME/esp/xtensa-esp32-elf/bin"'
接著就可以按 Ctrl + O 存檔(詢問檔名 .profile 直接 Enter),Ctrl + X 離開回到剛剛的終端機 Shell 環境。接下來要執行一個最重要的步驟:
「電腦重新開機」
讓上述的環境變數與權限設定生效。
另一方面,把電腦、 NodeMCU-32S 開發版、ILI9431 TFT LCD、喇叭、PlayStation 1/2 遊戲搖桿等裝置,依照以下步驟逐一連接起來。
- 連接裝置,編譯設定並上傳程式碼與遊戲 ROM 檔至單晶片。
由於我買到的 NodeMCU-32S 是 Ai Thinker 原廠窄版,腳位印在電路板下方,很不方便。
所以直接用 Espressif 官方提供的文件圖來比對:
依照以下腳位連接 TFT LCD 與 NodeMCU-32S
ILI 9341 TFT LCD | NodeMCU-32 GPIO |
MISO | 25 |
MOSI | 23 |
CLK(SCK) | 19 |
CS | 22 |
DC | 21 |
RESET | 18 |
LED(BackLight<背光>) | 5 |
VCC | 3.3V |
GND | GND |
如果有小喇叭/蜂鳴器
喇叭/蜂鳴器 | NodeMCU-32S GPIO |
+ | 26 |
- | GND |
如果有PlayStation 1/2 遊戲搖桿
PlayStation 1/2 Controller | NodeMCU-32S GPIO |
CLK(Clock) | 14 |
DAT(Data) | 27 |
ATT | 16 |
CMD(Command) | 2 |
VCC | 3.3V |
GND | GND |
若是像我一樣想拉出 PlayStation2 原廠搖桿埠腳位,又不想對原廠搖桿開腸破肚的話,可以買一條便宜的 PS2 搖桿轉 USB 的轉接線(賣場網址),接著把轉接線拆掉取出搖桿埠母座,拉出母座腳位與 ESP32 連接。不過接到 ESP32 的時候千萬要注意,上圖的腳位埠是 PS2 搖桿埠公座的標示,核對接腳時要把公座的順序轉成母座。
最後,用 microUSB 把 NodeMCU 與 Ubuntu 電腦連接起來。
回到 Ubuntu 電腦,前一個步驟重開機讓所有設定生效之後,開啟終端機視窗,輸入 printenv PATH 與 printenv IDF_PATH 查看環境變數有沒有設定好。PATH 要有 /esp/xtensa-esp32-elf/bin,IDF_PATH 要有 /esp/esp-idf。
最後就是編譯上傳的工作。輸入 cd ~/esp/esp32-nesemu 到 esp32-nesemu 之後,輸入 make menuconfig
就會出現編譯設定介面,我們可以透過這個介面設定來設定編譯後的系統單晶片韌體可具備哪些功能(如超頻、Wifi....)。
設定很多,只要檢查幾項就可以了:
Serial flasher config :連接埠是 /dev/ttyUSB0,鮑率 115200 (有時候更快會比較不穩),Flash size 4MB (視所買的開發版而定,NodeMCU-32S 基於 ESP-WROOM-32 模塊為 4MB )
Nofrendo ESP32-specific configuration:GPIO 腳位設定必須與實際連接的位置相符。
Partition Table:Custom partition table CSV,檔名是 partitions.csv
Compoment config:減少不必要的功能,ESP32-specific 裡面 CPU Frequency 設定在最高 240MHz
以上項目檢查完畢之後,可選擇 Exit 離開,若有更動內容的話會詢問存檔。
然後可以再 make 一次。執行 make flash 可以編譯後上傳。
不過 make flash 只有上傳模擬器韌體,並沒有遊戲 Rom 檔,所以這時候 TFT LCD 是閃爍的狀態,執行 cutecom 查看 Log 檔會發現模擬器找不到遊戲 ROM 檔就會自動重開機。
最後的工作是上傳一個遊戲 ROM 檔。上傳之前要先檢查上傳工具 flashrom.sh 裡面的設定是否正確。
繼續上個終端機視窗,在 ~esp/esp32-nesemu 底下,執行 nano flashrom.sh,檢查下圖中黃色定應 USB 埠為 ttyUSB0。上傳鮑率 為 115200*1,CTRL + O 存檔,CTRL + X 離開。
然後找一個手邊擁有的紅白機遊戲 ROM 檔,放到 ~/esp/esp32-nesemu 目錄下,執行
./flashrom.sh xxx.nes (遊戲ROM檔名)
這時候就可看到 LCD 螢幕正在運行遊戲畫面了(我用的是 TECMO 有名的遊戲「忍者龍劍傳(Ninja Ryuuken Den)」,遊戲影片)。如果有接搖桿跟喇叭的話,就可以遊玩和聽到遊戲音效。
後記&結論
從執行的速度看來還不錯,有掉格但不太嚴重,遊戲速度稍微比原實機偏快一點。音效方面,蜂鳴喇叭聽起來有點慘,雜音頗重。至於連接 PlayStation 2 搖桿的部分,剛開始使用杜邦線+麵包板時非常不穩定,常發生按下按鈕之後閃退重來、按鈕失靈、按鈕自動亂按亂跳等情況。後來自製了 MCU 底座,將所有的 GPIO 連接牢固之後,PS2 搖桿控制就恢復正常了,在這麼小的螢幕打電動,且還有一點點快動作,玩起來的遊戲體驗是:實驗的樂趣,遠遠大於實用性。
另外我也逐一嘗試了 CentOS,macOS,Windows,甚至於是 Raspberry Pi 3B (樹莓派 3B)的編譯方式,操作方法大致相同,只差別在如何建制出正常編譯的環境。Raspberry 3B 則因為沒有現成的 arm 版 Toolchain Binary(編譯後的二進位檔),得自行在樹莓派上編譯 Toolchain 原始碼,跑一次就得花上 170 分鐘,看來樹莓派並不適合拿來做粗工。
總歸來說是可以玩的,相信電源與元件配置經過適度優化後甚至能做成掌機,只是這次體驗並不好,幀數跳格失真,仍有待優化,2.4 吋螢幕玩起來非常考驗眼力。現階段若想實現「掌上型紅白機遊樂器」的目標,用 PSP 跑紅白機模擬器絕對是 100% 完勝,所以這個專題是拿來練習在 Arduino IDE 之外,用最正統的官方 ESP32 SDK (ESP-IDF) 開發建置的範例,而非真的去實現掌上型任天堂紅白機。在下一篇文章中,我會進一步說明如何在官方的 ESP32 SDK (ESP-IDF) 的基礎上,建置出一套友善的 ESP32 韌體開發環境。
至於類似官方迷你紅白機的遊戲體驗其實也有替代方案,樹莓派也是使用 USB 5V 供電與 HDMI 輸出,只要安裝專屬的模擬器作業系統(如 lakka),透過 USB 裝上 PlayStation 3/4 或 XBOX 360/One 的搖桿,體驗比迷你任天堂的迷你操控器還好一些。
esp32-nesemu 已更新至支援新版 esp-idf (v3.0-dev),所以上述步驟也必須更動:
1. 新版 Toolchain 下載位址:
- Linux:https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
- macOS: https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
2. Github 下載 esp-idf(v3.0-dev)指令
git clone --recursive https://github.com/espressif/esp-idf.git
3. 省略上述將 esp32-nesemu 恢復舊版的指令「git checkout 89c1f7d04fcc86a30942698340110b51a7e4bfc2」
2020.02.18 補充:
ESP-IDF 已經發展至 v4.0+,與 esp32-nesemu 並不相容。即使從 master 切回 release/v3.0 並執行 submodule update 更新之後,依然會發生編譯錯誤,經查(討論原文)切回舊版之後有些目錄仍必須手動清除。詳細操作方式如下:
$ cd ~/esp/esp-idf
$ git checkout v3.1
$ git fetch
$ git submodule update --init --recursive
$ git clean -fdx
$ git status
列出一堆 untracked 目錄之後,手動把目錄這些刪除。接著再回到 esp32-nesemu 編譯即可。
文章發表的九個月後,就真的有人把「自行製作紅白機遊樂器」的概念做成產品了。韓商 HardKernel 橫空出世,推出一款基於 ESP32 MCU 的掌上型電玩主機產品「ODROID-GO」。
這款掌上型採用容稍大 16MB Flash Momory 的 ESP32-WROVER 模組,內建 320x240 LCD 螢幕、電池、喇叭、microSD 讀卡機等周邊,除了任天堂紅白機之外,也可以玩 GameBoy / Gameboy Color / Game Gear / Gega Master System / ColecoVision 等復古電玩(模擬器原始碼),買來之後雖然需自行組裝與製作記憶卡,但電子部件已經整合在一張基板上,省去了大量自行土炮的工作。
價格為 32 鎂,若加上台灣運費 15 鎂,差不多在台幣 1,500 元內,價格是有點高。至於遊玩起來的感受如何?根據網路上的說法,掉幀、遊戲速度不正常的情況仍在,體驗還是比不上真正的掌機。
所以這款「ODROID-GO」產品,算是驗證了我先前所言「將 ESP32 做成掌機」的結論:除了多了一點「自行製作」的樂趣,其實遊戲體驗並不好。要便宜玩紅白機,樹莓派是最佳選擇,要用掌機完美體驗紅白機遊戲,找一台真正的掌機安裝紅白機模擬器才是最佳解法。(延伸閱讀:Game&Watch 掌上型任天堂紅白機)
留言列表