Dartscheibe mit PC verbinden!

Hallo,

ich spiele seit einigen Jahren Dart und habe seit längeren das Ziel meine Dartscheibe mit dem PC zu verbinden. Ich sage es lieber gleich meine Kenntnisse in Bezug auf Elektronik und Controller sind minimal da ich eigentlich aus dem Kaufmännischen Sektor komme. Nach längerer Recherche habe ich sogar einiges zu diesem Thema gefunden. Auch fertige Projekte die ich auch versucht habe nachzubilden aber zu keinem Erfolg gekommen bin. Ich weiß dass mit Hilfe eines Controllers die Sache funktionieren kann aber mein Versuch ein Controller mit Hilfe von Compiler Sprache ist auf Grund von mangelnden Kenntnisse und mangelndes Verständnis gescheitert. Dann habe ich das Projekt Arduino gefunden und habe sogar meine ersten erfolgreiche Versuche hinter mir. Jetzt glaube ich dass mir mein Projekt gelingen könnte. Würde mich aber gerne im Vorfeld nochmals absichern ob ich auch wirklich alles verstanden habe und mich auf dem richtigen Weg befinde.

Nun zu meinen Fragen:

  1. Ziel: Ich möchte die Signale der Dartmatrix in den PC zu bekommen. Die Matrix die ich derzeit zur Verfügung habe ist eine 10x7 Matrix.

Herangehensweise: Ich definiere 10 Digitalports als Output HIGH und 7 Digitalports als INPUT. Da die Matrix ähnliche Reaktionen wie Taster hervorruft setzte ich die INPUT Eingänge mit DEBOUNCE auf HIGH. Ein Treffer kann ich feststellen in dem ein OUTPUT sowie ein INPUT Signal auf LOW wechselt. Ähnlich wie bei einer LED Matrix habe ich auch hier eventuell Problem diesen Zustand richtig zu erkennen und dafür beabsichtige ich das hinzuziehen von Interrupts.

Frage: Bin ich soweit auf dem richtigen Weg?

  1. Ziel: Ich möchte den Treffer per serielle Schnittstelle an den PC senden!

Herangehensweise: ich bediene mich den Seriellbeginn().

Frage: Muss ich auf die Höhe der Datenrate aufpassen?

  1. Ziel: Ich möchte die gesendeten Werten via PHP empfangen und auslesen!

Herangehensweise: ich greife per php mit der get() methode das Signal ab!

Frage: Kann ich das überhaupt so realisieren oder soll ich mich einer anderen Sprache zuwenden! Hierzu noch ein Hinweis: Endziel soll sein das ich mit einem Freund über das Internet spielen will!

Mir geht es erstmal darum ob ich mich in die richtige Richtung bewege. Für alle Tipps wäre ich euch sehr verbunden!

Danke schon mal im Voraus

Onliner

1.Zwischenbericht:

Ich habe meinem Dart Board die Elektronik entfernt und von der Platine die Buchsen für Folienleiter der Platine entfernt. Anschließend habe ich die Buchsen auf einer Lochrasterplatine angebracht. Ebenfalls habe ich Schraubklemmen angebracht und jeden Kontakt mit einem Kontakt der Buchsen verbunden. Anschließend habe ich die Kontakte durchgepipst ob nicht Kontakte kurzgeschlossen sind oder ich eine kalte Lötstelle habe. ("TIPP: Ich braucht echt vieelllll Geduld und ruhige Nerven bei dieser Lötgeschichte. Zumind. wenn Ihr wie ich Kaufmann seit").

Nach dem gestern mein Arduino Mega Board gekommen ist habe ich auch gleich versucht einen ersten Test zu starten. Um nicht gleich alles so kompliziert zu machen wollte ich nicht gleich alle 10*7 an Arduino anschliessen, sondern habe erst ein Output und ein Input an digitale Ports gehängt. Habe im Arduino(IDE) ein kleines Testprogramm geschrieben.

Ziel sollte sein das ich wenn ich auf das Segement auf dem Board drücke ein Serial Signal an den PC gesendet wird und ich auf dem Seriell Monitor ein Treffer erkenne. Leider hat es nicht funktioniert. :-(

include

int out = 40; int in = 22;

Bounce bouncer = Bounce(in,20);

void setup() { Serial.begin(9600); pinMode(out, OUTPUT); pinMode(in, INPUT); digitalWrite(in, HIGH); }

void loop() {

digitalWrite(out, HIGH);

bouncer.update(); int tasterval = bouncer.read();

digitalWrite(in, LOW);

int test = digitalRead(out);

if (test == LOW) { Serial.println("Treffer"); delay(1000); } }

Ich gehe von folgender Funktion der Matrix aus. Es gibt Zeilenleitungen(10) und Spaltenleitungen(7). Die Zeilenleitungen werden auf 1(high) gesetzt und die Eingänge werden mit PULL UP wiederstände auch auf logisch 1(high) gesetzt. Jetzt setze ich die Spaltenleitung auf 0 und wenn nun ein Treffer kommt wird die Zeilenleitung auch zu nullgezogen! Ich erkenne somit einen Treffer in dem ich die Zeilenleitungen überprüfe und auf 0 warte. sobald dies geschehen ist habe ich zwei werte(Zeile/Spalte) um den Treffer im PC deutlich zuzuweisen.

Vieleicht kann das Problem daher resultieren wegen dem kurzen Signal von 400-4000µs. Ich wollte derzeitig noch die Verwendung von Interrupts vermeiden. Darum mein Gedankengang den Treffer zu simulieren. in dem ich die Drähte von Pin 40 und 22 kurz berühren lasse aber meine Angst ist das ich damit den Controller schaden könnte.

Abschlussfragen : 1. Habe ich die Funktion der Matrix soweit richtig verstanden? 2. Und wenn ja kann ich die Treffersimulation durchführen ohne dabei den Controller zu beschädigen?

Vielen dank im Voraus!

Bouncer ist vom Datentyp Bounce. Nur was für ein Datentyp ist Bounce und welche Eigenschaften hat er ?

Zumindest wird ein derartiger Datentyp nicht in der Arduino Reference beschrieben oder erwähnt !

Dementsprechend kann das Programm auch nie auf einem Arduino gelaufen haben !

Der Datentyp (Äpfel, Birnen) ist falsch deklariert. Nimm int, byte, long, unsigned long, aber kein "Bounce", das gibts nämlich nicht.

@Megaionstorm, apogee Schon mal was von der Bounce Library gehört? Ist im Playground zu finden.

@mafu

das wäre logisch gewesen, wenn er die Bounce-Library eingebunden hätte. tut er aber nicht (include null).

Im jetztigen Beispiel ist Bounce ein Datentyp, und damit sind beide Antworten komplett korrekt.

Vielleicht hat er auch nur den Sourcecode nicht vollständig gepostet ;D
Immerhin hat er nichts davon geschrieben, dass sich das Programm nicht compilieren ließe.

Ja, die Fehlerangabe ist sehr ausführlich.

Leider hat es nicht funktioniert.

@campergue

Schaden wirst du deinem Board nicht damit, da es ja "boardeigene Spannung" ist. Wenn du ganz sicher sein willst nimm noch einen Widerstand mit rein.

Hallo,
ohne jetzt den gesamten code genau angeschaut zu haben, fehlt in der
#include-Zeile die Library.

Müßte so ergänzt werden:

#include <Bounce.h>

Natürlich muß die Library auch im entsprechenden Verzeichnis sein.

Gruß Klaus

Nur sollte man für das Verständnis des Programmes auch die Funktion einer eventuell nicht included Bounce-Library kennen !

Hey alle,

erstmal tausend dank an alle bisherigen Antworten!

Es ist wie MAFU bereits vermutet hat wurde es beim Kopieren nicht übernommen. Ich habe die Bounce Bibliothek in der Libary entpackt und habe Sie auch wirklich included. Die Bounce Bibiliothek ist der Debounce Bibiliothek sehr ähnlich (glaube ich). Habe ich aus dem Buch Arduino Praxiseinstieg. ich kannte es bisher aus dem Arduino für Bastler als Debounce. Da aber das Praxiseinstieg neuer ist dachte ich das Bounce die neuere Version ist.

ich glaube eher mein Problem kommt daher das ich die Funktion der Dart Matrix falsch verstanden habe. Alle Beispiele wo ich im Internet finden konnte hatten immer den gleichen Ansatz. Die Matrix mit den Zeilen/Output und Spalten/Input direkt an den Controller zu fahren. (“schon hier fehlt mir persönlich eigentlich die Verbindung der Masse/GND”). Jedoch wird auch immer von einen Kurzschlusseffekt gesprochen und somit gibt es für mich wieder ein Sinn denn ein Kurzschluss kommt ja zur Stande bei gleichpoligen Anschlüssen. Das Verhalten ähnelt anscheinend einer Tastatur.

Siehe zitat aus einem Forumsbericht:
Eine Dart-Matrix an einen Tastaturkontroller anzuschliessen ist von der elektrischen Seite möglich, aber nicht sinnvoll.

Beim Eintreffen eines Dart auf die Matrix schließt der Dart den Kontakt der Matrix für 400-4000 µs. (Mikrosekunden; 1/1000000 Sekunde)

Der Tastaturkontroller erwartet das die Zeit im Millisekunden-Bereich liegt.
(Millisekunde; 1/1000 Sekunde) D.h. der Tastaturkontroller bekommt die meisten Würfe nicht mit.

Desweiteren wird beim Eintreffen des Darts nicht nur ein Kontakt geschlossen, sondern mehrere. (Mit diesem Problem kann der Tastaturkontroller nicht umgehen.) D.h. falls der Tastaturkontroller einen Wurf mitbekommt, erkennt er direkt mehrere “Tasten”).

Das sichere Erkennen eines Darts, und das sichere feststellen um welches Segment es sich handelt ist nicht einfach. Diese Aufgabe übernimmt der Mikrocontroller auf der Interface-Platine.
ZITAT ENDE

AUSZUG AUS EINER TECHNIKERARBEIT
Meine zwei Wurfmatten der Dartscheibe bestehen aus einer 10 Spalten und 9 Zeilen Matrix.
Die Zeilenleitungen liegen direkt auf dem Port2 des [ch956]Controller und die Spaltenleitungen
führen an die Ausgänge Y0-Y8 des Decoders. In meinem Programm wird fortlaufend mittels
eines Zählers immer nacheinander einer der neun Ausgänge auf null gelegt. Die
Zeilenleitungen sind hardwaremäßig mit ?Pull up“ Widerständen auf ?logisch eins“ gelegt.
Wird nun ein Kontakt durch einen geworfenen Pfeil ausgelöst, der auf eines der 82
Segmente trifft, wird die entsprechende Zeilenleitung ebenfalls auf ?logisch null“ gezogen.
Danach erfolgt die Auswertung der aktuellen Zeilen- und Spaltenleitung durch das Programm.
AUSZUG ENDE

Denn Umweg auf den Decoder erfolgt auf Grund von Portmangel. Falls es hilfreich ist kann mann die ganze Dokumentation hier finden : http://www.technikerschule-konstanz.de/Dartscheibe.pdf

Um es auf einen Punkt zu bringen. Bisher habe ich nur für mich normale Schaltungen aufgebaut. wo +/- und eventuell ein Steuersignal vorhanden war so das entweder war der Stromkreis geschlossen und dann leuchtete die LED oder es war unterbrochen und es leuchtete nicht. Auf jedenfall immer ein Zustand den ich Testen und mir seriell zusenden konnte. Ich glaube hier liegt der Unterschied an der Reaktion. Hier ist die Reaktion ein sogenannter Kurzschluss und dieses Zustand sollte aber der Controller feststellen können. Nur habe ich noch nicht kapiert wie und womit.

So habe ich das bisher Verstanden >> Ich habe zwei Sensorfolien die getrennt durch eine weitere Folie(bei Kontakten gelocht) aufeinander liegen. Die untere Folie sind meine INPUTS und die obere Folie sind meine OUTPUTS. Ich lege die OUTPUTS auf HIGH und meine INPUTS lege ich durch den PUT UP (BOUNCE) auch logisch auf HIGH (gestestet mit Messgerät wenn ich GND mit jeweils dem dem OUTPUT oder INPUT verbinde habe ich eine Spannung von 5V). Wenn nun ein Pfeil auf das Board kommt beruht nun der obere Folienkontakt den unteren und das führt zu einem Kurzschluss.(“bis dahin glaube ich alles richtig verstanden zu haben”). Aber nun wie kann ich diese Reaktion festhalten. Ich ging davon aus das bei einem Kurzschluss der OUTPUTPORT auf LOW wechseln. Vom Programm her weiß ich den INPUTPORT weil ich diesen ja auf LOW ziehe. Wenn ich nun die OUTPUTPORTS abfrage und dieser PORT auf LOW wechselt kann ich davon ausgehen das ein Treffer erfolgt ist und ich mir den INPUTPORT und den OUTPUTPORT mir seriell zusenden kann. Aus dieser Kombination kann ich dann festellen welches Feld es war.<<

Es wäre ja zu schön wenn alles gleich von anhieb gehen würde. Aber wenn ich dieses Problem gelöst habe dürfte der Rest kein Problem mehr sein.

Also bitte ich brauche eure Hilfe!

Gruß Patrick

Hallo an alle

ich habe einen ersten Teilerfolg zu verzeichnen. ich habe mit der Simulation das Ergebnis erlangt wie ich mir das vorstelle.

Mein Fehler war das ich die Output ausgänge nacheinander auf LOW schalten muss und nicht die INPUTS. und somit auch nicht die OUTPUT abfragem sondern die INPUTS. Hier nun der funktionierte Sketch

int out[10] = {40,41,42,43,44,45,46,47,48,49};
int in[7] = {22,23,24,25,26,27,28};

void setup() {
Serial.begin(9600);
for (int i=0; i < 10; i++) {
pinMode(out*, OUTPUT);*
}
for (int i=0; i < 7; i++) {
pinMode(in*, INPUT);*
digitalWrite(in*, HIGH);*
}
}
void loop() {

for (int o=0; o < 10; o++) {
* digitalWrite(out[o], LOW);*

* for (int i=0; i < 7; i++) {*
_ int test = digitalRead(in*); *_

* if (test == LOW) {*
_ Serial.println(in*);
Serial.println("-");
Serial.println(out[o]);
delay(1000);
}
}
digitalWrite(out[o], HIGH);
}
}*

in der Simulation habe ich nun jeweils ein Draht in einen INPUTport und ein Draht in einen OUTPUTport gesteckt. wenn ich nun kurz beide Drähte zusammenbringe bekomme ich den jeweiligen I und O Port seriell an den monitor ausgegeben. Somit kann ich erkennen welches Segment ich getroffen habe.
Puhh das wäre mal geschafft.
Aber es geht nun ja weiter. Und davor habe ich schon ein wenig angst. Ich versuche nun mein Board direkt zu schalten. Ich befürchte nur auf Grund der Kürze des Signals wird es ARDUINO nicht merken!
Für solche Aufgaben sollte ich dann Interrups verwenden oder?
Hat jemand Tipps oder Ratschläge was ich beachten soll mit der Verwendung von Interrupts?
In den Büchern wird nur leicht das Thema angeschnitten und eigentlich Anfängern geraten die Finger weg zu lassen!
und was meint ihr?
Danke schon mal im Voraus!_

Debounce = Schalter Entprellen http://arduino.cc/en/Tutorial/Debounce

Button State Change Detection: http://arduino.cc/en/Tutorial/ButtonStateChange

Language Reference: http://arduino.cc/en/Reference/HomePage

Was du auf jeden Fall machen musst ist die delay Anweisung aus dem Programm nehmen musst denn an dieser Stelle wird das ganz Programm in jedem Fall um 1 Ssekund angehalten und du bekommst nichts mehr mit was sich an deinen Eingängen tut. Bei sowas “Zeitkritischem” musst du auf jedem fall mit millis() ähnlich wie bei dem Beispiel Blink without delay machen.

hey

ich habe das delay benötigt wegen der Simulation. Ich habe immer mind. vier bis fünf mal serielle info´s bekommen.

So aber ich bin noch mal ein schritt weiter. Ich hatte gerade das Board live dran und es hat gefunkt zumindestens wenn ich die Segmente mit der Hand reindrücke. Ich habe die Werte bekommen ohne irgendwelche weitere Anpassungen. Eigentlich ging mir das jetzt zu gut. Ich vermute aber mal wenn ich das Board aber mal richtig an der Wand hängen habe und mit den Pfeile schmeiße das ich dort und da noch eine Überraschung bekomme.

Aber für heute bin ich super glücklich wie der derzeitige Stand ist.

Vielen dank an alle .

Gute nacht

Debounce = Schalter Entprellen http://arduino.cc/en/Tutorial/Debounce

Diese Lösung verwendet keine Debounce-Bibliothek.

Ich habe die Bounce Bibliothek in der Libary entpackt und habe Sie auch wirklich included. Die Bounce Bibiliothek ist der Debounce Bibiliothek sehr ähnlich (glaube ich). Habe ich aus dem Buch Arduino Praxiseinstieg. ich kannte es bisher aus dem Arduino für Bastler als Debounce. Da aber das Praxiseinstieg neuer ist dachte ich das Bounce die neuere Version ist.

Die Bounce-Library ist der Nachfolger der Debounce-Library. Ich bin der Autor vom erwähnten Buch "Arduino Praxiseinstieg" und zum Zeitpunkt als ich das Buch geschrieben habe, war die Debounce-Bibliothek nicht mehr aktuell. Beide Bibliotheken Bounce und Debounce debouncen, also entprellen, Eingangssignale. Die Bounce-Bibliothek gibt es hier: http://arduino.cc/playground/Code/Bounce

na dann war meine Aussage ja sogar richtig! ;-)

ich habe für mein Ergebniss weder die Debounce noch die Bounce benötigt. Kommt daher das ich diese Bibliothek auch falsch verstanden habe bzw. falsch interpretiert habe. Um einen Input mit einem PULL UP wiederstand zu versehen hat digitalWrite(in*, HIGH) im void setup() gelangt. Ich war der Meinung das ich dies nur mit Einbeziehen der BOUNCE Bibliothek funktioniert. Mittlerweile habe ich verstanden das einbinden von Bounce mir eine zeitweillige Aussetzung von aufnahmen weitere Signale ermöglicht. (hoffe ich)* Falls ich es falsch verstanden habe würde ich mich gerne belehren lassen. Zwischenstand: Nachdem ich nun gestern die Hardware / Controller soweit hinbekommen habe, beschäftige ich mich gerade dabei nun den ersten Teil des Software Parts. Hier nun eine Änderung zu meiner Ausgangssituation. Ich habe lange im Internet recherchiert um per PHP die serielle schnittstelle abzufragen und ganz ehrlich nicht auf einen grünen Zweig gekommen. Deshalb wende ich mich JAVA zu. Wenn meine Recherchen richtig waren sollte das nicht so kompliziert werden. Und Java als Applet oder Servlet auch für WEB anwendbar. (-auch wenn mir PHP lieber gewesen wäre auf Grund meiner Vorkenntnisse-) Nun meine Frage an die Software Profis unter euch. 1. Ist das eine vernüftige Entscheidung? 2. Wie kann ich zwischen Applicationen(Clientprogramm) und Servlet(WebServer) am besten kommunizieren(schwerpunkt:geschwindigkeit!) Danke schon mal für eure Hilfe! Grüße aus dem Schwarzwald

Hi campergue!

Wie in meinem Thread versprochen, hier mein Senf zum Thema:

Für welche Sprache du dich entscheidest, kommt natürlich ganz darauf an, was genau du machen willst (z.B. Internet-App, lokales Programm, kommt es auf Sekundenbruchteile an oder nicht, etc.).

Ich frage mich die ganze Zeit, warum du die Daten via Webserver verarbeiten willst. Soll man über das Internet sehen können, was passiert? Oder liegt das daran, dass deine Erfahrungs-Schwerpunkte in der Web-Entwicklung liegen?

Falls du wirklich nur anzeigen lassen willst, welche Felder du getroffen hast, dann würde ja ein lokales Programm (z.B. in Java oder C#) vollkommen ausreichen.

Da ich in Java nicht sonderlich fit bin, hier mal etwas in C# (IDE gibt's kostenfrei von Microsoft):

Als erstes brauchst du Zugriff auf den Serial Port. Das ist in C# denkbar einfach:

using System.IO.Ports;

Den Port kannst du nun z.B. so nutzen:

SerialPort port = new SerialPort("COM3");
port.BaudRate = 9600;

Das Auslesen von Daten ist ebenfalls ziemlich simpel:

while (true)
{
    if (!port.IsOpen)
    {
         try
         {
              this._port.Open();
         }
         catch
         {
             Console.WriteLine("Port not available");
             break;
         }
    }

    string msg = port.ReadLine().Trim(null);
}

Ist natürlich kein vollständiges Beispiel, sollte aber die Funktionsweise klar machen. Falls du noch weitere Fragen haben solltest, sag bescheid!

Greets