資料介紹
描述
ArduboyXL號
我著手制作一個具有更大屏幕并能夠從微型 SD 卡加載游戲的Arduboy克隆。TL;DR 是它使用兩個 arduino——一個 Atmel 328p 從 SD 卡讀取并重新刷新 Atmel 32u4。多路復(fù)用器芯片用于將顯示器切換到編程器內(nèi)核以顯示菜單。我制作了自定義工具來生成菜單列表和屏幕截圖文件。我用數(shù)控機(jī)床用鋁板加工了一個外殼。
背景
Arduboy 是一款基于 arduino 的便攜式游戲系統(tǒng),旨在運(yùn)行免費(fèi)和開源游戲。它本質(zhì)上只是一個 8 位微控制器,以信用卡大小的封裝連接到 oled 屏幕。
harwdare 非常有限。該處理器是一個 16MHz ATMega 32u4,具有 32KB 閃存和 2.5KB RAM。屏幕是 1.3"、128x64 像素、1 位 OLED。有 512 字節(jié)的 EEPROM 可用于保存游戲或高分。系統(tǒng)一次只能容納一個游戲,必須從 PC 刷新才能切換游戲。
有趣的是,這設(shè)法創(chuàng)造了一種頗具吸引力的體驗,吸引了許多明顯的開發(fā)者和玩家。它在 2015 年獲得了成功的 kickstarter ,籌集了超過 40 萬美元,并且有 100 多款游戲,從兒童制作的第一款游戲到具有專業(yè)外觀的游戲。從游戲的角度來看,這遠(yuǎn)遠(yuǎn)領(lǐng)先于Ouya等其他草根游戲機(jī)開發(fā)項目,其資助金額是其十倍以上。我認(rèn)為,成功來自于限制——簡單的硬件意味著你需要制作一款簡單的游戲,這使得它更容易上手,也更容易完成。完成后,游戲?qū)⒃谝粋€完全獨(dú)立的平臺上運(yùn)行,沒有其他東西可以搞砸它。如果您將您的游戲發(fā)送給朋友,他們會獲得完全相同的體驗,并且沒有真正的惡意軟件可能性(盡管我認(rèn)為您可以制作一個會損壞硬件的程序,但它不像普通的可執(zhí)行文件那樣可以勒索您的整個硬盤駕駛)。顯然范圍不一樣,但我認(rèn)為小贏總比大失敗好。
我的電子游戲囤積本能被激活了。我想擁有所有的游戲。我已經(jīng)著手制作我自己的系統(tǒng)版本,該系統(tǒng)包含系統(tǒng)本身中的所有游戲,無需從計算機(jī)重新刷新。
研究
你怎么做到這一點?我知道讓 arduino 與 SD 卡對話是相當(dāng)簡單的——有圖書館可以做到這一點。所以我們可以從 SD 卡加載文件,但是如何讓它們在 arduino 上運(yùn)行?程序存儲器中有一個小的保留部分稱為引導(dǎo)加載程序,目前允許您通過串行通信對芯片進(jìn)行重新編程。理論上,可以重寫這段 4KB 的代碼,以便從 SD 卡對芯片本身進(jìn)行重新編程……
但這聽起來真的很難。一個更簡單的解決方案是讓第二個 arduino 與 SD 卡通信,并將程序發(fā)送到玩游戲的 arduino。
“雙核”設(shè)計已經(jīng)確定,但是如何讓一個arduino程序成為另一個arduino程序呢?
選項 1:STK500 over serial利用引導(dǎo)加載程序,您可以將串行命令從一個 arduino 發(fā)送到另一個以對其重新編程。這與當(dāng)您通過 FTDI usb 連接到串行適配器時計算機(jī)對芯片重新編程的方式相同。對于布線,您只需連接 RX->TX 和 TX->RX(和 GND)。
我發(fā)現(xiàn)了以下示例:
George Caley 的Arduino 復(fù)印機(jī)
我能夠讓這段代碼在 Arduino Uno 和 Pro-Mini 上運(yùn)行,它們都是基于 ATMega 328p 的開發(fā)板。
困難在于代碼的文檔記錄不完善。有大量的幻數(shù)塊,其中一些需要更改才能使代碼適用于 32u4 芯片。我開始使用 STK500 文檔將幻數(shù)轉(zhuǎn)換為命名常量,但我遇到的第一件事是“設(shè)置設(shè)備”指令,后跟設(shè)備代碼 0x86,我在任何地方都找不到它。我假設(shè)它是 328 的設(shè)備代碼,但我找不到準(zhǔn)確進(jìn)行所需的文檔。
Bald Wisdom 的引導(dǎo)驅(qū)動器
這看起來很棒,它使用命名常量,它實際上完全按照我的需要做,甚至從 SD 卡加載草圖。但是,我無法讓它工作。它使用硬件串行線進(jìn)行編程,并使用第二條軟件驅(qū)動的串行線進(jìn)行調(diào)試——我把它連接得很好,但從來沒有遇到過幾種不同類型的錯誤垃圾郵件。還有一些巨魔狗屎,比如接線圖,上面有幾段注釋,上面寫著“圖表是錯誤的”——它讓你質(zhì)疑每一行代碼。
這里故事的寓意是使用選項 2。
選項 2:在線串行編程器 這是一種使用 SPI 接口的更直接的編程方法。這種方法實際上可以刷新引導(dǎo)加載程序本身,這很好,因為那里有很多關(guān)于如何在引導(dǎo)加載程序出錯時恢復(fù)你的 arduboy 的線程。這就引出了一個問題,即為什么我們首先要有引導(dǎo)加載程序,尤其是在需要外部設(shè)備進(jìn)行串行通信的 pro-mini 之類的東西上。為什么不直接插入不同的東西并通過 ICSP 編程呢?
Nick Gammon 的十六進(jìn)制上傳器
這幾乎立即起作用,從一種類型的 arduino 到另一種類型沒有任何困難。
問題是它真的很慢,需要大約 45 秒才能刷新。需要進(jìn)行一些優(yōu)化。
我實施了以下優(yōu)化:
刪除文件長度驗證。在上傳之前讀取整個文件以避免超出程序內(nèi)存邊界(實質(zhì)上是讀取文件兩次)。引導(dǎo)加載程序區(qū)域受到保護(hù),因此如果它確實通過,將會發(fā)生的只是上傳失敗,因此這一步似乎是不必要的。
刪除了行校驗和驗證。十六進(jìn)制文件中的每一行都包含一個校驗和,但如果它是錯誤的,那么文件無論如何都會被破壞。你從哪里得到這個文件?只要有好的文件。
刪除了 clearPage 命令。我相信這是在向其上傳新數(shù)據(jù)之前清除目標(biāo)芯片上的工作頁面。這需要很長時間,不做似乎不會造成任何問題。一個副作用是最后一頁的末尾可能有重復(fù)或垃圾數(shù)據(jù)(唯一不會被新數(shù)據(jù)完全覆蓋的頁面),但如果你最終進(jìn)入該部分,你的程序就會偏離軌道無論如何,您只是想獲得一致的失敗狀態(tài)。
如果您確實需要此功能,更好的方法是將 0x00 寫入僅最后一頁的未使用部分。
減少/消除 BB_DELAY_MICROSECONDS 延遲。編程信號通過軟件定義的 SPI 總線,BB_DELAY_MICROSECONDS 是保持每個時鐘周期上升或下降的微秒數(shù)。默認(rèn)值為 6,即 83KHz。SPI 總線可以很好地進(jìn)入 MHz 范圍,因此增加它應(yīng)該不是什么大問題。我嘗試了 3,然后是 1,然后我用一些匯編 NOP 指令(在一個時鐘周期內(nèi)什么也不做)替換了微秒延遲,以延遲不到一微秒。
最后我把它調(diào)低到一個 NOP,最大速度,沒有問題。
刪除了上傳驗證?;刈x整個上傳的閃存以驗證需要很長時間。為什么不運(yùn)行它看看會發(fā)生什么?
更改了 SPI 總線初始化 SPI_HALF_SPEED -> SPI_FULL_SPEED。半速應(yīng)該避免面包板上的錯誤。我最終在調(diào)試過程中來回改變并且沒有注意到任何區(qū)別。我不認(rèn)為文件吞吐量是這里的瓶頸。
向 BB_SPITransfer() 添加了“inline”關(guān)鍵字。bit-bang spi 函數(shù)現(xiàn)在每秒被調(diào)用數(shù)百萬次,所以我認(rèn)為內(nèi)聯(lián)它可以減少一些開銷。我沒有衡量任何改進(jìn)。
刪除了 chipErase 命令。不得不撤消這一點。原來你必須在寫之前擦除,你不能只是覆蓋。
這些變化結(jié)合起來使刷新時間減少到大約 7 秒!程序員將基于此代碼的修改版本。
部分
阿杜諾微型
基于 arduboy 中使用的相同 ATMega 32u4,該板斷開了所有必要的引腳以進(jìn)行精確克隆。
比親微大,不過有保障的測試平臺還是不錯的。
請注意,此版本具有更大的芯片封裝,因此可以將一些額外的電線直接焊接到芯片上并獲得與 arduboy 的完全引腳兼容性。
您確實至少需要其中三個 - 一個用于面包板,一個用于最終項目,一個用于搞砸。
基于 328p 的 pro-mini 需要外部usb 轉(zhuǎn)串口設(shè)備對其進(jìn)行編程,但它比基于 32u4 的 pro-micro 上的虛擬串口可靠得多。
我最終將其用于程序員核心。
是的,我們將有一個帶有 2KB RAM 的 CPU 連接到 8GB 存儲空間。有點荒謬,但他們并沒有真正制造比這更小的 SD 卡。
這些用于最終版本的按鈕。為了進(jìn)行測試,我們將使用普通的觸覺開關(guān)。
值得注意的是,它還具有低電壓截止功能,因此可以在其他項目中與裸鋰聚合物電池一起使用。
互聯(lián)網(wǎng)告訴我三星 Galaxy S4 是世界上最受歡迎的智能手機(jī),所以我想有人會為它制造新電池。此外,它是一個很好的方形,很容易與其他組件配合使用。
購買手機(jī)電池的一個大問題是,大量電池是從電子垃圾箱中挑選出來并作為新電池出售的。這個很可能是電子垃圾,上面貼著紅色標(biāo)簽,但至少他們并沒有試圖將其假冒為正品。
這將從單個 3.7v LiPo 電池中為我們提供穩(wěn)定的 5 伏電壓。請注意,arduino 板上的穩(wěn)壓器只會向下調(diào)節(jié),并且需要高得多的電壓。
額定300ma,應(yīng)該沒問題。還有一個用于高電流應(yīng)用的MOSFET 開關(guān),但我認(rèn)為這不是必需的。
電池充電器上有一個 USB 端口,但如果我們想要與 arduboy 建立數(shù)據(jù)連接,我們可以先使用這個 breakout。
內(nèi)置電平轉(zhuǎn)換器可轉(zhuǎn)換為所需的 3.3v,具有卡檢測引腳,因此我們可以判斷何時插入了 SD 卡。
比壓電略好。
這個屏幕和arduboy的SSD1306控制器一模一樣,而且便宜,所以拿來測試。
幾乎是默認(rèn) arduboy 屏幕的兩倍,具有非常相似的 SSD1309 控制器。游戲可以通過一些小的十六進(jìn)制編輯轉(zhuǎn)換為使用此顯示。
?
面包板克隆
最好從復(fù)制已經(jīng)完成的事情開始,然后再做新的事情。我使用 SSD_1306 屏幕和標(biāo)準(zhǔn)壓電在面包板上連接了一個 arduboy 克隆,下載了游戲的源代碼并進(jìn)行了編譯。一切都立即有效。
當(dāng)我 10 歲的時候,我從音樂生日賀卡中取出壓電 - 我知道有一天它會派上用場。
增強(qiáng)型面包板克隆
我用更大的 SSD_1309 OLED 替換了屏幕,并用揚(yáng)聲器替換了壓電顯示器。使用arduboy 自制包和不同的屏幕選項重新編譯游戲效果很好。
重新閃現(xiàn)概念證明
這個概念證明證明可以在不連接到計算機(jī)的情況下在兩個不同的游戲之間切換。程序員核心位于前臺面包板上,帶有一些用于上傳狀態(tài)的 LED 和兩個硬編碼的專用按鈕,用于將兩個不同的十六進(jìn)制文件上傳到后臺的 arduboy 核心。
為簡單起見,顯示和移動按鈕僅連接到 arduboy 核心。切換游戲時會出現(xiàn)一些屏幕垃圾,因為屏幕與 ICSP 在同一總線上,此時程序員核心無法將其關(guān)閉。
完整原型
這是一個更復(fù)雜的原型,它顯示了整個過程的工作。當(dāng)電源打開時,arduboy 核心正常啟動并開始玩它在內(nèi)存中的任何游戲,而編程器核心進(jìn)入睡眠模式(由于編程核心上運(yùn)行的一些調(diào)試代碼,會出現(xiàn)短暫的重置問題)。
然后當(dāng)你按下一個專用的菜單按鈕時,編程核心就會喚醒,在 arduboy 上拉 reset,翻轉(zhuǎn)一個多路復(fù)用器芯片來控制屏幕并顯示游戲菜單。它可以在列表中顯示任意數(shù)量的文件,并在您選擇時顯示每個游戲的 64x64 像素屏幕截圖。
程序員核心使用 SSD1306_text 庫的修改版本來顯示文本和圖形。有更精細(xì)的圖形庫可用,但要進(jìn)行 SD 卡讀取和 ICSP 編程,閃存空間和內(nèi)存非常寶貴。我修改了庫以使用具有比例間距的自定義壓縮字體,并編寫了一個命令行實用程序?qū)?png 圖像轉(zhuǎn)換為可以直接嵌入到 arduino 草圖中的字體字節(jié)。
通常為了顯示這樣的列表,我會把整個東西加載到 ram 中并完成,但我們只有 2KB 的 ram,其中 75% 已經(jīng)在使用中。我們甚至沒有足夠的空間來緩沖屏幕上顯示的文本。文件系統(tǒng)也是 FAT32,在 arduino 上只支持 8.3 文件名。這兩個問題的解決方案是使用一個預(yù)生成的列表文件,其中包含較短的 8.3 十六進(jìn)制文件名和較長的顯示名稱。列表文件中的條目是固定長度的,所以我們可以很容易地跳到任何一行,閱讀它,并在我們進(jìn)行時將顯示名稱打印到屏幕上。
屏幕截圖是從單獨(dú)的文件中讀取的,并一次一個字節(jié)地打印到屏幕上。它是在某種文本模式下完成的,其中 8 像素高的水平行填充有垂直條紋(每個一個字節(jié))。我編寫了另一個命令行實用程序,可以將 png 屏幕截圖轉(zhuǎn)換為特殊格式并一次性生成列表文件。通過這種方式,您可以在您的計算機(jī)上保存一組具有常規(guī)長文件名和匹配屏幕截圖的游戲文件,然后只需運(yùn)行該實用程序,然后再將所有內(nèi)容上傳到 SD 卡。
硬件計劃
還有一些組件需要完成:電池、聲音和 RGB LED。我測試了電流消耗,最大電流約為 200ma,所以我可能會使用手機(jī)電池來確保較長的電池壽命。我用來測試的揚(yáng)聲器很好很薄,但它的直徑很大,我可能會貨比三家,買一個小一點的。我還需要一個指輪電位器來調(diào)節(jié)音量,我不得不求助于 ebay - 他們不再真正制造它們了,所有新東西都使用數(shù)字電位器,這只會使事情復(fù)雜化。
arduboy 上的 RGB LED 是共陽極,幸運(yùn)的是,我周圍的所有 LED 都是共陰極。我想在設(shè)備的頂部或側(cè)面做一些光管設(shè)計,讓它不僅僅是一個點光源。Bezek上的光管運(yùn)行良好。
對于按鈕,我計劃使用 NES 控制器維修套件中的橡膠圓頂(仍在制作新的)。我計劃將按鈕與外殼一起用鋁加工出來。
軟件計劃
我希望能夠通過按左/右鍵在菜單的不同顯示模式之間循環(huán)。一方面是純文本顯示,每個游戲的 1-5 星評級,然后是當(dāng)前名稱/屏幕截圖拆分,然后是完整屏幕截圖顯示??赡苓€有標(biāo)題屏幕顯示。
有些游戲保存高分或?qū)⒂螒虮4娴?512 字節(jié)的 EEPROM 中。我希望能夠在切換游戲時備份和恢復(fù)這些數(shù)據(jù)。
案例設(shè)計
這是一個透明視圖,顯示了外殼頂部和一些內(nèi)部組件的切口。外殼設(shè)計為銑削,因此內(nèi)角需要倒圓角。
這是一個有點復(fù)雜的裝配,所以我在 3D Studio 中制作了一些模型以確保一切都合適。
1 / 4 ?組裝設(shè)備的渲染圖。白色條是 RGB LED 的光管。
電路板設(shè)計
DesignSpark PCB 布局
我使用 DesignSpark PCB 來...設(shè)計(激發(fā)?)PCB。跡線布局是手動布線和自動布線器的混合,之后會進(jìn)行調(diào)整。我在仔細(xì)檢查所有內(nèi)容時發(fā)現(xiàn)了一些錯誤,希望我都能找到它們!
我導(dǎo)出了 gerber 文件并將它們上傳到 OSHPark 進(jìn)行制造。
1 / 2 ? OSHPark 正面渲染
OSHPark 的物理 PCB。
1 / 2 ?安裝屏幕,間隙問題。
我犯了一個明顯的錯誤,部分電路板擋住了屏幕模塊上的某些組件。幸運(yùn)的是,電路板的那部分沒有痕跡,所以只需要一點銼就可以修復(fù)它。
組裝電子產(chǎn)品,正面
組裝電子產(chǎn)品,后部
電子設(shè)備的背面。電池設(shè)計為與電線連接,但由于焊盤在 PCB 上抬起,因此連接到主開關(guān)的電線需要維修。我應(yīng)該擴(kuò)展 PCB 以從所有 4 個角支持 USB 充電模塊,并從一開始就將其粘住。
表殼加工
剛加工完。
呃……長話短說,我用鋁加工了一個箱子。我在當(dāng)?shù)氐膭?chuàng)客空間使用了 Bridgeport V2XT。它不是這項工作的理想機(jī)器,因為主軸在 4000rpm 時達(dá)到上限 - 對于 1/8" 鋁制刀具,您確實需要 20, 000+ rpm 才能獲得適當(dāng)?shù)谋砻嫠俣取5毒邐A持設(shè)置存在一些錯誤不夠安全,最重要的是我在編程時犯了一個錯誤,所以 D-Pad 和菜單按鈕孔最終太大了。不過它仍然可以通過。
外殼和按鈕,清理干凈。
自然地,經(jīng)過幾個小時的加工,我折斷了其中一個螺絲孔內(nèi)的絲錐。我只是把它留在那兒了。剩余的螺絲足以將其牢固地固定在一起。
外殼的外面。
由于振動,它有點條紋。這本可以通過使用更厚的固定片或帶有定制軟鉗口的虎鉗來避免。在后面板右側(cè)的最后一次通過時,抖動特別嚴(yán)重。
1 / 3 ?按鈕到位。
完畢!
在這里它已經(jīng)完全組裝好了!
給電池充電。
我用亞克力制作了一根導(dǎo)光管,將充電狀態(tài) LED 引導(dǎo)至外殼外部。
燈管特寫。
當(dāng)電池充滿電時,指示燈變?yōu)樗{(lán)色。
文件
該 zip 包含 ICSP flasher arduino 項目、C++ 二進(jìn)制文件和用于轉(zhuǎn)換屏幕截圖、PCB 文件以及外殼和按鈕的 STL 文件的源代碼。
我不希望任何人能夠直接使用它,但如果您有類似的項目,它可能會對您有所幫助。
?
- 使用ZYBO從SD卡播放wav文件
- 使用Arduino(Arduboy)DIY手持游戲機(jī)
- SD卡2.0協(xié)議資料英文版 0次下載
- STM32F103C8T6通過SD卡加載固件
- 基于SPI協(xié)議的SD卡讀寫說明 49次下載
- SD卡的99SE封裝庫免費(fèi)下載 43次下載
- SD卡的99SE封裝庫免費(fèi)下載 13次下載
- 使用單片機(jī)實現(xiàn)SD卡讀寫的資料和程序免費(fèi)下載
- 如何實現(xiàn)單片機(jī)讀寫SD卡的底層驅(qū)動程序
- SD卡資料 7次下載
- SD卡要點說明 265次下載
- SD卡分類簡介
- SD卡命令解釋
- sd卡-mmc卡-CPU說明資料
- sd卡接口電路
- 貼片式SD卡功能介紹【MK SD NAND】 386次閱讀
- SD卡鏡像啟動過程中如何第一時間獲取FPGA配置狀態(tài)? 369次閱讀
- sd卡是什么有什么用途 TF卡和SD卡有什么區(qū)別 3858次閱讀
- sd卡是什么有什么用途 TF卡和SD卡有什么區(qū)別 2015次閱讀
- SD卡的分類以及常見屬性 3686次閱讀
- TF卡和SD卡的區(qū)別有哪些? 8253次閱讀
- 怎么通過FPGA采取SD模式實現(xiàn)Micro SD卡的驅(qū)動 1693次閱讀
- SD/micro SD存儲卡介紹 1577次閱讀
- 一文了解microSD卡和SD卡的區(qū)別 9732次閱讀
- 微雪電子SD卡存儲模塊簡介 1593次閱讀
- fireflyROC-RK3328燒寫SD卡介紹 3255次閱讀
- FPGA SD卡驅(qū)動調(diào)試問題記錄 1366次閱讀
- 干貨 | SD卡/TF卡的PCB布局布線設(shè)計要求 2.5w次閱讀
- spi讀取sd卡數(shù)據(jù)例程 8823次閱讀
- mmc卡和sd卡的區(qū)別是什么 4.7w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評論
查看更多