電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>能夠從微型SD卡加載游戲的Arduboy克隆

能夠從微型SD卡加載游戲的Arduboy克隆

2023-02-03 | zip | 1.16 MB | 次下載 | 免費

資料介紹

描述

ArduboyXL號

我著手制作一個具有更大屏幕并能夠從微型 SD 卡加載游戲的Arduboy克隆。TL;DR 是它使用兩個 arduino——一個 Atmel 328p 從 SD 卡讀取并重新刷新 Atmel 32u4。多路復(fù)用器芯片用于將顯示器切換到編程器內(nèi)核以顯示菜單。我制作了自定義工具來生成菜單列表和屏幕截圖文件。我用數(shù)控機(jī)床用鋁板加工了一個外殼。

背景

Arduboy 是一款基于 arduino 的便攜式游戲系統(tǒng),旨在運行免費和開源游戲。它本質(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ū)⒃谝粋€完全獨立的平臺上運行,沒有其他東西可以搞砸它。如果您將您的游戲發(fā)送給朋友,他們會獲得完全相同的體驗,并且沒有真正的惡意軟件可能性(盡管我認(rèn)為您可以制作一個會損壞硬件的程序,但它不像普通的可執(zhí)行文件那樣可以勒索您的整個硬盤駕駛)。顯然范圍不一樣,但我認(rèn)為小贏總比大失敗好。

我的電子游戲囤積本能被激活了。我想擁有所有的游戲。我已經(jīng)著手制作我自己的系統(tǒng)版本,該系統(tǒng)包含系統(tǒng)本身中的所有游戲,無需從計算機(jī)重新刷新。

研究

你怎么做到這一點?我知道讓 arduino 與 SD 卡對話是相當(dāng)簡單的——有圖書館可以做到這一點。所以我們可以從 SD 卡加載文件,但是如何讓它們在 arduino 上運行?程序存儲器中有一個小的保留部分稱為引導(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 上運行,它們都是基于 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整個上傳的閃存以驗證需要很長時間。為什么不運行它看看會發(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)換為使用此顯示。

?

面包板克隆

Breadboard-Clone.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

最好從復(fù)制已經(jīng)完成的事情開始,然后再做新的事情。我使用 SSD_1306 屏幕和標(biāo)準(zhǔn)壓電在面包板上連接了一個 arduboy 克隆,下載了游戲的源代碼并進(jìn)行了編譯。一切都立即有效。

當(dāng)我 10 歲的時候,我從音樂生日賀卡中取出壓電 - 我知道有一天它會派上用場。

增強型面包板克隆

Breadboard-Clone-2.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

我用更大的 SSD_1309 OLED 替換了屏幕,并用揚聲器替換了壓電顯示器。使用arduboy 自制包和不同的屏幕選項重新編譯游戲效果很好。

重新閃現(xiàn)概念證明

這個概念證明證明可以在不連接到計算機(jī)的情況下在兩個不同的游戲之間切換。程序員核心位于前臺面包板上,帶有一些用于上傳狀態(tài)的 LED 和兩個硬編碼的專用按鈕,用于將兩個不同的十六進(jìn)制文件上傳到后臺的 arduboy 核心。

為簡單起見,顯示和移動按鈕僅連接到 arduboy 核心。切換游戲時會出現(xiàn)一些屏幕垃圾,因為屏幕與 ICSP 在同一總線上,此時程序員核心無法將其關(guān)閉。

完整原型

這是一個更復(fù)雜的原型,它顯示了整個過程的工作。當(dāng)電源打開時,arduboy 核心正常啟動并開始玩它在內(nèi)存中的任何游戲,而編程器核心進(jì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)行時將顯示名稱打印到屏幕上。

屏幕截圖是從單獨的文件中讀取的,并一次一個字節(jié)地打印到屏幕上。它是在某種文本模式下完成的,其中 8 像素高的水平行填充有垂直條紋(每個一個字節(jié))。我編寫了另一個命令行實用程序,可以將 png 屏幕截圖轉(zhuǎn)換為特殊格式并一次性生成列表文件。通過這種方式,您可以在您的計算機(jī)上保存一組具有常規(guī)長文件名和匹配屏幕截圖的游戲文件,然后只需運行該實用程序,然后再將所有內(nèi)容上傳到 SD 卡。

硬件計劃

還有一些組件需要完成:電池、聲音和 RGB LED。我測試了電流消耗,最大電流約為 200ma,所以我可能會使用手機(jī)電池來確保較長的電池壽命。我用來測試的揚聲器很好很薄,但它的直徑很大,我可能會貨比三家,買一個小一點的。我還需要一個指輪電位器來調(diào)節(jié)音量,我不得不求助于 ebay - 他們不再真正制造它們了,所有新東西都使用數(shù)字電位器,這只會使事情復(fù)雜化。

arduboy 上的 RGB LED 是共陽極,幸運的是,我周圍的所有 LED 都是共陰極。我想在設(shè)備的頂部或側(cè)面做一些光管設(shè)計,讓它不僅僅是一個點光源。Bezek上的光管運行良好。

對于按鈕,我計劃使用 NES 控制器維修套件中的橡膠圓頂(仍在制作新的)。我計劃將按鈕與外殼一起用鋁加工出來。

軟件計劃

我希望能夠通過按左/右鍵在菜單的不同顯示模式之間循環(huán)。一方面是純文本顯示,每個游戲的 1-5 星評級,然后是當(dāng)前名稱/屏幕截圖拆分,然后是完整屏幕截圖顯示??赡苓€有標(biāo)題屏幕顯示。

有些游戲保存高分或?qū)⒂螒虮4娴?512 字節(jié)的 EEPROM 中。我希望能夠在切換游戲時備份和恢復(fù)這些數(shù)據(jù)。

案例設(shè)計

CAD.png?auto=compress%2Cformat&w=740&h=555&fit=max

這是一個透明視圖,顯示了外殼頂部和一些內(nèi)部組件的切口。外殼設(shè)計為銑削,因此內(nèi)角需要倒圓角。

這是一個有點復(fù)雜的裝配,所以我在 3D Studio 中制作了一些模型以確保一切都合適。

Case-Render.png?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 4 ?組裝設(shè)備的渲染圖。白色條是 RGB LED 的光管。

電路板設(shè)計

PCB-Tape-Out.png?auto=compress%2Cformat&w=740&h=555&fit=max

DesignSpark PCB 布局

我使用 DesignSpark PCB 來...設(shè)計(激發(fā)?)PCB。跡線布局是手動布線和自動布線器的混合,之后會進(jìn)行調(diào)整。我在仔細(xì)檢查所有內(nèi)容時發(fā)現(xiàn)了一些錯誤,希望我都能找到它們!

我導(dǎo)出了 gerber 文件并將它們上傳到 OSHPark 進(jìn)行制造。

OSHPark-Top.png?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 2 ? OSHPark 正面渲染

PCB-Bare.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

OSHPark 的物理 PCB。

PCB-Mistake.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 2 ?安裝屏幕,間隙問題。

我犯了一個明顯的錯誤,部分電路板擋住了屏幕模塊上的某些組件。幸運的是,電路板的那部分沒有痕跡,所以只需要一點銼就可以修復(fù)它。

internals-front_dLOMWtoul2.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

組裝電子產(chǎn)品,正面

internals-rear_fEwTrnDZqN.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

組裝電子產(chǎn)品,后部

電子設(shè)備的背面。電池設(shè)計為與電線連接,但由于焊盤在 PCB 上抬起,因此連接到主開關(guān)的電線需要維修。我應(yīng)該擴(kuò)展 PCB 以從所有 4 個角支持 USB 充電模塊,并從一開始就將其粘住。

表殼加工

Case-Raw.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

剛加工完。

呃……長話短說,我用鋁加工了一個箱子。我在當(dāng)?shù)氐膭?chuàng)客空間使用了 Bridgeport V2XT。它不是這項工作的理想機(jī)器,因為主軸在 4000rpm 時達(dá)到上限 - 對于 1/8" 鋁制刀具,您確實需要 20, 000+ rpm 才能獲得適當(dāng)?shù)谋砻嫠俣取5毒邐A持設(shè)置存在一些錯誤不夠安全,最重要的是我在編程時犯了一個錯誤,所以 D-Pad 和菜單按鈕孔最終太大了。不過它仍然可以通過。

case-inside_by2uBd3sgT.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

外殼和按鈕,清理干凈。

自然地,經(jīng)過幾個小時的加工,我折斷了其中一個螺絲孔內(nèi)的絲錐。我只是把它留在那兒了。剩余的螺絲足以將其牢固地固定在一起。

case-outside_hWda4VgwVe.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

外殼的外面。

由于振動,它有點條紋。這本可以通過使用更厚的固定片或帶有定制軟鉗口的虎鉗來避免。在后面板右側(cè)的最后一次通過時,抖動特別嚴(yán)重。

assembly-1_Hbn2xiwfJh.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

1 / 3 ?按鈕到位。

Assembled.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

完畢!

在這里它已經(jīng)完全組裝好了!

Charging.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

給電池充電。

我用亞克力制作了一根導(dǎo)光管,將充電狀態(tài) LED 引導(dǎo)至外殼外部。

Light-Pipe.jpg?auto=compress%2Cformat&w=740&h=555&fit=max

燈管特寫。

當(dāng)電池充滿電時,指示燈變?yōu)樗{(lán)色。

文件

該 zip 包含 ICSP flasher arduino 項目、C++ 二進(jìn)制文件和用于轉(zhuǎn)換屏幕截圖、PCB 文件以及外殼和按鈕的 STL 文件的源代碼。

我不希望任何人能夠直接使用它,但如果您有類似的項目,它可能會對您有所幫助。

?

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費