Arduino Schach-Uhr

Last Updated on 21. Juni 2019 by sfambach

Beim Mittagessen mit den Kollegen ist mir eine Idee gekommen. Die beiden spielen Schach wÀhrend der Mittagspause und um das Ganze etwas spannender zu gestalten habe ich eine Schachuhr vorgeschlagen.

Somit ist die Idee entstanden eine Schachuhr bestehend aus zwei Anzeigen fĂŒr die jeweilige Uhrzeit, zwei Knöpfen zum Starten und Stoppen der Uhrzeit sowie einen Arduino fĂŒr die Steuerung zu bauen.

Funktionsweise der Uhr

Eine Schachuhr besteht meist aus zwei Uhrwerken die gegeneinander verriegelt sind. Jedes Uhrwerk zĂ€hlt die Zeit die ein Spieler braucht, um seinen Zug zu machen. Ist ein Spieler mit seinen Zug fertig, drĂŒckt er einen Knopf, die eigenen Uhr stoppt und die des Gegners zĂ€hlt weiter.

Ich hatte gleich viele zusĂ€tzliche Ideen fĂŒr solch eine Uhr und wie das mit großen Mengen an Ideen so ist, beleiben diese meist eine und werden nie umgesetzte. Also habe ich mich entschlossen einen möglichst einfachen Aufbau zu wĂ€hlen und die „Features“ auf spĂ€ter zu verschieben. FĂŒr die Schachuhr benötige ich folgende Bestandteile:

  • Arduino Uno oder Ă€hnlich
  • Prototyp Platine
  • 2x SDD 1306 Display
  • 2x Taster (beliebig)
  • Ein paar Pinheader Kabel fĂŒr den Prototypen

Nachfolgende eine kurze Beschreibung der Funktions:

  • Ein Spieler muss als erstes seine Taste drĂŒcken, um zu starten (Sagen wir Spieler 1 fĂ€ngt an).
  • Ist Spieler 1 mit seinem Zug fertig drĂŒckt er seinen Knopf (Taster 1)
  • Die Uhr von Spieler 1 hĂ€lt an und die von Spieler 2 lĂ€uft los.
  • Ist Spieler 2 mit seinem Zug fertig, drĂŒckt er seinen Knopf (Taster 2).
  • Die Uhr von Spieler 2 hĂ€lt an und die von Spieler 1 lĂ€uft weiter
  • … usw ein langes drĂŒcken (5 sec) beider Tasten setzt beide Uhren auf den Start (12:00 Uhr) zurĂŒck.

Vorarbeiten

Ich verwenden zwei SSD 1306 128×64 Pixel Displays. Wenn man keine Displays mit unterschiedlicher Adresse besitzt ist ein kleiner umbau des 2. Displays nötig. In meinem Fall war es nötig einen SMD Widerstand auf der RĂŒckseite um zu löte. Damit wird die Adresse des Displays von 0x3C auf 0x3D geĂ€ndert:

Bild des Herstellers

Praktischer sind Displays mit Jumpern, da die SMD löterei ein ganzschönes „gefriemel“ ist.

Entwicklung

Hier mĂŒssen einige Komponenten und Bibliotheken zusammen arbeiten, deshalb bin ich in zwei Schritten vorgegangen. Als erstes wurde ein einfacher Versuchsaubau mit einem Display realisiert. Dieser wurde dann im zweiten Schritt auf die beschriebene GesamtfunktionalitĂ€t erweitert.

Erster Display-Test

Im ersten Schritt wird ĂŒber einen Timer das Display angesteuert, ein Taster ermöglicht das ZurĂŒcksetzten auf 0. Hier galt es heraus zu finden wie das Display die Analoge Uhr anzeigt und wie der Timer zu implementieren ist.

Bibliotheken

FĂŒr die Display Ansteuerung werden die folgenden beiden Bibliotheken verwendet. Ich habe das SSD1306 Display schon einmal getestet den Beitrag findet ihr hier.

https://github.com/adafruit/Adafruit-GFX-Library

https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp

Verkabelung

Verdrahtung Arduino Uno mit einem Display und einem Taster
Verdrahtung Arduino Uno mit einem Display und einem Taster

Programmierung

Nachfolgend der Link zum Download des fertigen Programms. Evtl. muss die Adresse des Displays angepasst werden.

So sieht es aus

Eine Uhr, ein Taster auf Prototypplatine

Mit zwei Displays

Es folgt die Ansteuerung des 2. Displays. Der zweite Taster vervollstÀndigt die Schachuhr. ZusÀtzlich kommt der Wechsel der beiden Timer und die Reset-Funktion hinzu.

Bibliotheken

Die Bibliotheken sind die Gleichen. Ich musste jedoch die Adafruit_SSD1206.h anpassen. Damit fĂŒr beide Displays nur einmal der Speicher fĂŒr den Bildschirm reserviert wird, habe ich die buffer Variable auf static gesetzt. Der Grund hierfĂŒr ist, ich hatte versucht die Bibliothek so zu verwenden wie sie ist, allerdings reichte der Speicher meines Arduino Uno’s dafĂŒr nicht aus.

Verkabelung

Arduino mit zwei Displays und zwei Schaltern
Arduino mit zwei Displays und zwei Schaltern

Programmierung

Hier kann das Programm herunter geladen werden, ich habe es um den zweiten Taster sowie das zweite Display erweitert und hierfĂŒr die Funktionen noch etwas angepasst.

So sieht es aus

https://photos.app.goo.gl/kKm4CsZJqG3E2mxX8

Serienreife 😉

Nach prototypischen Tests mit den Kollegen habe ich alles mal in ein GehĂ€use gepackt. Bei den Tests hat sich herausgestellt, dass eine Stop Taste von Vorteil wĂ€re. Diesen plus einen An/Aus Schalter habe ich hinzugefĂŒgt. ZusĂ€tzlich gibts ein Batteriefach.

Da die Taster manchmal nur zögerlich reagieren, hĂ€tte ich diese gerne per Interrupt abgefragt. Der Arduino bietet nur zwei Interrupte diese liegen auf Pin 2 und 3. Leider habe ich die Kabel fĂŒr die Taster schon angelötet und das GehĂ€use verklebt, so dass ich zur Besserung nur das Delay von 200 Millisekunden raus genommen habe.

So sieht es nun aus

Hier der endgĂŒltige Code:

Fazit

Die Uhr funktioniert auch wenn es sicherlich besser geht. Nachdem ich sie in ein GehÀuse eingebaut habe sieht sie auch etwas besser aus ;).

Ausblick

Hier noch ein paar Ideen die ich hatte, aber wegen Zeitmangel nicht umgesetzt habe:

  • Man kann eine maximale Zeit vorgeben
    • AusprĂ€gung 1 ab dann gib es minus Punkte
    • AusprĂ€gung 2 der Zug ist um
    • Zusatz: Die jeweilige Uhr warnt n Minuten vor Ablauf der Zeit
      • ein Bildschirm flackert
      • es erklingt ein Ton
  • Ticken der Sekunden auf Buzzer/Lautsprecher ausgeben
  • Umsetzung mit einem ESP anstatt eine Arduinos und einer Statistik Website welche die Zeiten auswertet. Per Handy (WLAN) ist diese anzeigbar.

Probleme

Reset löst selbst aus

Ich hatte das Problem bei pinMode(RESET1, INPUT), dass der Reset manchmal einfach so ausgelöst hat. Deshalb habe ich den Code auf pinMode(RESET1, INPUT_PULLUP) umgestellt und frage den Taster mit !digitalRead(RESET1) ab. Dies funktioniert bis jetzt ohne Fehler.

2. Display zeigt nichts an oder Init schlÀgt fehl

Der Arduino Uno hat nicht genĂŒgend Speicher um beide Displays zu betreiben. Ich habe in Adafruit SSD1306 Lib in den Projekt Ordnern ein paar Änderungen vorgenommen, so dass der Bilschirm buffer nur einmal initialisiert wird (static uint8_t *buffer). Dies hat bei mir gereicht um das zweite Display zu betreiben.

Verwandte BeitrÀge

Quellen

https://forum.arduino.cc/index.php?topic=248603.0

https://github.com/adafruit/Adafruit_SSD1306

https://github.com/adafruit/Adafruit-GFX-Library

https://michaelsarduino.blogspot.com/2016/02/oled-analog-uhr.html

https://github.com/bitbank2/Multi_OLED

Schreibe einen Kommentar

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