Arduino Eigenbau

Nachbau des Arduino Diecimilia mit ATMEGA168 und 16MHz Quarz


Bild "Arduino_Offen.jpg"

Arduino für weniger als 10 Euro

Natürlich sind die Arduino Boards in der Preisklasse zwischen 25 und 50 Euro sowieso nicht sehr teuer. Dennoch geht es noch günstiger durch Selbstbau. Außerdem durchblickt man das Teil danach komplett und man kann dann spezifische Schaltungen bauen, in denen die Atmel MCU mit dem Arduino Betriebssystem verbaut wird, Das habe ich zum Beispiel bei meiner Tragflächenschneidemaschine genutzt PC Hotwire.

Was ist Arduino

Im Grunde bestehen die Arduino Boards lediglich aus einem Atmel ATMega Mikrocontroller mit einem speziellen Bootloader. Dazu gibt es dann eine sehr einfache IDE, mit der man in einer Art Java-Dialekt die Programme schreibt und in den Controller lädt. Die Programmiersprache heißt Processing und ist sehr gut auf Echzeit-Programmierung vorbereitet. Alles ist Open Source und bei http://arduino.cc zu bekommen.
Die Arduino Boards werden per USB mit dem PC verbunden. Im Grunde ist das aber nur eine Emulation der Seriellen Schnittstelle. Auf meiner Arduino Version verwende ich die RS232 Schnittstelle des ATMega168 direkt, da mein PC noch diese alte Schnittstelle besitzt. Man kann aber auch ein USB-zu-RS232 Kabel verwenden, wenn der PC kein RS232 mehr hat.

Die IDE für PC/MAC/Linux
Bild "Arduino_IDE.jpg"

Was beachtet werden muss, damit alles funktioniert:


1. Programmierkabel für das einmalige Schreiben des Bootloaders

Damit sich der Prozessor über die serielle Schnittstelle ohne Programmiergerät programmieren lässt, muss zuerst ein Bootloader im Microcontroller installiert werden.
Hierzu braucht man dann ein Programmierkabel und die SW avrdude.

Programmierkabel für die Druckerschnittstelle (von Arduino Homepage):
Bild "Arduino_Programmer.jpg"

Wichtig: Bei mir hat das nur funktioniert, wenn ich abweichend vom Bauvorschlag bei arduino.cc statt 470 Ohm 220Ohm genommen habe und den 220 Ohm Widerstand durch einen 100 Ohm Widerstand ersetzt habe. Siehe Zeichnung.

2. Brennen der Fuses mit AVRDUDE:

Der ATMega muss dabei mit dem ISP Kabel an den Parallelport (Drucker) des PCs angeschlossen sein. Die serielle Verbindung sollte entfernt sein. Bei mir war es besser, wenn die LED an Pin 13 (Port B5) abgeklemmt war.
Die 5V Spannungsversorgung vom externen Netzteil wird hierbei auch gebraucht.

Wenn man mit Linux arbeitet, muss man die folgenden Befehle mit sudo ausführen.
Beim Windows PC (Windows XP) muss man getio installieren (dazu gibt es eine .bat Datei im Installationsverzeichnis von avrdude).

avrdude -i 40 -c dapa -p m168 -F -U lfuse:w:0xFF:m

avrdude -i40 -c dapa -p m168 -F -U hfuse:w:0xDD:m
Im Auslieferungszustand steht da 0xDF drin, das kann man auch so lassen. Funktioniert auch.

avrdude -i 40 -c dapa -p m168 -F -U efuse:w:0x00:m
Im Auslieferungszustand steht da 0x01 drin. Wenn man das so lässt, dann startet der Arduino nach dem ersten mal Schreiben eines Anwenderprogramms immer dieses Programm wieder aber nicht mehr den Bootloader. Also auf 0x00 programmieren.

Die Optionen bedeuten:
-c dapa Parallelprogrammer (Kabel siehe Zeichung)
-p m168 ATMEGA168
-F        Wichtig: Ich habe statt ATMEGA 168 einen ATMEGA 168p
          verwendet. Der liefert eine andere Signatur zurück und avrdude
          verweigert das Programmieren. Mit -F ignoriert man die Signatur.
-i 40     Diese Option fügt 40us Wartezeit zwischen den Datenbits ein.
          Das benötigt man auf jeden Fall für schnelle PCs.
          Bei einem Uralt-PC kann man diese Option vermutlich weglassen.
          Ist diese Option nicht oder falsch gewählt, dann kommt es zu keiner
          stabilen Übertragung und avrdude kommt mit einer Fehlermeldung zurück.

3. Brennen des booloaders:

avrdude -i 40 -c dapa -p m168 -F -U flash:w:ATmegaBOOT_168_diecimila.hex

Den findet man hier: <home>/arduino-0021/hardware/arduino/bootloaders/atmega/

4. Rettung bei falschen fuses:

Im Auslieferungszustand taktet sich der ATMEGA selber. Wenn man was Falsches in die hfuse programmiert, kann es passieren, dass weder der angeschlossene Quarz noch der interne Oszillator funktionieren. Dann kann man noch nicht einmal mehr die fuses schreiben und man hat sich ausgesperrt.
Abhilfen:
- 2MHz Kalibrierausgang vom Scope mit 2V swing anlegen an XTAL1.
     - oder -
- Selbstschwingender Quarzoszillator 4MHz an XTAL1 anschließen.
Mit diesen externen Taktquellen reagiert er wieder, egal, wie hfuse programmiert ist.

5. Sonstiges

In den Foren liest man. Dass es sehr wichtig ist, einen 100nF Kondensator von VCC nach GND nah am ATMEGA zu platzieren. Bei mir ging's auch ohne aber sicher ist sicher.

Schaltplan des Selbstbau-Arduino

Im Wesentlichen habe ich mich an die Schaltung des Arduino Diecimilia angelehnt. Der MAX232 wandelt die TTL pegel des ATMega in RS232 Pegel. So kann mein Arduino mit einem PC mit serieller Schnittstelle kommunizieren oder per Seriell-zu-USB auch mit PCs, die nur noch USB haben.

Minimalschaltung: Hier kann man jetzt einfach Steckerleisten an die IO-Pins des ATMega legen oder eine Anwendungsspezifische Schaltung.
Bild "Arduino_minimal_klein.png"

Hochauflösendes Bild: Arduino_minimal.png

Ich habe das dann gleich noch in eine schickes Blechgehäuse gepackt, dass von einem Reisemühlespiel stammt.

Bild "Arduino_Offen1.jpg"  Bild "Arduino_zu.jpg"

Damit alles zusammenbleibt spendierte ich noch eine Holzkiste, die man billig auf Flohmärkten bekommt. Darin werden üblicherweise Messgeräte verpackt und man ersteht sie für 5 Euro.

Bild "Arduino_Kiste_zu.JPG"   Bild "Arduino_Kiste_auf.JPG"

Nützliche Links:


Die offizielle Homepage
http://www.arduino.cc

Für Selbstbauer
http://www.arduino.cc/en/Hacking/HomePage
http://www.arduino.cc/en/Hacking/ParallelProgrammer

Gut dokumentierter Arduino-Nachbau
http://shackspace.de
http://shackspace.de/wiki/doku.php?id=project:shackuino

Alles über Fuses beim ATMEGA
http://electrons.psychogenic.com/modules/arms/art/14/AVRFusesHOWTOGuide.php

Mehr dazu auch in der Make 4/2015 ab Seite 94
Bild "Arduino_Titel.png"

Heft kaufen: http://www.heise.de/make/inhalt/2015/4/94/

Nachtrag: Mit Arduino als ISP ATTiny45/85 programmieren


Hierbei wird der ATTiny45 direkt geflashed also kein Bootloader darauf geschrieben - das würde vermutlich auch nicht ins knappe EEPROM passen.
Das ganze ist sehr schön hier dokumentiert:
http://highlowtech.org/?p=1695

Daher hier nur mal kurz die Schritte:

1. Die aktuelle Arduino-IDE runterladen (https://www.arduino.cc/) und installieren (ab 1.6.0)


2. Die ATTiny-Erweiterung im Boardmanager installieren

Dazu zunächst mal unter Voreinstellungen im Feld "Zusätzliche Boardverwalter-URLs" diese URL einfügen:
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
Danach unter Werkzeuge/Board den Boardverwalter starten und dort ganz unten in der Liste den ATTiny auswählen und installieren.

3. Arduino in ISP verwandeln

Die dazu benötigte Sketch findet sich im Standardpaket unter "Beispiele". Hierzu muss natürlich als Board dasjenige ausgewählt sein, das angeschlossen ist. Also nicht etwa irgendwas mit ATTiny. Das kommt später.

4. Den ATTiny anschließen

Ist hier auch sehr schön gezeigt: http://highlowtech.org/?p=1706

5. Den ATTiny Programmieren

Hierzu als Board z.B. den ATTiny45 auswählen. Dann noch den internen clock (1MHz). Hier wird auch externer Clock angeboten. Den auf keinen Fall wählen, sonst reagiert der ATTiny danach nicht mehr.
Nun die gewünschte Sketch laden (z.B. Blink.ino) und dann ganz normal mit dem upload Knopf in der IDE zum Mikrocontroller laden.
/!\ Die Pins des ATTiny45 haben eine andere Nummerierung:
IC Pin 1 = RESET
IC Pin 2 = Analog Input 3 (Pin 3)
IC Pin 3 = Analog Input 2 (Pin 4)
IC Pin 4 = GND
IC Pin 5 = Pin 0 (PWM)
IC Pin 6 = Pin 1 (PWM)
IC Pin 7 = Analog Input 1 (Pin 2)
IC Pin 8 = +5V

In der "Blink" Sketch muss also Pin 13 auf irgendwas zwischen 0 und 4 umbenannt werden.

/!\ Hinweis: Mit einem Arduino UNO als ISP ging das problemlos. Ein Leonardo dagegen hat sich verweigert.

Bild "Arduino_ATTiny.jpg"

/!\ Für den Programmiervorgang des ATTiny muss beim Arduino, der als ISP fungiert, ein 10uF Kondensator zwischen Reset und GND geschaltet werden. Dieser verhindert, dass der Arduino einen Reset-Impuls bekommt, was dazu führen würde, dass er selber in den Upload Modus geschaltet würde. Der soll aber ja seine ISP-Sketch ausführen.