螢幕快照 2017-09-24 下午5.26.58

日本遊戲大廠「任天堂」(Nintendo)在去年推出了一款名為「迷你任天堂」(Mini Famicom)的遊戲主機,其外觀仿造自家在上世紀 1983 年推出的遊戲銘機「紅白機」的經典造型並等比例縮小,內建 30 款曾經發行的紅白機遊戲,日幣定價僅在 5980 元,於 2016 年 11 月 12 日僅在日本上市就一機難求,成功製造話題,台灣甚至有少數水貨(ㄐㄧ ㄢ)商把日幣定價當台幣賣。任天堂對這款遊戲主機並非限量發行,入手的玩家越來越多,有人拆解得知其架構是一顆四核心 Cortex A7 搭建定製版 Linux 系統運行模擬器的方案(即將開賣的 mini SFC 也使用相同的主板),以及手把太小與線太短導致遊戲體驗太差、復刻精緻度不足等因素,收藏指數偏低,熱度便逐漸下滑。

其實官方版的復刻遊戲主機也說明了長久以來的一件事:家裡的紅白主機或遊戲卡匣至今大多已除役,不過拜科技所賜,玩家不須屈就於紅白主機的硬體故障或限制,只須透過「模擬器」就能讓讓過去的經典遊戲體驗得以繼續保存,模擬器所代表的「數位保存」意義早已遠超出可能助長盜版的爭議。就我個人的經驗,就連 2005 年的 Nokia 6680 這款搭載 Symbian Series 60 作業系統的手機上也有紅白機的模擬器,更不用說其他一狗票的 3C 產品如電腦、PDA(HP iPAQ h4150)、遊戲主機 DreamCastPlayStation 2XBoxWii、掌機 PSP、手機 iPhone / iPad 、SAMSUNG Note 3 等,通通都有紅白機模擬器。這些 3C 裝置有個共通點:幾乎都有光碟、或記憶卡等這些通用的資料媒體,只要找對白機模擬器軟體,透過資料媒體就可在裝置內實現運行紅白機模擬器玩機遊戲。然而這些 3C 產品的原始市場價格通通都不便宜,原始價格 6000 元起跳(PSP主機)。

既然接觸模擬器的歷史很久了,且模擬紅白機的裝置需求不高,心裏不禁有個疑問:有沒有辦法自己打造一個成本低廉,且能運作遊玩紅白機遊戲的硬體裝置呢?

答案是肯定的!這篇文章就是要說明,怎樣利用便宜的單晶片系統(比上述 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/ 底下。直接用拖拉的省事。

xtensa  

(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

apt-get

等一下跑完,執行

cd esp
git clone -b release/v2.1 --recursive https://github.com/espressif/esp-idf.git

會下載一堆東西,等跑完

esp-idf

再執行以下指令,強迫程式碼依照版本進行同步

cd esp-idf
git submodule update --init --recursive

esp-idf-recursive

這樣 ESP-IDF 也安裝完成了。回到上一層,執行指令

cd ..

esp-idf-finish

另一種下載建置 ESF-IDF v2.1 的方法:直接到這裡下載 esp-idf-v2.1.zip,解開之後把目錄名稱改回 esp-if ,放到 ~/esp 底下。

esp-idf-v2.1 

- 下載紅白機模擬程式原始碼、編譯測試。

繼續原來的終端機視窗,執行

git clone https://github.com/benjenq/esp32-nesemu.git (註:已更新至新版支援 ESP-IDF v3.0 dev,詳見文章最後說明)

esp32-nesemuCode

然後執行 ls 查看是否把所有的檔案都準備好了:

螢幕快照 2017-09-24 下午6.47.36

也就是說在 ~/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

正常來說會一路跑到結束

esp32-nesemu

這表示先前的動作全都沒有出錯,編譯模擬器程式的環境沒有任何問題。就可以把環境參數寫到帳號的設定。輸入

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"'

profile

接著就可以按 Ctrl + O 存檔(詢問檔名 .profile 直接 Enter),Ctrl + X 離開回到剛剛的終端機 Shell 環境。接下來要執行一個最重要的步驟:

「電腦重新開機」

讓上述的環境變數與權限設定生效。

另一方面,把電腦、 NodeMCU-32S 開發版、ILI9431 TFT LCD、喇叭、PlayStation 1/2 遊戲搖桿等裝置,依照以下步驟逐一連接起來。

- 連接裝置,編譯設定並上傳程式碼與遊戲 ROM 檔至單晶片。

由於我買到的 NodeMCU-32S 是 Ai Thinker 原廠窄版,腳位印在電路板下方,很不方便。

NodeMCU-32S

所以直接用 Espressif 官方提供的文件圖來比對:

esp32_pinmap  

依照以下腳位連接 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

FTEK26RIR6IWFNI

如果有小喇叭/蜂鳴器

喇叭/蜂鳴器 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

PS2_Plug_Connections

若是像我一樣想拉出 PlayStation2 原廠搖桿埠腳位,又不想對原廠搖桿開腸破肚的話,可以買一條便宜的 PS2 搖桿轉 USB 的轉接線(賣場網址),接著把轉接線拆掉取出搖桿埠母座,拉出母座腳位與 ESP32 連接。不過接到 ESP32 的時候千萬要注意,上圖的腳位埠是 PS2 搖桿埠公座的標示,核對接腳時要把公座的順序轉成母座。

IMG_1771

最後,用 microUSB 把 NodeMCU 與 Ubuntu 電腦連接起來。

回到 Ubuntu 電腦,前一個步驟重開機讓所有設定生效之後,開啟終端機視窗,輸入 printenv PATH 與 printenv IDF_PATH 查看環境變數有沒有設定好。PATH 要有 /esp/xtensa-esp32-elf/bin,IDF_PATH 要有 /esp/esp-idf。

env

最後就是編譯上傳的工作。輸入 cd ~/esp/esp32-nesemu 到 esp32-nesemu 之後,輸入 make menuconfig

menuconfig

就會出現編譯設定介面,我們可以透過這個介面設定來設定編譯後的系統單晶片韌體可具備哪些功能(如超頻、Wifi....)。

menuconfig

設定很多,只要檢查幾項就可以了:

Serial flasher config :連接埠是 /dev/ttyUSB0,鮑率 115200 (有時候更快會比較不穩),Flash size 4MB (視所買的開發版而定,NodeMCU-32S 基於 ESP-WROOM-32 模塊為 4MB )

螢幕快照 2017-09-24 上午5.59.45

Nofrendo ESP32-specific configuration:GPIO 腳位設定必須與實際連接的位置相符。

螢幕快照 2017-09-24 上午6.03.45

Partition Table:Custom partition table CSV,檔名是 partitions.csv

螢幕快照 2017-09-24 上午6.06.06

Compoment config:減少不必要的功能,ESP32-specific 裡面 CPU Frequency 設定在最高 240MHz

螢幕快照 2017-09-24 上午6.09.27  

螢幕快照 2017-09-24 上午6.12.35

以上項目檢查完畢之後,可選擇 Exit 離開,若有更動內容的話會詢問存檔。

螢幕快照 2017-09-24 上午6.14.28

然後可以再 make 一次。執行 make flash 可以編譯後上傳。

makeflash

不過 make flash 只有上傳模擬器韌體,並沒有遊戲 Rom 檔,所以這時候 TFT LCD 是閃爍的狀態,執行 cutecom 查看 Log 檔會發現模擬器找不到遊戲 ROM 檔就會自動重開機。

cutecom

最後的工作是上傳一個遊戲 ROM 檔。上傳之前要先檢查上傳工具 flashrom.sh 裡面的設定是否正確。

繼續上個終端機視窗,在 ~esp/esp32-nesemu 底下,執行 nano flashrom.sh,檢查下圖中黃色定應 USB 埠為 ttyUSB0。上傳鮑率 為 115200*1,CTRL + O 存檔,CTRL + X 離開。

螢幕快照 2017-09-24 下午7.12.30

然後找一個手邊擁有的紅白機遊戲 ROM 檔,放到 ~/esp/esp32-nesemu 目錄下,執行

./flashrom.sh xxx.nes (遊戲ROM檔名)

finish

這時候就可看到 LCD 螢幕正在運行遊戲畫面了(我用的是 TECMO 有名的遊戲「忍者龍劍傳(Ninja Ryuuken Den)」,遊戲影片)。如果有接搖桿跟喇叭的話,就可以遊玩和聽到遊戲音效。

後記&結論

從執行的速度看來還不錯,有掉格但不太嚴重,遊戲速度有稍微偏快。音效方面,蜂鳴喇叭聽起來有點慘,雜音頗重。至於連接 PlayStation 2 搖桿的部分則很不穩定,常發生按了按鈕之後閃退重來、某幾按鈕控制失靈、按鈕自動亂按亂跳等情況,有時候又操控正常,每次通電時得碰運氣。拔掉搖桿之後,運行開頭展示動畫就完全正常了,推測連接搖桿之後可能是電供不足、或杜邦線電流不穩的原因(幾乎是麵包板 + 杜邦線的通病)。

另外我也逐一嘗試了 CentOS,macOS,Windows,甚至於是 Raspberry Pi 3B (樹莓派 3B)的編譯方式,操作方法大致相同,只差別在如何建制出正常編譯的環境,不過編譯出來的效果有些差異,Windows 編出來的運行效果有明顯的掉格,macOS 則好上一些。至於 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 下載位址:

https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-73-ge28a011-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」

文章標籤
創作者介紹

-Ben's PHOTO-

benjenq 發表在 痞客邦 PIXNET 留言(0) 人氣()