29 Oktober 2017

DSerial EDGE Review

Struktur:
1. Überblick (mit offiziellen Funktionen)
2. Die Hardware
3. EDGE - Installation und Benutzung
4. EDGE - Kompatibilität und weitere Funktionen
5. DSerial - Installation und Testschaltungen
6. DSerial - Programmierung
7. Schlussergebnis

1. Überblick

Auf dieser Website gibt es Reviews zu allen möglichen merkwürdigen und besonderen Flashkarten: es gibt Reviews zur DS-Xtreme mit 2GB internem Speicher und tanzenden LEDs, zur MT-Card mit einem USB Anschluss und einem MicroSD Slot, zur CycloDS iEvolution die als einzige Flashkarte DSi Spiele unterstützt usw. Aber diese Karte ist wahrscheinlich noch merkwürdiger.
Bevor Microcontroller wie der Arduino oder der Raspberry Pi erfolgreich wurden war es verhältnismäßig schwer, an Geräte mit GPIO Pins zu kommen (GPIO = generic programmable input/output = gewöhnlicher, programmierbarer Eingang/Ausgang). Diese Pins können benutzt werden um viele unterschiedliche Hardwareteile anzusteuern, z.B. LEDs, Motoren, Microcontroller uvm. Diesen Mangel in der Hobbytechnikerszene haben sich einige findige Entwickler gesucht und Erweiterungen für den Nintendo DS herausgebracht, die diesen um solche Eingänge und Ausgänge erweitert. Es gab zahlreiche Module wie die DSBrut, die DSerial, die DSerial 2, die Xiltendo CPLD Starter oder die Game I/O. Jedoch haben die Erweiterungen einen Slot (den GBA Slot oder den DS Slot) blockiert sodass man eine Flashkarte für den anderen Slot benötigte oder die Karten tauschen musste um das Programm auszuführen. Dieses Problem hat Natrium42 als Einziger gelöst und die DSerial EDGE herausgebracht, die praktisch aus einer gewöhnlichen EDGE Flashkarte besteht, an die eine DSerial gepappt wurde. Dadurch hatte man Flashkarte und GPIO Erweiterung in einem und konnte die Pins viel komfortabler benutzen.
Da die Karte 2008 auf den Markt gekommen ist und seit Jahren nicht mehr produziert wurde konnte ich nur ein gebrauchtes Modul ohne Originalverpackung und female Pins ergattern.
Ein Videoreview gibt es neben dieser geschrieben Form hier.

Offizielle Funktionen (frei übersetzt, entnommen von der Electrobee Seite(down)):
-Unterstützt DS Spiele, DS I/O Lösung für nur einen Slot
-Unterstützt MicroSD Karten und MicroSDHC Karten mit besonders viel Speicher, der Reader hat keine Feder
-DLDI Autopatcher
-Unterstützt Moonshell und weitere Homebrew. Offenes I/O Interface unterstützt von Chishm's DLDI
-Benutzerfreundliches, mehrsprachiges Interface
-8051 Microcontroller, der mit 48MHz läuft (Silicon Laboratories C8051F34A)
-Vom DS aus programmierbar, Firmwares sind in der NaWiki erhältlich
-Microcontroller Firmwares haben einen offenen Quellcode
-Kostenlose Entwicklungstools sind erhältlich
-18 GPIO Anschlüsse, 2 Zustands-LEDs
-2x UART Anschlüsse (serielle Busse)
-USB 2.0 Gerät mit voller Geschwindigkeit
-PWM und ADC (analog zu digital Converter) erhältlich
-Remote GDB Debugger über USB und devkitARM
-3.3 Volt Eingang, lässt bis zu 5V zu
-Kompatibel mit DSerial 1 und DSerial 2
Hinweis: Der RS232 Level Converter und das Accelerometer wurden von älteren Modellen entfernt weil sie zu wenig mit der DSerial2 benutzt wurden. USB Features wurden nie implementiert.

2. Die Hardware


Da ich diese Karte gebraucht bekommen habe kann ich keine genauen Informationen zum Packungsinhalt geben außer dass laut dem offiziellen Shop die Karte, ein MicroSD Lesegerät und die Box enthalten sein sollen.
Die Karte selbst ist bis auf den Bereich, der oben herausschaut, ungefähr so groß wie ein DS Spiel. Die Vorderseite besteht aus einer durchgängigen Leiterplatte, aus deren Mitte ein FPGA ragt. Mit der Hilfe von drei Schrauben wird die Leiterplatte an eine Plastikhülle gehalten, die man von DS Flashkarten kennt. Über dem Plastik sieht man einige Kontakte die wahrscheinlich zum Programmieren der Karte gedacht sind, den Microcontroller der schon in den offiziellen Funktionen erwähnt wird, einen Mini-USB-Anschluss und die beiden GPIO Pinreihen. Im PCB sind allerdings nur Löcher, die Pins muss man selbst anlöten. Rechts neben dem USB Anschluss befinden sich zwei kleine LEDs, die sich an den Anschlüssen P1.0 (blau) und P1.1 (rot) befinden (mehr dazu später).
Bei genauerer Betrachtung fällt auf, dass sieben Kontakte zwischen Karte und DS eine andere Farbe haben. Dort wurden Ersatzkontakte angebracht, die wahrscheinlich für die EDGE Flashkarte und die DSerial gemeinsam benutzt werden.
Da sich der MicroSD Slot der EDGE direkt über der Leiterplatte der DSerial befindet muss man beim Entfernen der Speicherkarte relativ vorsichtig sein.

3. EDGE - Installation und Benutzung

Die EDGE ist eine low budget Flashkarte von dem Cyclops Team. Um das Review nicht zu lang werden zu lassen und der DSerial genug Aufmerksamkeit zu schenken wird das Review der EDGE etwas kürzer als gewohnt ausfallen und einige Punkte werden zusammengefasst.
Zur Installation muss man nur den Kernel auf die SD Karte kopieren. Wahlweise kann man auch noch Moonshell herunterladen um Videos, Bilder und Tondateien zu öffnen. Wenn einem der offizielle Skin der Flashkarte nicht gefällt kann man mit dem Skin Editor einen eigenen erstellen oder sich einen CycloDS Skin aus dem Internet herunterladen. Spiele oder Homebrew die man ausführen möchte müssen auch noch auf die SD Karte kopiert werden. Wenn man die SD Karte in die Flashkarte steckt sollte man darauf achten, dass man nichts an dem Teil, der aus der Karte rausschaut, kaputt macht.

Nach dem Starten der Karte wird man von dem typischen CycloDS/EDGE Menü begrüßt wo man die Auswahlmöglichkeiten "Games / Homebrew", "Media" und "Settings / Misc." hat. Mit Settings kann man die Einstellungen aufrufen (einige weniger als bei der CycloDS), mit Media kann man Moonshell starten wenn man es vorher installiert hat und mit Games / Homebrew kann man Spiele oder Homebrew ausführen. Eine Favoritenfunktion wie bei der CycloDS gibt es hier nicht.
Das ROM-Auswahlmenü hat im Vergleich zum EOS der CycloDS deutlich weniger Funktionen. Man kann nur auswählen wie die Liste mit den Spielen aussehen soll. Das Menü mit den Extrafunktionen wurde komplett gestrichen. Speicherdateien sind 512k groß. Das kann Probleme mit Flashkarten bereiten, die die Größe der Speicherdatei automatisch erkennen.

4. EDGE - Kompatibilität und weitere Funktionen

ROM Kompatibilität
Da das Cyclops/EDGE Team nicht mehr ganz bis zum Ende der DS Szene mit dabei war werden die letzten DS Spiele (wie z.B. Pokemon weiße/schwarze Edition 2) nicht mehr unterstützt. Ansonsten ist die ROM Kompatibilität relativ gut.
Homebrew Kompatibilität
- DSOrganize: Keine Probleme
- DSCraft (FAT): Keine Probleme
- DSCraft (NITRO): Keine Probleme
- Tetris Grand Master: Keine Probleme
- Spider Solitaire DS: Keine Probleme
- World of SanDS: Keine Probleme
- Scribble Jump: Keine Probleme
- Everlasting Love: Keine Probleme
- DiagnoSE: Return to Menu-Funktion funktioniert nicht

Weitere Funktionen
Neben Cheatcodes, dem Booten vom Slot-2 und einigen unterschiedlichen Sprachen (Deutsch ist nicht da drunter) unterstützt die EDGE Softreset. Dafür kann man den Hotkey L, R, A, B, X und Y benutzen. In Homebrewanwendungen funktioniert dieser Hotkey nicht.
Positiv überrascht wurde ich dadurch, dass das EZ-Flash 3in1 Expansion Pack unterstützt wird.

5. DSerial - Installation und Testschaltungen

Aufgrund der Natur der DSErial EDGE werden die folgenden zwei Abschnitte möglicherweise nicht ganz verständlich für jemanden sein, der sich noch nie mit Schaltungen und Programmieren auseinandergesetzt hat.
Die DSerial funktioniert eigentlich direkt aus der Box. Allerdings sollte man die "dserial-example.nds" einmalig ausführen bevor man die Karte für eigene Projekte benutzt, da so die Firmware aktualisiert wird. Außerdem kann man mit diesem Programm die UART-Funktionalität der Karte ausprobieren. Allerdings benötigt man UART nur um die Karte z.B. mit anderen Chips zu verbinden (beispielsweise einem Arduino, einem Raspberry Pi oder einem Lego Mindstorms). Um etwas an die Karte anzuschließen muss man sich erst einmal die Pinbelegung anschauen. In diesem Fall ist die Pinbelegung nur für die DSerial EDGE gültig.
Die Pins, die mit GND bezeichnet sind, sind direkt mit dem Ground verbunden, also der Erdung oder 0V. VDD bietet die Versorgungsspannung von 3.3V. RX0, RX1, TX0 und TX1 können für UART verwendet werden, wobei RX1 und TX1 mit einer custom Firmware für die DSerial EDGE auch als I/O Pin verwendet werden können. Pin 5 und 6 am IO2 sind unbelegt. Die restlichen Pins können als digitaler Eingang, Ausgang oder einer der Pins als analoger Eingang verwendet werden. Folgend wird es ein paar Schaltungsbeispiele für die Verwendung einer LED, eines Tasters und eines Arduinos per UART geben.
Um Motoren anzusteuern sind etwas aufwändigere Schaltungen notwendig. Deshalb gibt es dazu hier nur den Hinweis, dass die I/O Pins Eingänge von bis zu 5V vertragen. PWM (Pulsweitenmodulation, sozusagen eine LED zu dimmen oder die Geschwindigkeit eines Motors zu regeln) ist mit der normalen Firmware für die DSerial EDGE leider nicht möglich.

Einfache LED Schaltung
Da die Versorgungsspannung nur 3.3V beträgt haben auch die Pins im Gegensatz zum Betrieb mit einem Arduino oder einem Raspberry Pi nur 3.3V Spannung. Um die Spannung von 3.3V auf die von der Diode benötigte Spannung herunterzuregeln kann man einen Widerstand benutzen, den man in Reihe zwischen Diode und GND schaltet. Bei der Diode muss man noch aufpassen, dass man sie richtig herum polt (die Anode mit dem längeren Anschluss) muss an den GPI/O Pin und die Kathode (wo das Plastik etwas abgeflacht ist) muss an den Widerstand angeschlossen werden. Um den Widerstand korrekt zu dimensionieren kann man z.B. diese Website benutzen. Dort muss man als "source voltage" die 3.3V eintragen, bei "diode forward voltage" wie viel Spannung über die Diode abfallen darf angeben und bei "diode forward current" den bei der entsprechenden Spannung erlaubten Stromfluss durch die Diode. Bei falscher Schaltung einer Diode kann diese zerstört werden.
Wenn du noch keine eigene Schaltung machen möchtest kannst du auch Pin 1.0 und Pin 1.1 verwenden, an die jeweils eine Diode schon in die Karte integriert ist. Die Diode an P1.0 ist bei der DSerial EDGE blau und die Diode an P1.1 rot.
Dies war auch eine der ersten Schaltungen, die ich gemacht habe. Ein Demonstrationsvideo in dem eine LED leuchtet sobald man am DS eine Taste drückt kann man hier finden.

Taster
Um einen Taster oder einen anderen Schalter an einen GPIO Pin anzuschließen kannst du diesen Schaltplan verwenden. Dabei kann R1 beispielsweise 10kOhm = 10000 Ohm groß sein.
In dieser Schaltung ist der Eingang HIGH bzw. 1, wenn der Schalter geschlossen ist und LOW bzw. 0, wenn der Schalter offen ist.

Analoger Eingang (Temperatursensor)
Da der in der DSerial EDGE verwendete Chip nur einen analog-digital Converter hat kann man auch nur einen einzigen Eingang zu einem Zeitpunkt analog auslesen. Nacheinander kann man aber mehr als einen Eingang analog auslesen. Um z.B. einen Temperatursensor auszulesen muss man einfach nur den Pin für die Versorgungsspannung mit Vdd verbinden, den Pin für die Messung mit dem IO Pin verbinden und den dritten Pin mit dem GND verbinden. Allerdings muss man darauf achten, dass der Temperatursensor bei 3.3V funktioniert. Ich habe den TMP36 benutzt.

UART (DSerial <-> Arduino Uno)
Da der Arduino Uno mit einer Spannung von 5V läuft, der DS und die DSerial allerdings nur mit 3.3V bzw. 3V3 müssen weitere Widerstände verwendet werden. Bei Verwendung von einem Arduino der auf 3.3V Basis arbeitet kann man die Widerstände und die Verbindung von einem Datenkabel mit dem Ground weglassen. Eine bessere Lösung als die Widerstände wäre ein Level Shifter, den man allerdings extra kaufen müsste.
Wie bei jeder digitalen Datenübertragung muss man erst die Grounds miteinander verbinden. Dann kann man noch optional 3V3 mit Vdd verbinden aber das ist nicht unbedingt nötig. Außerdem muss RX am Arduino (Pin 0) direkt mit TX an einem der beiden UART Anschlüssen der DSerial verbunden werden. Dann muss hinter den TX Anschluss vom Arduino ein Widerstand geschaltet werden. Hierbei empfiehlt es sich, einen ca. 500 Ohm Widerstand (die genau Größe ist eher unwichtig) zu verwenden, den man 3x besitzt. Der Widerstand wird noch mit RX an der DSerial EDGE verbunden. Jetzt muss noch der RX-Teil von der DSerial über einen ca. 2x so großen Widerstand wie der zwischen TX (Arduino) und RX(DSerial) mit dem Ground verbunden werden. Dazu empfiehlt es sich, zwei Widerstände des schon vorher verwendeten Typs zu verwenden und sie in Reihe nacheinander zu schalten. Dadurch addieren sich ihre Widerstandswerte.
Wenn man genauere Widerstandswerte haben möchte muss man sie sich über die Spannungsteilerregel selbst errechnen.
Auch zu diesem Feature habe ich ein Video aufgenommen, das man hier anschauen kann. Dort kann man am Nintendo DS mit der Bildschirmtastatur einen Text eingeben, der dann per UART an den Arduino Uno geschickt wird wo er auf dem Bildschirm ausgegeben wird.

6. DSerial - Programmierung

Die GPIO Pins der DSerial EDGE in Programmen zu benutzen ist fast genau so einfach wie es beim Arduino ist. Allerdings gibt es keine "alles in einem"-Lösung wie beim Arduino sondern man sollte schon mit devkitPro vertraut sein. Wenn man das ist kann man sich die "card_spi.c", die "card_spi.h", die "dserial.c", die "dserial.h" und die "mcu.h" aus dem Quellcode der DSerial-Firmware herunterladen und in den eigenen Source Ordner kopieren.
Initialisierung der DSE
Mit der Zeile "#include "dserial.h" kann man die Befehle zum Ansteuern der DSerial im eigenen Programm benutzen. Um die DSerial zu initialisieren kann man nach dem Initialisieren der Standardkonsole folgenden Code benutzen:
while(!dseInit()) {
iprintf("DSerial is not inserted!\n");
iprintf("Insert DSerial and press A.\n");

while(~keysDown() & KEY_A) { swiWaitForVBlank(); scanKeys(); }
while(~keysUp() & KEY_A) { swiWaitForVBlank(); scanKeys(); }
}

iprintf("DSerial initialized!\n");
int version = dseVersion();
if(version < 2) {
printf("Version: DSerial1/2\n");
} else if(version == 2) {
printf("Version: DSerial Edge\n");
}

dseBoot();
swiDelay(9999); /* Wait for the FW to boot */
if (dseStatus() == FIRMWARE) {
iprintf("Firmware booted successfully!\n");
} else {
iprintf("Failed to boot firmware!\n");
}

Jetzt kann man noch den UART Modus der DSerial auswählen. Allerdings steht bei der DSerial EDGE nur einer zur Verfügung, weshalb sich die Auswahl erübrigt.
dseSetModes(ENABLE_CMOS);

Damit ist die DSerial EDGE aufgesetzt und kann verwendet werden.

Verwendung der GPIO Pins
Um digitale Signale zu lesen oder zu schreiben oder analoge Signale zu lesen muss man den Pin erstmal in den entsprechenden Modus bringen. Das geht mit dem Befehl "dsePinMode(port, pin, mode);". Der Port ist die erste Zahl, die bei der Pinbelegungsgrafik angegeben ist und wird mit PORT0, PORT1, PORT2 oder PORT3 angegeben. Der Pin ist die zweite Zahl (z.B. entspricht P1.2 Port 1 und Pin 2). Als Modus kann man INPUT (z.B. für Taster), OUTPUT (z.B. für LEDs) und ANALOG_INPUT (z.B. für Potentiometer) angeben. Um ein digitales Eingangssignal zu lesen kann man "dsePinRead(port, pin);" verwenden. Von dem Befehl wird ein Bool mit den Werten wahr oder falsch zurückgegeben. Um einen digitalen Zustand zu schreiben kann man "dsePinWrite(port, pin, state);" verwenden. Als Status kann man entweder true oder false angeben. Um ein analoges Eingangssignal auszulesen kann man "dsePinReadAnalog(port, pin);" verwenden. Von dem Befehl wird ein unsignierter Integer mit 16 Bit zurückgegeben.
Verwendung von UART
Vor dem Übertragen von Daten muss man erst einmal die Geschwindigkeit der Übertragung festlegen. Dazu kann man "dseUartSetBaudrate(DseUart uartPins, unsigned int baudrate)" verwenden. Bei uartPins gibt man entwder UART0 oder UART1 an, je nach dem welche UART Pins man benutzen möchte. Bei der Boudrate kann man die Geschwindigkeit angeben. Normalerweise liegt die bei 4800.
Um Daten per UART zu verschicken kann man "dseUartSendBuffer(DseUart uartPins, char * Daten, unsigned int Grosse, bool block = false)" verwenden. Unter uartPins gibt man wieder die Pins an, die man verwenden möchte. An die Daten werden die Daten die man schicken möchte als Char übergeben. Danach wird die Länge der zu übertragenden Nachricht übergeben (also die Anzahl der chars von Daten). Mit block kann man angeben, ob der DS mit der Ausführung von weiterem Code warten soll bis die Daten gesendet wurden.
Empfangene UART Daten werden normalerweise nur auf dem Bildschirm ausgegeben. Wenn man das Verhalten ändern möchte kann man "dseUartSetReceiveHandler(DseUart uartPins, void (*receiveHandler)(char * data, unsigned int Grosse))" verwenden. Dafür muss man allerdings mit Funktionspointern umgehen können deren Erklärung für dieses Review zu speziell sind. Das Gleiche gilt für "dseUartSetSendHandler(DseUart uartPins, int (*sendHandler)(void))" womit man festlegen kann ob/welche Funktion aufgerufen werden soll wenn eine Datenübertragung vom DS aus fertiggestellt wurde.

7. Schlussergebnis

Die DSerial EDGE ist eine funktionierende Kombination aus einer DSerial und einer EDGE Karte, welche einen der Hauptnachteile der DSerial ausbügelt und die EDGE um GPI/O Pins erweitert.
Für Hobbybastler ist die Karte echt gut, zum alltäglichen Zocken ist sie etwas zu groß und unhandlich. Selbst wenn man sich die Karte kaufen möchte wird es sehr schwer sein, noch eine zu finden. Gegebenenfalls sollte man sich auch überlegen, ob eine Slot-2 Variante wie die GameIO oder die Xiltendo CPLD Starter nicht sinnvoller sind.

Positiv:
-Unterstützt EDGE Kernel (ein abgespeckter CycloDS Kernel; die Cyclo-Kernel mag ich sehr gerne)
-Ermöglicht einfache GPI/O-Verwendung vom DS für Hobbybastler
-All-in-One-Lösung für den Slot-1
-Relativ einfach programmierbar
-Dem Anschein nach relativ stabiles Design
-Unterstützt das EZ-Flash 3in1 Expansion Pack
-Hat zwei UART Busse

Negativ:
-Kaum noch zu finden
-Relativ teuer
-Nur mit DS (lite) kompatibel
-Schaut relativ weit aus dem DS Lite heraus
-Man muss die "female pin headers" selbst anlöten (und meine hat jetzt "male pin headers" da ich die gerade da hatte)
-Unterstützt nicht alle neuen Spiele

Würde ich diese Karte weiterempfehlen?
Nur, wenn du sie zu Hobbybastelzwecken benutzen möchtest.

Keine Kommentare:

Kommentar veröffentlichen

EZ-Flash Parallel Review (ezflash.cn)

Struktur: Überblick Verpackung und Inhalt Qualität der Hardware Bedienung Kompatibilität Weitere Funktionen Fazit 1. Übersicht Mit Flashkart...