Tutorial: Der Arduino Mega mit SD2IEC-Funktion

Besitzer eines Arduino Mega 2560 können diesen mit wenig Aufwand als SD2IEC-Laufwerk für den C64 verwenden. Dazu benötigt man lediglich ein Arduino SD-Shield, einige kleine Bauteile und die passende Software. In diesem Tutorial werden alle notwendigen Schritte ausführlich erklärt.

Quelle dieser Anleitung: sd2iec_mega2560 von Larswad


Bevor es losgeht, noch ein paar Hinweise (Wichtig!)
- Überprüfe sorgfältig, ob die Verdrahtung korrekt ist. Eine fehlerhafte Verdrahtung kann sowohl den C64 als auch den Arduino beschädigen.
- Stelle sicher, dass der C64 ausgeschaltet ist, bevor das IEC-Kabel angeschlossen oder getrennt wird.
- Es ist ratsam, statische Aufladungen zu vermeiden, indem man ein geerdetes Objekt berührt, wie zum Beispiel einen Heizkörper, oder ein antistatisches Armband trägt.
- Beachte, dass ich keine Verantwortung für Schäden trage, die direkt oder indirekt durch diese Anleitung entstehen.

Die Komponenten

Es werden nur wenige Komponenten benötigt und einige davon sind optional:

Arduino Mega 2560 - Auch mit Arduino-Klonen sollte es keine Probleme geben. Ich benutze ein Arduino Mega 2560 R3 von Elegoo.


Itead SD Card Shield V3.0 - Es werden auch andere SD-Shields unterstützt. Dieses Tutorial befasst sich jedoch ausschließlich mit diesem.



Die folgenden Komponenten sind optional und werden nur benötigt, wenn LEDs und Taster verwendet werden sollen.

Widerstand 330Ω x2 - Auf Wunsch kann ein höherer Widerstandswert gewählt werden, damit die LEDs nicht so hell leuchten.

Das SD-Shield

Das SD-Shield wird auf den Arduino Mega 2560 gesteckt. Achte darauf, dass die Pins des ICSP auf dem Arduino mit den entsprechenden Pins auf dem SD-Shield übereinstimmen.


Den Spannungs-Selektor belassen wir auf 3,3V.


Und anschließend entfernen wir die Jumper, falls vorhanden.

Die DIN-Buchse

An der 6-poligen DIN-Einbaubuchse können Drahtbrücken angelötet werden. Ich habe Stifte hinzugefügt, damit die Drahtbrücken einfach aufgesteckt werden können.


Schließe die Drahtbrücken nach folgendem Schema an:

Die Software vorbereiten

Die Software muss vorbereitet werden, bevor sie auf den Arduino Mega geflasht werden kann. Dafür eignet sich Linux besonders gut. Ich verwende die Linux-Distribution Ubuntu, die unter folgendem Link heruntergeladen werden kann: ubuntu.com.
Zuerst öffnen wir das Terminal, wo wir die benötigten Programme installieren. Dazu geben wir folgende Befehle ein:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get -y install git avr-libc avrdude make nano


Als nächstes laden wir die Software herunter, die später auf den Arduino Mega übertragen wird. Dazu geben wir folgende Befehle ein:

cd ~
git clone https://github.com/Larswad/sd2iec_mega2560


Im aktuellen Verzeichnis sollte nun ein Ordner mit dem Namen "sd2iec_mega2560" erstellt worden sein. Dieser Ordner wird nun geöffnet:


Dann müssen einige Berechtigungen gesetzt werden, sonst können die Skripte nicht ausgeführt werden:

chmod -R a+x scripts


Nun muss eine Option in der Make-Datei auskommentiert werden, damit das SD-Shield verwendet werden kann. Dies geschieht mit dem Nano-Editor:

nano configs/config-arduino_mega2560

Öffne die Make-Datei und suche die Zeile "#CONFIG_MEGA_SHIELD_ITEAD_V3=y". Entferne die Raute am Anfang der Zeile, um die Option zu aktivieren.


Die bearbeitete Datei wird mit der Tastenkombination STRG + O gespeichert und mit ENTER bestätigt. Mit der Tastenkombination STRG + X wird der Editor verlassen.

Kompilieren und flashen

Die Software wird mit folgendem Befehl kompiliert:

make CONFIG=configs/config-arduino_mega2560

Wenn keine Fehler angezeigt werden, haben wir alles richtig gemacht. Außerdem sollte nun ein weiterer Ordner mit dem Namen "obj-m2560-arduino_mega2560" erzeugt worden sein, in dem sich die kompilierte Firmware befindet. Diesen brauchen wir aber nicht zu öffnen. Nun ist es an der Zeit, den Arduino Mega über ein USB-Kabel mit dem Linux-Rechner zu verbinden. Danach müssen wir den Namen der seriellen Schnittstelle herausfinden, unter dem der Arduino erkannt wurde. In den meisten Fällen wird dies die Schnittstelle "ttyACM0" sein. Wer genauere Informationen benötigt, kann mit dem Befehl dmesg | grep -i tty herausfinden, welche seriellen Schnittstellen am Rechner verfügbar sind.


Nun haben wir alle Informationen, um die Daten auf den Arduino zu übertragen. Mit dem folgenden Befehl wird der Flashvorgang gestartet. Falls das Interface nicht "ttyACM0" sein sollte, muss es hier entsprechend angepasst werden.

sudo avrdude -D -p m2560 -c stk500v2 -P /dev/ttyACM0 -b 115200 -F -U flash:w:obj-m2560-arduino_mega2560/sd2iec.hex


Das war's! Der Arduino kann jetzt über ein IEC-Kabel mit dem C64 verbunden werden, benötigt aber noch eine externe Stromquelle, wie z.B. ein USB-Kabel oder ein Netzteil. Auf dem C64 sollten wir nun in der Lage sein, den Inhalt der Karte mit den üblichen Basic-Befehlen anzuzeigen:

LOAD"$",8
LIST


Die Navigation durch die Ordner und Images ist die gleiche wie beim originalen SD2IEC. Tipp: Mit Hilfe des C64-Tools FB kann man bequem durch die Ordnerstruktur navigieren.

Taster und LEDs hinzufügen (Optional)

Taster und LEDs sind nicht unbedingt erforderlich, können aber sehr nützlich sein, um festzustellen, wann auf die Karte zugegriffen wird, oder wenn Spiele verwendet werden, die auf zwei oder mehr Disketten gespeichert sind. Da die Firmware des SD2IEC integriert ist, können auch dessen Funktionen, wie z.B. die Swap-Disk-Funktion, genutzt werden. Die entsprechenden Pins für Taster und LEDs sind im Quellcode deaktiviert, daher muss die Datei "arch-config.h" im Ordner src/avr editiert werden. Ich gehe davon aus, dass wir uns noch im Ordner "sd2iec_mega2560" befinden. Öffne die Datei mit Nano:

nano src/avr/arch-config.h

Hier scrollen wir nach unten bis zu den Arduino Mega 2560 Optionen.


Wir sollten zu einem Abschnitt gelangen, der der folgenden Abbildung entspricht. Hier entfernen wir die Schrägstriche am Anfang der Zeilen. Das Ergebnis sollte wie folgt aussehen:


Dann scrollen wir nach unten zu den Button-Einstellungen. Die Schrägstriche in den folgenden Zeilen müssen entsprechend gesetzt oder entfernt werden, damit das Endergebnis dem folgenden Bild entspricht.


Die bearbeitete Datei wird mit der Tastenkombination STRG + O gespeichert und mit ENTER bestätigt. Um den Editor zu verlassen, verwenden wir die Tastenkombination STRG + X. Anschließend muss der Quellcode wie zuvor beschrieben kompiliert und auf den Arduino geladen werden. Nun schließen wir die Taster und LEDs an den Arduino Mega an. Beachtet das Schema. Das SD Shield auf dem folgenden Bild ist nicht das Itead SD Card Shield V3.0, da ich leider kein passendes Bild finden konnte. Das macht aber nichts, da die Pins und deren Bezeichnungen mit denen des Itead SD Card Shield identisch sind.


Beide LEDs sollten nach dem Hochfahren des Arduinos aufleuchten. Allerdings scheint die grüne Aktivitäts-LED invertiert zu sein, d.h. sie leuchtet nur, wenn keine Aktivität vorliegt. Bisher habe ich noch keine Möglichkeit gefunden, dies zu ändern.

Troubleshooting

Bei diesem Projekt können verschiedene Probleme auftreten. Die folgende Checkliste kann helfen, den Fehler einzugrenzen.

Die Kompilierung schlägt fehl:
- Sind die Berechtigungen für die Skriptdateien richtig gesetzt?

Der Arduino Mega lässt sich nicht flashen:
- Sind die AVRDude Parameter richtig?
- Wird die richtige serielle Schnittstelle benutzt? Stelle dies mit folgendem Befehl fest: dmesg | grep -i tty.

Zugriff auf serielle Schnittstelle nicht möglich (Permission denied):
- Versuche folgenden Befehl: sudo chmod a+rw /dev/ttyACM0.

LEDs oder Taster funktionieren nicht:
- Die Software muss neu kompiliert werden, nachdem die Einstellungen für die LEDs oder Taster vorgenommen wurden.

Der C64 hat keinen Zugriff auf die SD-Karte:
- Ist die DIN-Buchse falsch verdrahtet? Überprüfe die PIN-Belegung.
- Eine andere SD-Karte ausprobieren.
- Wurden die Jumper auf dem SD-Shield entfernt?
- Ist das SD-Shield richtig aufgesteckt? Stimmen die ICSP-Pins des Arduinos mit denen des SD-Shields überein?

Der C64 friert ein, wenn versucht wird, auf die Karte zuzugreifen:
- Wurde die Raute vor der Zeile "#CONFIG_MEGA_SHIELD_ITEAD_V3=y" entfernt?

Wenn alle anderen Maßnahmen nicht helfen, überprüfe, ob der Arduino Daten über die serielle Schnittstelle ausgibt. Installiere dazu ein Terminalprogramm, das diese Daten empfangen kann, z.B. "cu". Führe den folgenden Befehl aus, um "cu" zu installieren: 

sudo apt-get install cu

Nach der Installation verbinden wir uns mit dem Arduino: sudo cu -l /dev/ttyACM0 -s 57600 Wenn du beim Zugriff auf die serielle Schnittstelle die Fehlermeldung "Permission denied" erhältst, gib folgenden Befehl ein, um die Berechtigungen zu ändern: sudo chmod a+rw /dev/ttyACM0. Versuche danach erneut den Befehl "cu" auszuführen. Spätestens jetzt sollte die Firmware-Version des Arduinos angezeigt werden.


Wenn auf die SD-Karte zugegriffen wird, sollten auch andere Daten angezeigt werden. Ist dies nicht der Fall, könnte ein Problem mit der Firmware vorliegen oder der Arduino funktioniert nicht ordnungsgemäß.