Forum: Mikrocontroller und Digitale Elektronik Udoo Quad // Programmieren einer Dartscheibe


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Martin H. (hnbk_2017)


Lesenswert?

Hallo,

wir sind 3 angehende Techniker, die ihr Abschlussprojekt vor der Brust 
haben.
Seit ca 3 Wochen kommen wir nicht weiter.
Wir versuchen unsere Tastermatrix (4x16)auszulesen und sinnvoll weiter 
zu verarbeiten.
Doch uns gelingt das Auslesen nicht.

Könnt ihr uns bitte helfen solch eine Tastermatrix auszulesen. Wir 
bräuchten einen Denkanstoß.

Besten Dank im Voraus und freundliche Grüße

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn ich da Dartscheibe lese - wie lange sind denn die Tasten eurer 
Matrix gedrückt? Wenn das nur ein paar ms sind, dann ist es evtl. 
sinnvoller, über IRQ die Taste zu lesen. Wenn das aber mehrere dutzend 
bis hunderte ms sind, dann ist die traditionelle Tastenauswertung mit 
Timer sinnvoll, die das Tastenfeld auch gleich entprellt.
Die ISR würde z.B. über Pinchange Interrupt reagieren müssen.

von Dieter F. (Gast)


Lesenswert?

Kennt ihr Google?

https://www.google.de/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=matrix+tastatur+lesen

Sollen wir Raten, wie die Tastatur nebst Anschlüssen (Schaltplan) 
aussieht, und womit ihr diese Auslesen wollt (Hardware / Software)?

von Lutz (Gast)


Lesenswert?

Vielleicht erklärt ihr erst einmal wie weit ihr seid und wo genau das 
Problem dann ist. 4 x 16 ist auch schon eine komische Rasterung für eine 
runde Scheibe...

von Dieter F. (Gast)


Lesenswert?

O.K. - das mit der Hardware nehme ich zurück (Titel).

Wie seid ihr denn auf dieses Teil gekommen?

Vielleicht können die (mit halbwegs fertigen Lösungen) helfen: 
http://www.udoo.org/forum/

von Martin H. (hnbk_2017)


Angehängte Dateien:

Lesenswert?

Wir haben uns für ein Quad Udoo entschieden, da es sich hierbei um eine 
Mischung aus Arduino und RaspberryPI handelt, beides ist mit einem Bus 
miteinander verbunden. Mit dem Arduino wollen wir im groben unsere 
Abfragen starten und das eigentliche Programm entwickeln. Mit dem 
RaspberryPI wollen wir mit Hilfe von Phyton die Oberfläche 
visualisieren.

Der Einschlag der Darts ist vermutlich im µs Bereich. Wir wollten die 
Einschläge mit Hilfe von Interrupts verwirklichen.

Die Rasterung der Scheibe ist in 4x16 verschaltet. (A0-A3 // B0-B15) Vom 
Prinzip her, wie im Anhang nur halt nicht 8x8, sondern 4x16. Sollte 
beispielsweise die "17" getastet werden, haben wir einen Durchgang 
zwischen A0 und B0.

Wir bekommen es einfach nicht hin, die einzelnen "A"s und "B"s für eine 
Mehrfach Belegung abzufragen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Martin H. schrieb:
> Der Einschlag der Darts ist vermutlich im µs Bereich.
Das solltet ihr mal etwas genauer messen. Wenns wirklich nur µs sind, 
dann geht sowas mit Raspi und Python nämlich nicht ohne unterstützende 
Hardware, z.B. per Dartpfeil gelatchte Register (sowas ist aber 
prellempfindlich und vom Timing her gar nicht so einfach hinzukriegen) 
oder ein dezidierter Matrix-MC, der nur das macht und nichts anderes.
Der Metrix MC würde dann mit hoher Geschwindigkeit die Matrix 
durchklappern und per Standard Entprellroutine die Tasten rausfischen.
4*16 Matrix ist natürlich nicht so praktisch, sollte aber klappen. 8*8 
wäre natürlich viel Praktischer und benötigt an der Entprellroutine nur 
kleine Änderungen.
https://www.mikrocontroller.net/articles/Entprellung#Softwareentprellung

von Sebastian S. (amateur)


Lesenswert?

Eine Matrix fragt man am einfachsten ab, indem man jeweils eine Zeile 
aktiviert (Log 1) und alle Spalten (8/16 Bit)einliest. In dieser Zeit 
sind alle anderen Zeilen passiv.

Ist das passiert, so aktiviert man die nächste Zeile und macht das 
gleiche.
Wichtig ist, dass immer nur eine Zeile "aktiv" ist.

Falls Dein Sensor Probleme mit dem Rückwärtsgang (zwei Drückeberger zur 
gleichen Zeit) hat, musst Du die Kandidaten mit Dioden entkoppeln.

von Dieter F. (Gast)


Lesenswert?


von Kaj (Gast)


Lesenswert?

Martin H. schrieb:
> beides ist mit einem Bus
> miteinander verbunden.
Naja, es ist eine UART-Verbindung.


Matthias S. schrieb:
> Wenns wirklich nur µs sind,
> dann geht sowas mit Raspi und Python nämlich nicht ohne unterstützende
> Hardware,
Die haben sie doch: Den Atmel SAM3X8E (Arduino-Due, ARM Cortex-M3) der 
da mit drauf sitzt.

Martin H. schrieb:
> Mit dem Arduino wollen wir im groben unsere
> Abfragen starten und das eigentliche Programm entwickeln.

Martin H. schrieb:
> Mit dem
> RaspberryPI wollen wir mit Hilfe von Phyton die Oberfläche
> visualisieren.

von Martin H. (hnbk_2017)


Lesenswert?

Hallo Zusammen,

wir haben uns als Beispiel an einer Arduino-Vorlage von einer Tastatur
gehalten.
Diese haben wir dann auf unsere Dartscheibe übertragen.
Der Quelltext steht unterhalb.
Die Verdrahtung könnt Ihr der Exceltabelle entnehmen.

Wir bekommen leider keine Ausgabe an unserem seriellen Monitor.
Erkennt Ihr ein Fehler?

Danke im Voraus.


#include <Arduino.h>
#include <Keypad.h>



const byte ROWS = 16; // Four rows Zeilen
const byte COLS = 4; // Three columns Spalten

char keymap

// Define the Keymap
char keymap[ROWS][COLS] =
{
  {'0','50','0','25'},  //Row 0
  {'6','45','36','27'},
  {'4','30','24','18'},
  {'2','15','12','9'},
  {'21','12','54','48'},
  {'14','8','36','32'},
  {'7','4','18','16'},
  {'57','39','3','24'},
  {'38','26','2','16'},
  {'19','13','1','8'},
  {'9','18','60','33'},
  {'6','12','40','22'},
  {'3','6','20','11'},
  {'51','30','15','42'},
  {'34','20','10','28'},
  {'17','10','5','14'},
};

// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 53,51,49,47,45,43,41,39,37,35,33,31,29,27,25,23 
};
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 2, 3, 4 ,5 };

// Create the Keypad
//Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//Keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, Rows, 
Cols);

void setup()
  {
  Serial.begin(9600);

  }
void loop()
{
  char keypressed = myKeypad.getKey();
  if (keypressed != NO_KEY) {
    Serial.print("K ");
    Serial.write(keypressed);
    Serial.println("");
    Serial.flush();
  }

}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Martin H. schrieb:
> Wir bekommen leider keine Ausgabe an unserem seriellen Monitor.
> Erkennt Ihr ein Fehler?

Das meiste ist hier in ein Lib gepackt, die man ja nicht lesen kann. 
Messt doch mal an den COL und ROW Pins, ob sich da was tut. An einer der 
beiden Gruppen sollte die Keypad Routine jeweils eine Leitung gegen Low 
ziehen, das ganze der Reihe nach mit allen Leitungen dieser Gruppe und 
das immer wiederholen. Verbindet man nun per Draht oder Taster eine 
dieser Leitungen mit einer Leitung aus der anderen Gruppe, sollte 
GetKey() was zurückliefern. Wenn nicht, ist die Library entweder 
überfordert mit der 16*4 Matrix, oder ihr habt was falsch deklariert 
oder sie funktioniert einfach nicht.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?

Martin H. schrieb:
> Wir bekommen leider keine Ausgabe an unserem seriellen Monitor

Ihr wollt Techniker werden?

Dann schaut gefälligst selbst :-)

Es liegt m.E. nach nicht am Programm ... möglicherweise aber an den 
Ports (Arduino-Kompatibel ???) oder an der "Dart-Matrix" bzw. deren 
Abfrage.

Logik-Analysator ist euch bekannt? Ich frage nur, weil Google scheinbar 
nicht bekannt ist ...

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Das meiste ist hier in ein Lib gepackt, die man ja nicht lesen kann.

Warum nicht?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter F. schrieb:
> Warum nicht?

Weil ich sie mir z.b. runterladen müsste, was ich aber nicht tue. Und 
gepostet haben die Jungs sie ja nicht.

von Dieter F. (Gast)


Lesenswert?

Matthias S. schrieb:
> Weil ich sie mir z.b. runterladen müsste, was ich aber nicht tue

Blah ...

von Cyborg (Gast)


Lesenswert?

Dieter F. schrieb:
> Ihr wollt Techniker werden?

Daran hab ich ernste Zweifel. Eher wollen sich da welche mit
fremden Federn schmücken um hier ein hohes Antwortniveau zu erhalten.
In anderen Threads werden Trivialfrager immer schnell kalt gestellt,
wenn da nicht ein gewisses Grundwissen vorhanden ist. Dieser Thread
scheint genauso zu sein.

Daher sollte der TO erst mal das hier lesen:
http://www.mikrocontroller.net/articles/Netiquette#Klare_Beschreibung_des_Problems

Martin H. schrieb:
> Der Einschlag der Darts ist vermutlich im µs Bereich.

Zum einen ist das nur eine Vermutung und zum anderen ohne Bedeutung
für das Spiel. Zwischen den Würfen können sich die Werfer beliebig
Zeit lassen. Da ist nichts dynamisch, außer wenn ein Pfeil die
Scheibe trifft.

Matthias S. schrieb:
> Wenn ich da Dartscheibe lese - wie lange sind denn die Tasten eurer
> Matrix gedrückt? Wenn das nur ein paar ms sind, dann ist es evtl.
> sinnvoller, über IRQ die Taste zu lesen.

Schon mal Dart gespielt? Gewöhnlich bleibt ein Pfeil (von vier)
nach dem Wurf in der Scheibe stecken und genauso lang bleibt
ein Tastkontakt auch geschlossen.
Entprellt werden muss da auch nichts, weil ein einmal gesetztes Bit
einer Matrix, oder Arrays, erst mit dem entfernen des Pfeils wieder
zurück gesetzt wird. Was den Ansteuer-/Abfragezyklus angeht, kann
man den im µs oder ms und zu Testzwecken auch in Sek. ansteuern.
Die Wertung der geworfenen Pfeile ist sowieso rein statisch.

Die Schleife muss nachher vom Timing nur mit der Datenübertragung
übereinstimmen, ab besten synchron.


Kaj schrieb:
> Naja, es ist eine UART-Verbindung.

Und wie ist der verschaltet? Einfach nur mal so an die Matrix anklemmen
funktioniert nicht.  Ein Schaltplan gehört auf den Tisch.
Wenn ihr das nicht könnt, dann habt ihr den Begriff "Techniker"
nur für eure Zwecke gekapert und missbraucht.

Martin H. schrieb:
> Der Quelltext steht unterhalb.

Ich vermisse den Einsprungpunkt "main".
Gewöhnlich gehört der in eine C - Listing, oder sollte das ein anderer
Compiler sein?

Martin H. schrieb:
> Wir bekommen leider keine Ausgabe an unserem seriellen Monitor.

Die serielle Kommunikation gründet sich nicht nur auf die Baud-rate,
sondern auch identische Parameter wie odd/even Party und die Anzahl
der Stopbits beim Sender und Empfänger. Außerdem wird der Monitor nur 
Ascii oder einen veralteten Tastaturcode darstellen. Einige Codes
sind überhaupt nicht darstellbar, weil es Steuercodes sind
(z.B. CR oder LF).

Martin H. schrieb:
> #include <Arduino.h>
> #include <Keypad.h>

Das deutet auf C hin.

Also, da ganze hat sicher nichts mit der Abschlussarbeit zum Techniker
zu tun, denn angehende Techniker wissen das.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.