一、動(dòng)機(jī)
自從2002年擁有第一臺(tái)GBA開始到2006年買的NDS,除了在兩上掌機(jī)上開發(fā)程序之外,一直希望能擴(kuò)展硬件做一個(gè)小車機(jī)器人。但由于當(dāng)時(shí)軟硬件知識(shí)的匱乏以及動(dòng)手能力有限,一直沒有進(jìn)展。
最近無意搜到一款幾年前發(fā)布的開源硬件DS brut,這是我目前了解的第二個(gè)開源NDS擴(kuò)展硬件。第一個(gè)是DSerial。當(dāng)時(shí)差不多2009年左右非常想買一塊DSerial,可惜人在國內(nèi)不方便國際郵購。如今這兩個(gè)產(chǎn)品都已售罄,而自己感覺DIY的能力應(yīng)該可以自己做一個(gè)以DS brut為基礎(chǔ)的擴(kuò)展,于是有了本篇博文。
二、背景
NDS硬件擴(kuò)展主要有兩種方式:(1) slot 1接口擴(kuò)展 (2) slot 2接口擴(kuò)展。前者為NDS卡接口,后者為GBA卡接口。slot 1接口只有17根線,而GBA接口則有32根線。兩種方式擴(kuò)展都有人做。
2.1、Slot 1接口擴(kuò)展
Slot 1接口擴(kuò)展主要有DS brut和DSerial。
通過查看DS brut和DSerial的電路圖,可以了解到以下幾個(gè)主要信息:
(1)DS brut用的atmega168 8位單片機(jī),
(2)DSerial用的是51系列8位單片機(jī),
(3)兩者都使用NDS的slot 1接口(NDS游戲卡接口),
(4)兩者都使用SPI接口實(shí)現(xiàn)單片機(jī)和NDS主機(jī)的通信,
(5)兩者都沒有使用slot 1接口中的D0至D5數(shù)據(jù)線作為數(shù)據(jù)交換(D6,D7為SPI總線上的數(shù)據(jù)線,即MISO, MOSI),
(6)兩者均使用slot 1接口的3.3V的VCC作為單片機(jī)電源,無需額外供電,
(7)兩者均使用CPU內(nèi)部晶振作為時(shí)鐘來源,即都沒使用外部晶振。
2.2、Slot 2接口擴(kuò)展
在youtube上還有一個(gè)人將NDS通過slot 2接口以最簡單的方式接上了Arduino,并實(shí)現(xiàn)通信,文章請點(diǎn)擊這里。該方案只使用3根信號(hào)線完成通信,方案比較簡單,但功能擴(kuò)展也相對有限。
另一個(gè)擴(kuò)展方案請點(diǎn)這里。該方案相對復(fù)雜,從標(biāo)題來看,應(yīng)該是從slot 2接口引出線后通過FTDI,即TTL串口轉(zhuǎn)USB聯(lián)接電腦進(jìn)行通信。其實(shí)方案中只要用了TTL串口,和單片機(jī)或嵌入式板子通信就無障礙了,除了通信速率問題外。
三、方案設(shè)計(jì)
以上這些信息已基本給出NDS硬件擴(kuò)展的大致方案。從容易性和擴(kuò)展功能是否強(qiáng)大來看,Slot 2的三線擴(kuò)展最容易,但功能最弱。DSerial的功能相對強(qiáng)大,但除了購買現(xiàn)成板子外,自己動(dòng)手制做難度太大,而且51系列CPU開發(fā)難度相對Arduino更高。
3.1、基于DS brut的擴(kuò)展
DS brut由于CPU采用Atmega168,并且提供了兼容Arduino的bootloader(從Lilypad版改良),因此單片機(jī)側(cè)的軟件開發(fā)將會(huì)非常容易,IDE和庫以及文檔也非常全面。再加上Atmega AVR系列單片機(jī)的最小系統(tǒng)非常簡單,幾乎只需要通電就行。因此,本方案將基于DS brut進(jìn)行擴(kuò)展,但不限制NDS卡帶的寬度,可以將單片機(jī)外接,因此可以比DS brut有更多的GPIO和其它接口。
以下是DS brut的擴(kuò)展電路:
從圖1中看以清楚看到除了220歐的R1電阻,發(fā)光二極管LED1,以及電源濾波的C1(100nf),沒有別的電子元件。而其中R1和LED1對擴(kuò)展來說不是必須,也可以去掉。因此,電路非常簡單,外行都可以DIY實(shí)現(xiàn)。
原始的DS brut為NDS卡大小,如圖2所示:
3.2、擴(kuò)展卡制做
考慮到單獨(dú)開板的成本,硬件打算簡易DIY。采用現(xiàn)成的NDS卡,但只使用引腳部分,將引腳和上部電路(卡套蓋住部分)用美工刀切斷電路連接,然后分別從每個(gè)引腳焊接引線,并從卡的上部引出。如果引線后卡套蓋不住,可考慮將原卡電路板上的芯片去掉(用電烙鐵和吸錫器)。
3.3、Arduino部分制做
由于為了電路簡單,Arduino部分電源將直接引線到NDS Slot 1的3.3V VCC。CPU理論上可以采用Atmega 48/88/168/328 系列。DS brut采用了Atmega168。采用不同的CPU在后續(xù)燒寫Arduino前需要改一下Arduino IDE對應(yīng)的board.txt文件,這主要是因?yàn)樵O(shè)置不同的CPU的Operating電壓(CPU的實(shí)際運(yùn)行電壓)需要設(shè)置CPU內(nèi)不同的fuse bit。要實(shí)現(xiàn)fuse bit的設(shè)置有兩個(gè)方法:(1)如果使用Arduino IDE進(jìn)行bootloader和程序的燒寫,需要改寫Arduino安裝路徑下的board.txt文件,添加相應(yīng)的profile。(2)如果使用avrdude進(jìn)行命令行燒寫bootloadert和程序的燒寫則可在命令行添加fuse bit的參數(shù)。但不管采用這兩種方法的哪一種,fuse bit的設(shè)置參數(shù)都應(yīng)是一致的。而具體設(shè)置可以參考Atmega48/88/168/328 的DataSheet文檔查到。
而傳統(tǒng)大部分Arduino開發(fā)板采用的是5V電源,本質(zhì)上Atmega的大部分AVR單片機(jī)可支持1.8V至5.5V輸入(具體請參考官網(wǎng),點(diǎn)這里)。不過輸入電壓和CPU的工作頻率是有一定相關(guān)性的,有一篇文章關(guān)于這個(gè)問題有較詳細(xì)的說明(請點(diǎn)這里)。Any way, 只要我們的Atmega單片機(jī)能夠用3.3V驅(qū)動(dòng)就可以了。
這里有一篇文章清楚介紹了如何設(shè)置Atmega328的fuse bits以運(yùn)行電壓在3.3V上工作,給出了具體實(shí)現(xiàn)過程:ATmega328 Fuse Bit Setting for 3.3V Vcc。
電壓問題解決后,接下來就是Arduino的bootloader。DS brut定制了一個(gè)bootloader。跟據(jù)其readme文件說明,應(yīng)該相對于Arduino的bootloader只是更改了一下WatchDog部分代碼而以。另外DS brut是采用CPU內(nèi)部晶振作為振蕩源,和Lilypad一樣。因此懷疑bootloader也是按Lilypad的版本改的,這部分我未驗(yàn)證。
關(guān)于Arduino環(huán)境中boards.txt文件(路徑為:arduino版本號(hào)/hardware/arduino/boards.txt)的各個(gè)部分的解釋可以參考這個(gè)官方文檔:Bootloader Development。
avrdude不像Arduino先燒bootloader,然后通過bootloader用串口燒寫應(yīng)用程序。avrdude是個(gè)全功能的AVR燒寫軟件,可以燒寫所有程序,包括bootloader,不過需要一個(gè)燒寫硬件,如STK500或Smart ISP programmer。兩種方式各有優(yōu)缺點(diǎn),具體可以跟據(jù)自己手上的現(xiàn)成硬件進(jìn)行選擇。avrdude的使用可以參考這篇官方教程:AVR Tutorial。
燒寫bootloader的方式,DS brut給出的是采用avrdude。而本方案將采用更方便的Arduino對燒,即需要另一個(gè)Arduino成品燒寫無bootloader的Atmega單片機(jī)CPU。這篇From Arduino to a Microcontroller on a Breadboard 給出了具體方案,同時(shí)這篇文章也給出了如何用另一個(gè)Arduino上傳編譯好的程序到獨(dú)立的CPU的方法。當(dāng)然如果你有ISP燒寫工具,也可以直接燒寫,可參考這篇文章:Minimal Arduino with ATmega8,兩篇文章都給出了修改Arduino IDE的boards.txt文件的相關(guān)信息。用Arduino給CPU燒寫bootloader和上傳程序的接線圖請見圖3和圖4。
3.4、Arduino和NDS通信設(shè)計(jì)
Arduino和NDS通信通過SPI接口完成。Arduino部分對SPI編程實(shí)現(xiàn)非常方便,IDE內(nèi)部的有庫直接支持,直接使用即可。示例代碼可以參考DS brut的dsbrut_arduino.txt文件。
NDS部分則相對復(fù)雜一些,需要寫驅(qū)動(dòng)代碼。當(dāng)然DS brut也已經(jīng)提供了,分別為uart, spi, brut部分。也可以參考源碼。NDS部分的編譯好的程序需要放到Slot 2接口的燒錄卡上運(yùn)行,因?yàn)镾lot 1已用來擴(kuò)展。NDS部分的程序開發(fā)可采用DevkitPro。libnds等庫也都非常實(shí)用,可以快速開發(fā)實(shí)現(xiàn)功能。另外,如果NDS程序涉及到FAT文件讀寫別忘了打DLDI補(bǔ)丁就行。
NDS端的驅(qū)動(dòng)部分代碼可以預(yù)先編譯成庫,并將頭文件和庫文件分別放到devkitARM對應(yīng)的目錄里,方便以后使用。
另外DS brut提供了Demo Project。這個(gè)section的詳細(xì)內(nèi)容需要到實(shí)現(xiàn)方案后再能詳述。至此先這樣。
四、應(yīng)用
采用本方案實(shí)現(xiàn)NDS擴(kuò)展,對于擴(kuò)展出來的單片機(jī)端更新程序也方便,對于NDS端的開發(fā)和以往一樣。應(yīng)用實(shí)例基本上所有單片機(jī)能做的這個(gè)方案都可以實(shí)現(xiàn)。另外還有以下幾個(gè)主要優(yōu)點(diǎn):
(1)NDS的主CPU為32位68MHz的ARM 9,處理能力比單片機(jī)更強(qiáng),可以處理一些由單片機(jī)傳回來的較為復(fù)雜的數(shù)據(jù)和運(yùn)算,
(2)NDS端的程序在Slot 2,可以使用大容量的SD卡作為數(shù)據(jù)存儲(chǔ),
(3)NDS擁有WiFi,可以聯(lián)網(wǎng),有更多開發(fā)的可能性,比如遠(yuǎn)程控制,無線數(shù)據(jù)傳輸,
(4)NDS擁有兩個(gè)LCD,可以顯示很多信息,其中一個(gè)可觸摸,
可以實(shí)現(xiàn)以下幾個(gè)應(yīng)用:
(1)把NDS當(dāng)作電腦的游戲手柄,或電腦鍵盤
(2)帶LCD狀態(tài)顯示的智能小車,可無線遙控
(3)通過NDS控制各種外設(shè),如用觸摸屏控制4*4*4,或8*8*8的LED立方顯示任意圖案
(4)太多了...
有空我將實(shí)現(xiàn)本方案,敬請期待!