Arduino Stoppuhr mit 6-stelliger LED-Anzeige

Meine Kinder lieben es im Garten rumzutollen und unter anderem Hindernisparcours aufzubauen, um darüber hinwegzuspringen. Wie toll wäre es jetzt noch, wenn man seine Parcourszeiten auch messen und miteinander vergleichen könnte?
Ja klar, das geht mit einer Handystoppuhr-App, aber da muss dann immer jemand neben stehen, der die Zeiten nimmt. Dieser Jemand startet und stoppt dann jedes Mal etwas anders, was zu unsauberen Ergebnissen führt.

„Papa, können wir nicht eine Stoppuhr bauen, die automatisch startet und stoppt?“

Ich möchte Ihnen hier zeigen, wie wir so eine Stoppuhr mit Hilfe eines ATMEGA 328P Mikrocontrollers und zwei Lichtschranken realisiert haben.
Kleiner Gimmick am Rande: die Stoppuhr kann auch noch die tatsächliche Uhrzeit anzeigen.

Das Video

Im ersten Teil des Videos sehen Sie die Stoppuhrfunktion. Das kleine Spielzeugauto am oberen linken Rand setzt sich in Bewegung und durchfährt die Startlichtschranke. Darauf beginnt die Uhr den Zählvorgang. Circa 12s (genau 00:11:82) später durchfährt das Auto die Stopplichtschranke und stoppt damit die Zeitzählung. Im zweiten Teil ist die Stoppuhr in den Uhrmodus umgestellt worden und zeigt die aktuelle Uhrzeit an.

Das Projekt

Bitte beachten Sie, dass die Redaktion nicht alle hier veröffentlichten Gastbeiträge testen kann, sodass es keinerlei Gewähr gibt. Je nach Projekt und Schwierigkeitsgrad sollten Sie diese nur dann durchführen, wenn Sie über ausreichend Kenntnisse verfügen und sich im Umgang mit elektronischen Projekten sicher fühlen.

Geeignet für: Fortgeschrittene mit Löt- und Arduino-Erfahrung

Zeitaufwand: ein paar Tage

Budget: ca. 100 €

Das wird benötigt:

Die Schaltung

Die Hardware ist nicht sonderlich kompliziert. Sie besteht aus einem ATMEGA 328P und seiner Standardbeschaltung bestehend aus Quarz, den beiden Kondensatoren und ein paar Widerständen, einem Displaytreiber MAX7219 und einem Optokoppler PC847, über den die beiden Lichtschranken zum Starten und Stoppen der Uhr angeschlossen sind.
Abb. 1 zeigt den kompletten Stromlauf der Stoppuhr. Bei den Bauteilen JPxx handelt es sich jeweils um 1 mm Lötnägel, über die die Kontaktierung mit der Peripherie ausgeführt ist. Die angelöteten Drähtchen sind jeweils mit 1 mm Lötösen aufgesteckt.

Abb.1 Stromlauf der Stoppuhr (Datei auch im Download oben)

Auch das Layout kann damit relativ einfach gehalten werden und lässt sich sehr gut auf einer Lochrasterplatine unterbringen. Ich habe die Routes trotzdem zunächst als Eagle-Layout entwickelt, was die Erstellung der Schaltung auf einer Lochrasterplatine deutlich erleichtert.

In Abb.2 ist das Layout dargestellt. Blau ist die Unterseite durch die Platine gesehen, auf der die Bahnen zu routen sind. Die Oberseite (Bauteileseite) ist rot und zeigt zwei Drahtbrücken, die hier unterzubringen sind. Das IC1 (➔C1) und das IC2 (➔C2) sowie das Modul der Echtzeituhr (RTC) (➔C6) haben zur Abblockung der Versorgungspannung jeweils einen 100nF Kondensator an ihren Versorgungspins erhalten.

Abb.2 Layout der Stoppuhr (Datei auch im Download oben)

Die Anzeige

Fertige 7-Segment-Anzeigen in einer auch von weitem gut ablesbaren Größe sind relativ teuer. Einzel-LEDs dagegen, auch große wie z.B. 10 mm-Jumbo-LEDs, sind erheblich günstiger. Natürlich steigt der Aufwand zur Realisierung der Anzeige damit ein wenig an, weil man jedes Segment einzeln aufbauen muss.

Wir wollen unsere Stoppuhr sechsstellig ausführen, damit sie neben Minuten und Sekunden auch Zehntel- und Hundertstelsekunden anzeigen kann. Eine Stelle (= ein Digit) soll dabei die Größe einer Lochrasterplatine (160 x 100 mm) haben. Damit die komplette Anzeige später auch schön gleichmäßig aussieht, wurde das Design in Excel vorgeplant. Ein (quadratisches) Kästchen entspricht dabei einer 10 mm LED, die blauen Kästchen markieren die Breite der Lochrasterplatinen. Die Ausrichtung der LEDs erfolgt mal mittig, mal links auf den Platinen, damit das Gesamtbild zum Schluss wieder symmetrisch wirkt.

Abb. 3 LED Anzeige (Excel-Plan)

Weil man die LEDs auf der Lochrasterplatine aber nicht beliebig setzen kann, sondern an das Lochraster gebunden ist, wurde ein einzelnes Anzeigesegment letztendlich mit je fünf LEDs statt wie in der Excel-Darstellung mit sechs LEDs ausgeführt. Abb. 4 zeigt die komplett aufgebaute Anzeige der Stoppuhr auf sechs Lochrasterplatinen.

Abb.4 LED-Anzeige (fertiger Aufbau)

Es werden also 5 x 7 x 6 = 210 LEDs benötigt. Hinzu kommen noch die vier LEDs für die beiden Doppelpunkte, also insgesamt 214 LEDs. Die eingesetzten LEDs sollten einen möglichst großen Abstrahlwinkel besitzen, sonst kann man die Uhr seitlich nicht mehr gut ablesen. Achten Sie bei der Auswahl Ihrer LEDs auf eine ausreichende Helligkeit, wenn die Uhr auch draußen bei Tageslicht betrieben werden soll. Die hier eingesetzten LEDs sind mit einer Helligkeit von 20.000-40.000 mcd angegeben.

Das Layout für die Einzel-LED-Anschaltung ist recht einfach. Die LEDs eines einzelnen Segments werden alle parallel geschaltet. Wichtig zu beachten ist allerdings die richtige Polung der LEDs. Die Anzeige wird ja von unserem Displaytreiber im Multiplexverfahren angesteuert. Ein Blick ins Datenblatt verrät, dass der MAX7219 insgesamt acht Stück von den 7-Segment-Anzeigen treiben kann. Eine komplette Anzeige wird dabei jeweils als Digit (DIG0 bis DIG7) bezeichnet. Die einzelnen Segmente eines Digits sind dann SEG A bis SEG G. Hinzu kommt der Punkt (DP).

Und wie muss jetzt die Polung der LEDs sein? Abb.5 stellt einen Auszug aus dem Datenblatt mit den zugehörigen Segmentbezeichnungen und den technischen Erläuterungen zu Digits und Segmenten dar. Da steht, dass jedes Digit als „common cathode“, also als ein Digit mit gemeinsamer Kathode angesteuert wird. Die Minusseiten der LEDs werden also alle zusammengeschaltet und die Plusseiten jeweils als einzelne Segmente, siehe auch Abb 6.

Abb. 5 Auszug aus dem Datenblatt zum MAX7219
Abb.6 Ausführung eines Digit in LED-Form mit gemeinsamer Kathode (blaues Kabel)

An dem blauen Anschlusskabel (oben links = gemeinsame Kathode) kommen alle Minusseiten der LEDs der gesamten Platine zusammen. Dieses Kabel wird zu einem der DIGIT-Anschlüsse unseres MAX7219 geführt. Die Plusseiten der LEDs sind jeweils segmentweise parallelgeschaltet und werden dann über die Datenkabel auf die angelötete Stiftleiste geführt. Weil somit letztendlich relativ viele Anschlüsse zusammenkommen, ist die Zusammenführung zum Multiplexbaustein über einen kleinen Zwischenadapter realisiert worden.

Abb.7 Zwischenadapter, der die sechs Digits zu einem Strang bündelt und zum MAX7219 zusammenführt

Die komplette Innenansicht der Uhr ist im folgenden Bild dargestellt. Oben rechts die Hauptplatine mit dem Atmega µC, dem Displaytreiber und dem Optokoppler für die Lichtschranken. Mittig die beschriebene Zwischenadapterplatine.

Abb. 8 Innenansicht der Stoppuhr
Abb. 9 Fünf der insgesamt sechs Digits von innen gesehen

Die Lichtschranken

Die beiden Reflexionslichtschranken wurden als komplett fertige Module erworben. Man findet diese im Internet zum Beispiel unter dem Suchbegriff Reflexlichtschranke Photoelektric Sensor E3JK-R4M1 3A.
Allerdings sind sie ohne Modifikationen für unseren Anwendungsfall nicht geeignet, da die Relais auf den Lichtschrankenplatinen trotz eingebauter Freilaufdioden den Atmega bei jedem Schaltvorgang verrücktspielen lassen. Die Lichtschranken wurden also so umgebaut, dass sie statt der Relais nun die Leuchtdioden in unserem Optokoppler PC847 auf der Hauptplatine schalten. Das gefällt dem Atmega deutlich besser.
Außerdem arbeiten die Lichtschranken jetzt nicht mehr mit 230 V, sondern können ebenfalls mit unserer 5 V Betriebsspannung versorgt werden.

Achten Sie bei der Auswahl Ihrer Lichtschranken darauf, dass diese über eine optische Kontrolle zum Anzeigen des Betriebsstatus verfügen. So sollte zum Beispiel bei unterbrochenem Infrarotstrahl eine LED an der Lichtschranke leuchten. Das ist später beim Ausrichten der Lichtschranken sehr hilfreich.

Im reichelt-Shop findet man z. B. die Lichtschranke PD30CNT15PMU mit dem passenden Empfänger PD30CNT15PPRT, die Lichtschranke LS 1020 von ABUS oder die Reflexionsschranke VEL PEM10D von Vellemann, welche von der Funktion her durchaus als Alternative zu den in diesem Projekt verwendeten Lichtschranken genutzt werden können.
Auch hier müssen aber entsprechende Modifikationen durchgeführt werden, da erstens nur eine Versorgungsspannung mit 5 V zur Verfügung steht und zweitens die Schaltrelais der Lichtschranke den µC stören und daher durch elektronische Schalter zu ersetzen sind.
Man kann natürlich auf die Modifikationen bez. der Versorgungsspannung verzichten, wenn die benötigte Spannung entsprechend zur Verfügung gestellt wird. Hierzu dann die Datenblätter der Lichtschranken beachten.

Eine weitere Alternative ist der MK 120 Bausatz. Hier müsste der Summer durch eine Transistorschaltung ersetzt werden, um die nötigen Interrupts für den Arduino erzeugen zu können. Weiterhin sollten die Platinen dann in passende Gehäuse gesetzt werden, um sie im Einsatz zu schützen.

Das Gehäuse

Das Uhrengehäuse besteht aus fünf je 10 mm dicken Multiplex-Holzplatten. Die Maße der Kiste (B x H x T: 600 x 190 x 200 mm) wurden dabei so gewählt, dass die Anzeige gut Platz darin findet. Die Anzeige selber ist durch eine 3 mm dicke rote Acrylplexiglasplatte geschützt. Um die Acrylscheibe aufzunehmen wurde in die Holzplatten vorne eine ca. 4 mm breite Nut gesägt. Zum Schluss wurden die Holzplatten blau gestrichen.

Abb.10 Uhrengehäuse mit teilweise eingesetzter Acrylscheibe
Abb.11 Die komplett aufgebaute Uhr mit Anzeige der aktuellen Uhrzeit

Die Software

Die Software (SW) ist bis auf die folgenden frei verfügbaren Bibliotheken selbst entwickelt:

  • LEDControl.h (Ansteuerung des MAX7219)
  • DS3231.h (Auslesen der Echtzeituhr über I2C)
  • Wire.h (Ansteuern des I2C Busses)

Die SW darf hier also weitergegeben und genutzt werden. Natürlich darf meine SW zur Realisierung eigener Projekte angepasst und verändert werden, der Quellcode ist beigefügt und findet sich oben unter „Das Projekt“ zum Download.

Ich möchte hier kurz einige Hintergründe zu ihrer Funktion erläutern: Das Programm läuft in einer Dauerschleife, d. h nach dem Start des µC wird je nach Stellung des Auswahlschalters am sogenannten modepin (Pin 8 = Gehäusepin 14) die Uhrzeit oder die Stoppuhr angezeigt.

Es gibt vier Uhrenmodi:
0 ➔ Anzeige der Uhrzeit (ständige Abfrage der RealTimeClock)
1 ➔ Stoppuhr steht still und zeigt 00:00:00
2 ➔ Stoppuhr wurde gestartet und zählt die Zeit
3 ➔ Stoppuhr lief, wurde gerade gestoppt und zeigt die abgelaufene Zeit

Die Stoppuhr nutzt die Methode millis(). Diese zählt die Zeit seit Einschalten des µC. Mit entsprechender Zeitdifferenzbildung lässt sich damit die Stoppuhrfunktion realisieren.

Besonderheit:

Damit die Zeitmessung auch möglichst präzise von statten geht, wird sowohl das Starten als auch das Stoppen der Uhr mit sogenannten InterruptSubRoutinen (ISR) gesteuert. Ansonsten könnte der Start- und Stoppvorgang von der momentanen Prozessorauslastung abhängig sein und zu (kleineren) Fehlmessungen führen.

Die SW wurde so realisiert, dass bei Unterbrechung der Start-Lichtschranke die Stoppuhr losläuft. Nochmaliges Unterbrechen der Start-Lichtschranke hat dann keinen weiteren Einfluss. Erst wenn die Stopp-Lichtschranke bei laufender Stoppuhr unterbrochen wird, stoppt die Zeitmessung und die abgelaufene Zeit wird angezeigt. Ein nochmaliges Unterbrechen der Stopp-Lichtschranke hat dann keinen Einfluss mehr. Die Stoppuhr zeigt so lange die abgelaufene Zeit an, bis sie erneut durch Unterbrechen der Start-Lichtschranke gestartet wird. Die Uhr setzt sich dabei automatisch auf 00:00:00 und beginnt sofort mit der neuen Zeitmessung. Es muss beim Spielen also keiner ständig zur Stoppuhr rennen, um diese zu resetten.

Möchte man die 00:00:00 zu Beginn einer neuen Messung aber gerne sehen, kann das durch einen Wechsel in den Uhrmodus und dann zurück in den Stoppuhrmodus erreicht werden.

Genauigkeit

Da der Atmega 328 selber keine RealTimeClock besitzt, ist die Implementierung der Stoppuhr mit Hilfe der Funktion millis() realisiert worden, die aus dem Systemtakt gewonnen wird. Daher wurde die Uhr auch mit einem Quarzoszillator aufgebaut. Ob das nun genau genug ist, hängt immer vom tatsächlichen Anwendungsfall ab. Ich habe die Genauigkeit der Stoppuhr einmal über ½ Tag mit einer synchron laufenden Handystoppuhr vergleichen und konnte keine Abweichung feststellen. Da die hier so realisierte Stoppuhr maximal nur 59 Minuten 59 Sekunden 99 Hundertstel messen kann, erschien mir das für diesen Anwendungsfall als völlig ausreichend.
Wer eine höhere Genauigkeit benötigt, kann die mit verbaute Echtzeituhr zur Zeitmessung nutzen. Allerdings liefert diese nur Sekunden und keine Zehntel.

Die RealTimeClock, Echtzeituhr (RTC)

Wie bereits erwähnt wurde mehr als Gimmick eine kleine RTC mit verbaut, die sich über I2C auslesen und im Uhrmodus anzeigen lässt. Das hat sich als sehr hilfreich beim Testen der Anzeige erwiesen, als die Stoppuhr noch nicht richtig funktionierte. Auf die Möglichkeiten des Stellens der RTC wurde in diesem Uhrenprojekt aber verzichtet. Wenn die Uhr zum ersten Mal eingestellt werden soll, muss man das Uhrenmodul abziehen und an einen anderen Arduino hängen, auf den zuvor das Uhreneinstellprogramm geladen wurde. Es handelt sich dabei auch um eine freiverfügbare SW, die zusammen mit der DS3231-Bibliothek ausgeliefert wird. Das RTC-Modul wird nach dem Einstellen der Uhrzeit einfach auf die Pins JP30- JP33 aufgesteckt. Diese Anschlüsse sind als Stiftleiste, die genau in die Buchsenleiste des Uhrenmoduls passt, ausgeführt. Beim Anstecken des RTC- Moduls auf die richtige Polung achten!

Abb. 12 Hauptplatine mit aufgestecktem RTC-Modul

Das Netzteil

214 LEDs, die wegen der benötigten Helligkeit richtig Strom ziehen, müssen eine ordentliche Spannungsversorgung erhalten. Geht man von circa 15 mA pro LED aus, ergibt sich ein maximal benötigter Strom von über 3 A.

Warum das nicht so ist und je nach Einstellung gerade einmal 200-250 mA fließen, hat drei Gründe:

  1. Es leuchten niemals alle Segmente gleichzeitig.
  2. Wir multiplexen, d.h. die Digits leuchten einzeln sehr schnell nacheinander.
  3. Der Displaytreiber MAX7219 kann so einen hohen Strom gar nicht treiben. Laut Datenblatt liefert der MAX7219 max. 40 mA je Anzeigesegment. Benötigt man mehr Strom, müssen entsprechende Stromverstärker, z.B. ein Transistor in Emitterschaltung je Segment nachgeschaltet werden, um den Displaytreiber nicht zu überlasten.

Für unsere Zwecke hier ist somit ein normales 5 V-USB-Netzteil, welches 2 A liefern kann, völlig ausreichend. Es kann sogar noch die komplette Elektronik sowie die Lichtschranken mit Spannung versorgen.

Der Nachbau und die Kosten

Wenn Sie die Uhr nachbauen möchten, unterteilen Sie Ihr Projekt am besten in mehrere übersichtliche Schritte.

Beginnen Sie mit der Erstellung der Hauptplatine und schließen Sie daran z.B. mit Hilfe eines Steckboards erst einmal ein einziges Digit einer Standard-7-SegmentAnzeige an. Wenn Sie die gemeinsame Kathode dann z.B. an DIG0 (Pin2 des MAX7219) anschließen, sollten bei geladener SW im Uhrzeitmodus die Sekunden hochgezählt werden.
Diese Vorgehensweise hilft mögliche Fehler schneller zu finden und nicht am Ende mit einem ganzen Haufen „Nichts klappt und ich weiß nicht weiter“ zu sitzen.

Wenn Sie mit der Hauptplatine starten, sollten zunächst die drei IC-Sockel bestückt werden. Das hilft, um sich besser zu orientieren. Eine Platinengröße von 75 x 100 mm reicht aus, um die Schaltung aufzunehmen. Achten Sie aber auf genügend Abstand, um auch die Widerstände und Kondensatoren unterbringen zu können. Sehen Sie das beigefügte Layout (im Maßstab 2:1) einfach als Orientierungshilfe, es muss nicht unbedingt genauso umgesetzt werden.
Das Sockeln der ICs hat außerdem den Vorteil, dass der µC immer wieder mal getauscht werden kann, um zum Beispiel neue SW einzuspielen. Natürlich kann man das auch „On Board“ machen, wenn man die entsprechenden Pins mit rausführt (hier nicht beschrieben).

Wenn alle Bauteile untergebracht sind, geht es darum, die Verbindungen zu legen. Ich habe dazu einen geplanten Bahnverlauf zunächst immer kurz durch Verzinnen der betroffenen Kupferpads „markiert“ und dann anschließend mit Hilfe einer feinen durchgehenden Kupferlitze die Verbindungen von Pad zu Pad ausgeführt.

Wer seine Lichtschranken ebenfalls mit den 5 V aus dem USB-Netzteil versorgen kann und möchte, sollte ein paar zusätzliche Lötnägel zum Abgreifen der 5 V „spendieren“. Ich habe tatsächlich auch ein paar Pins mehr als die hier eingezeichneten verbaut. Sie sind ja lediglich parallel zu GND bzw. 5 V anzuschließen.

Sind alle Bauteile verbunden, sollte zuerst einmal die Versorgungsspannung an den IC-Sockeln (IC1 und IC2) kontrolliert werden, ohne die ICs einzusetzen. Dazu 5 V an den markierten Pins auf der Platine einspeisen und messen. Passt alles, kann die Software in den Atmega geladen werden.
Dazu ist ein entsprechender Programmieradapter oder ein Arduino- Experimentierboard nötig, mit dem der µC programmiert werden kann. Das funktioniert nicht mit dem hier beschriebenen Aufbau!
Noch nicht so erfahrene Arduino-Fans sollten vielleicht zu einem Atmega mit bereits installiertem Bootloader greifen. Ist auch das Programmieren erledigt, können die ICs eingesetzt werden. Auch hier wieder auf die richtige Polung achten!

Noch ein Hinweis zum Displaytreiber: Über den Widerstand R1 wird die Begrenzung des Segmentstroms eingestellt (s. a. Datenblatt). Mit den hier vorgeschlagenen 47 kOhm macht man nichts falsch. Wem die Anzeige zu dunkel ist, kann den Wert etwas verkleinern. 10 kOhm sollten aber nicht unterschritten werden. Es gibt noch eine weitere Einstellmöglichkeit in der SW.

Die Kosten für dieses Projekt belaufen sich auf circa 100 €. Der teuerste Posten sind die LEDs, weil man bei diesem Aufbau relativ viele benötigt. Sie können gegebenenfalls nach Sonderposten Ausschau halten.

Wer die großen Anzeigen nicht benötigt, kann natürlich auch zu den fertigen Standard-7-Segment-Anzeigen greifen. Hier nur darauf achten, dass man die Version mit gemeinsamer Kathode verwendet.

Und nun viel Spaß beim Nachbau und beim Spielen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.