從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

偶爾,我會對80年代末和90年代童年時期玩過的電子遊戲感到懷舊,雖然大多數舊電腦和遊戲機早就不知道在哪裏吃灰了,但個人Raspberry Pi能夠重現個人「童年」。python

我喜歡Raspbian中內置的簡單遊戲,而開源的RetroPie項目幫助我將Raspberry Pi變成了一款先進的復古遊戲機。linux

可是,爲了得到更「給力」的體驗,我須要一個手感極佳的遊戲手柄。市面上可選的USB遊戲手柄和遊戲杆很是多,但做爲開源愛好者、製造商和工程師,我更喜歡本身定製。ios

因此,我製做了本身的簡單開源硬件遊戲手柄,我將其命名爲ANAVI Play pHAT。我將它設計爲Raspberry Pi的附加板,使用EEPROM 和我建立的用於映射鍵的設備二進制覆蓋。git

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

獲取遊戲手柄按鈕和EEPROMgithub

能夠買到的「千奇百怪」的遊戲手柄有些很是複雜,然而,使用我建立的設計製做相似於標誌性NES控制器的遊戲手柄並不難。編程

遊戲手柄使用八個「瞬發」按鈕(即,僅在按下時纔有效的開關):用於移動的四個輕觸開關(向上,向下,向左,向右),用於A和B的兩個輕觸按鈕,以及選擇和開始的兩個較小的按鈕。我使用了通孔輕觸開關:六個6x6x4.3mm開關用於移動和A和B按鈕,兩個3x6x4.3mm開關用於啓動和選擇按鈕。數據結構

雖然遊戲手柄的主要目的是玩復古遊戲,但附加板足夠大,能夠附加一些「高大上」的家庭自動化功能,諸如監控溫度、溼度、光線或氣壓,能夠在不玩遊戲時使用。我添加了三個插槽,用於將I2C傳感器鏈接到物理引腳3和5上的主I2C總線。架構

硬件設計中最有趣和最重要的部分是EEPROM(電可擦除可編程只讀存儲器)。通孔安裝的EEPROM更容易在麪包板上閃爍並焊接到遊戲手柄上。編輯器

MagPi雜誌中的一篇文章推薦CAT24C32 EEPROM; 若是該模型不可用,請嘗試查找具備相似技術規格的模型。2014年以後發佈的全部Raspberry Pi型號和版本(Raspberry Pi B +和更新版本)在物理引腳27和28上都有一個輔助I 2 C總線。ide

完成上面的硬件搭建,使用麪包板檢查它是否正常工做。

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄
建立印刷電路板

下一步是建立印刷電路板(PCB)設計並製造它。做爲開源愛好者,我相信應該使用免費和開源軟件來建立開源硬件。我更傾向於使用KiCad,即GPLv3 +許可下提供的電子設計自動化(EDA)軟件。KiCad適用於Windows,MacOS和GNU / Linux。(我在Ubuntu 18.04上使用KiCad第5版。)

KiCad容許您建立多達32個銅層和14個固定用途技術層的PCB。它還有一個集成的3D查看器。它獲得了積極的發展,包括CERN開發人員的許多貢獻,並用於工業應用; 例如,Olimex使用KiCad設計具備多層的複雜PCB,例如TERES-I DIY開源硬件筆記本電腦中的PCB。

KiCad工做流程包括三個主要步驟:

  • 在原理圖佈局編輯器中設計原理圖

  • 繪製邊緣切口,放置組件,並在PCB佈局編輯器中佈線

  • 導出Gerber和鑽取文件以供製造

若是您以前沒有設計PCB的經驗,能夠瀏覽KiCad提供的示例和用戶指南,瞭解如何使用原理圖和PCB佈局編輯器。(若是您不想從頭開始作任何事情,能夠在個人GitHub存儲庫中克隆ANAVI Play pHAT項目。)

(注:文章做者GitHub地址https://github.com/AnaviTechnology/anavi-play-phat)

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

在KiCad的原理圖佈局編輯器中,將Raspberry Pi的GPIO鏈接到按鈕,將傳感器的插槽鏈接到主I2C,將EEPROM鏈接到輔助I2C.爲每一個組件分配適當的佔位面積。執行電氣規則檢查,若是沒有錯誤,則生成網表,描述電子電路的鏈接。

打開PCB佈局編輯器,全部組件和軌道必須位於前銅層和底銅層(F.Cu和B.Cu)上,而且必須在Edge.Cuts層中建立板的形式。任何文本(包括按鈕標籤)都必須位於絲印圖層上。

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

最後,導出Gerber並將它發送給生產PCB的公司的文件。Gerber格式是PCB的事實上的行業標準。它是2D二進制圖像的開放ASCII矢量格式;簡單地解釋一下,它就像是用於PCB製造的PDF。

有許多公司能夠像遊戲手柄同樣製做簡單的雙層電路板。對於一些原型,您能夠依靠美國的OSHPark或歐洲的Aisler。還有不少中國製造商,如JLCPCB,PCBWay,ALLPCB,Seeed Studio等等。或者,若是您但願省略PCB製造和採購組件的麻煩,您能夠從Crowd Supply訂購ANAVI Play pHAT製造商套件,並自行焊接全部通孔組件。

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

瞭解devicetree

Devicetree是描述硬件組件的軟件數據結構的規範。其目的是容許已編譯的Linux內核在更普遍的架構系列中處理各類不一樣的硬件配置。引導加載程序將devicetree加載到內存中並將其傳遞給Linux內核。

該設備包括三個組成部分:

  • Devicetree來源(DTS)

  • Devicetree blob(DTB)和疊加(DTBO)

  • Devicetree編譯器(DTC)

DTC從文本源建立二進制文件。Devicetree覆蓋容許中心DTB覆蓋在設備上。疊加包括許多片斷。

幾年來,全部新的ARM片上系統(SoC)都須要一個設備,包括全部Raspberry Pi型號和版本中的Broadcom SoC。使用Raspberry Pi流行的Raspbian發行版中的默認引導加載程序,可使用關鍵字device_tree =在可引導microSD卡的FAT分區上的配置文件(config.txt)中設置DTO 。

自2014年以來,Raspberry Pi的引腳頭已擴展至40個引腳。引腳27和28專用於輔助I 2 C總線。這樣,DTBO能夠從鏈接到這些引腳的EEPROM自動加載。此外,其餘系統信息能夠保存在EEPROM中。此功能屬於Raspberry Pi Foundation對任何Raspberry Pi HAT(頂部附加硬件)附加板的要求。在Raspberry Pi的Raspbian和其餘GNU / Linux發行版中,能夠在啓動後從/ proc / device-tree / hat /的用戶空間看到EEPROM中的信息。

在我看來,devicetree是過去十年中Linux生態系統中增長的最迷人的功能之一。建立devicetree blob和覆蓋是一項高級任務,須要一些背景知識。可是,能夠爲Raspberry Pi附加板建立一個設備二進制覆蓋,並將其閃存在適當的EEPROM上。設備二進制覆蓋定義遊戲手柄的每一個鍵的Linux密鑰代碼。結果是Raspberry Pi的遊戲手柄,其中的按鍵在您啓動Raspbian後當即工做。

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄
建立DTBO

爲遊戲手柄建立一個devicetree二進制覆蓋有三個主要步驟:

  • 根據Linux密鑰代碼建立帶有密鑰映射的設備源

  • 使用devicetree編譯編譯devicetree二進制覆蓋

  • 使用Raspberry Pi Foundation提供的開源工具建立 .eep文件並在EEPROM上閃爍

Linux密鑰代碼在文件/usr/include/linux/input-event-codes.h中定義。

設備源文件應描述哪一個Raspberry Pi GPIO引腳鏈接到哪一個硬件按鈕以及按下按鈕時應觸發哪一個Linux密鑰代碼。在此遊戲手柄中,GPIO17(引腳11)鏈接到右側觸摸按鈕,GPIO4(引腳7)鏈接到左側,GPIO22(引腳15)鏈接到Up,GPIO27(引腳13)鏈接到Down,GPIO5(引腳29)鏈接到啓動, GPIO6(引腳31)選擇,GPIO19(引腳35)鏈接到A,GPIO26(引腳37)鏈接到B.

請注意,GPIO編號與插頭上引腳的物理位置有所不一樣。爲方便起見,全部引腳都位於Raspberry Pi的40引腳接頭的第二行。這種方法能夠更容易地在KiCad中佈線印刷電路板。

遊戲手柄的整個設備源可在GitHub上得到。(注:文章做者GitHub地址https://github.com/AnaviTechnology/anavi-play-phat)做爲示例,如下是一個簡短的代碼片斷,演示瞭如何將與Raspberry Pi上的物理引腳11相對應的GPIO17映射到Right的按鈕:

按鈕@ 17 { 
               label =「right」; 
               linux,code = <106>; 
               gpios = <&gpio 17 1>; 
            };

要直接在Raspberry Pi上編譯DTS,請在終端上執行如下命令在Raspbian上安裝devicetree編譯器:

sudo apt-get update
sudo apt-get install device-tree-compiler

運行DTC並提供輸出DTBO的名稱和源文件的路徑做爲參數。例如:

dtc -I dts -O dtb -o anavi-play-phat.dtbo anavi-play-phat.dts

Raspberry Pi Foundation提供了一個GitHub存儲庫,其中包含HAT的機械,硬件和軟件規範。它還包括三個很是方便的工具:

  • eepmake:使用設置從文本文件建立.eep文件

  • eepdump:用於調試,由於它將二進制.eep文件轉儲爲人類可讀的文本

  • eepflash:向EEPROM 寫入或從EEPROM 讀取.eep二進制映像

該eeprom_settings.txt文件能夠做爲一個模板。Raspberry Pi Foundation和MagPi雜誌提供了有用的文章和教程,所以我不會涉及太多細節。如上所述,推薦的EEPROM是CAT24C32,但它能夠替換爲具備相同技術規格的任何其餘EEPROM。使用帶有8引腳,通孔,雙列直插式(DIP)封裝的EEPROM,業餘愛好者能夠更輕鬆地進行閃存,由於它能夠經過麪包板完成。如下示例命令使用Raspberry Pi GitHub存儲庫中的eepmake工具建立準備在EEPROM上閃存的文件:

./eepmake settings.txt settings.eep anavi-play-phat.dtbo

在繼續閃爍以前,請確保EEPROM已正確鏈接到Raspberry Pi上的主I2C總線(引腳3和5)。(您能夠參考上面連接的MagPi雜誌文章,討論接線示意圖。)而後運行如下命令並按照屏幕上的說明閃爍EEPROM上的.eep文件:

sudo ./eepflash.sh -w -f=settings.eep -t=24c32

在將EEPROM焊接到印刷電路板以前,將其移至麪包板上的輔助I 2 C總線並進行測試,以確保其按預期工做。若是在測試麪包板上的EEPROM時檢測到任何問題,請更正設置文件,將其移回主I 2 C總線,而後再次閃爍。

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄
測試遊戲手柄

終於能夠盤它了,是時候使用Raspbian測試附加板了,您能夠從RaspberryPi.org 下載。啓動後,打開終端並輸入如下命令:

cat / proc / device-tree / hat / product 
cat / proc / device-tree / hat / vendor

輸出應該相似於:

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

若是是的話,恭喜!已成功讀取EEPROM中的數據。

下一步是驗證Play pHAT上的鍵是否設置正確並正常工做。在終端或文本編輯器中,按下八個按鈕中的每個,並驗證它們是否按配置運行。

最後,終於能夠玩遊戲了!默認狀況下,Raspbian的桌面包括Python遊戲。

從應用程序菜單啓動它們,進行音頻輸出選擇並從列表中選擇一個遊戲。我最喜歡的是Wormy,一款相似貪吃蛇的遊戲。做爲一名前Symbian移動應用程序開發人員,我發現玩Wormy讓我夢迴諾基亞的崢嶸歲月。

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄
RetroPie復古遊戲

從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄
Raspbian很棒,但RetroPie爲復古遊戲迷提供了更多的東西。它是一個GNU / Linux發行版,針對復古遊戲進行了優化,並結合了開源項目RetroArch和Emulation Station。它適用於Raspberry Pi,Odroid C1 / C2以及運行Debian或Ubuntu的我的計算機。

它提供了用於加載ROM的仿真器 - 遊戲卡帶的數字版本。值得一提的是,因爲版權問題,RetroPie中不包含任何ROM。在啓動RetroPie以後,您必須找到適當的ROM並將它們複製到Raspberry Pi。

開源硬件遊戲手柄在RetroPie的菜單中運行良好,但我發如今啓動一些遊戲和模擬器後鍵失敗。調試以後,我找到了一個確保它們在遊戲模擬器中工做的解決方案:添加一個Python腳本,用於密鑰的其餘軟件模擬。該腳本可在GitHub上得到。如下是如何獲取它並在RetroPie上安裝Python:

sudo apt-get update
sudo apt-get install -y python-pip 
sudo pip install evdev 
cd~ 
git clone https://github.com/AnaviTechnology/anavi-examples.git

最後,將如下行添加到/etc/rc.local中,以便在RetroPie啓動時自動執行:

sudo python /home/pi/anavi-examples/anavi-play-phat/anavi-play-gamepad.py &

完成如下步驟後,您能夠建立一個徹底開源的硬件遊戲手柄做爲任何帶有40針頭的Raspberry Pi型號的附加板,並與Raspbian和RetroPie一塊兒使用!

將免費和開源軟件與開源硬件相結合既有趣又不困難,但須要大量時間。在業餘時間建立開源硬件遊戲手柄以後,我在Crowd Supply進行了一次適度的衆籌活動,在個人家鄉保加利亞普羅夫迪夫進行小批量生產。固然使用的仍是開源硬件項目BG000007,另外還使用了保護電路板免受灰塵影響的丙烯酸外殼,也是使用免費開源軟件OpenSCAD建立的開源硬件。
從PCB到DTBO:本身作一個Raspberry Pi遊戲手柄

若是你也心動了,能夠嘗試使用KiCad爲Raspberry Pi建立本身的開源硬件附加板。最後祝你們玩的愉快!下次再有人問再跟你說「要是把玩遊戲時間都用在學習上」,告訴他們你學會了Raspberry Pi、開源硬件和Linux。

相關文章
相關標籤/搜索