INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
4x16 Tastermatrix Problem
07.07.2016, 22:08
Beitrag #1
4x16 Tastermatrix Problem
Hi,

Ich versuche mit einem Mega2560 Dart-Matrix auszuwerten, das klappt auch wenn ich die Felder reindrücke, aber wenn die Pfeile von weitem und schneller kommen, bekommt das der atmega nicht mit, ich vermute ja das der kontakt zu schnell ist.

Danke und Gruß


Hier noch der Code

Code:
const byte COLS = 4;
const byte ROWS = 16;

char keys[ROWS][COLS]= {
  {'0','1','2','3'},
  {'4','5','6','7'},
  {'8','9','A','B'},
  {'C','D','E','F'},
  {'G','H','I','J'},
  {'K','L','M','N'},
  {'O','P','Q','R'},
  {'S','T','U','V'},
  {'W','X','Y','Z'},
  {'a','b','c','d'},
  {'e','f','g','h'},
  {'i','j','k','l'},
  {'m','n','o','p'},
  {'q','r','s','t'},
  {'u','v','w','x'},
  {'y','z','*','#'}
};

byte rowPins[ROWS] = {39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24};
byte colPins[COLS] = {41, 40, 23, 22};

void setup() {
Serial.begin(9600);
for (byte row=0; row < ROWS; row++)  {
  pinMode(rowPins[row],INPUT);
  digitalWrite(rowPins[row],HIGH);
}
for(byte col=0;col < COLS; col++){
  pinMode(colPins[col],INPUT);
  digitalWrite(colPins[col],HIGH);
}

}

void loop() {
for (byte col=0; col < COLS; col++){
  pinMode(colPins[col],OUTPUT);
  digitalWrite(colPins[col],LOW);
  for (byte row=0; row < ROWS; row++){
    if (digitalRead(rowPins[row]) == LOW){
      Serial.println(keys[row][col]);
    }
  }
  digitalWrite(colPins[col],HIGH);
  pinMode(colPins[col],INPUT);
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.07.2016, 10:45
Beitrag #2
RE: 4x16 Tastermatrix Problem
Hallo,
von was für einem Kontakt sprechen wir denn hier? Öffner, Schliesser?
Wird geschaltet oder nur ein Impuls registriert?

Für mich sieht der Sketch so aus, als wenn er bei jedem Durchlauf der Loop
nur etwas durchzählt- sich abe nichts merkt.

Ich kann mir gut vorstellen, das die Schleifen den Betrieb aufhalten. Es
spielt keine Rolle, ob sich dabei etwas geändert.
Das ganze müßte auf Änderung reagieren, weiß der Teufel.

Wie funktioniert es denn? Du jagst einen Pfeil auf die Scheibe und der Kontakt
bleibt geschlossen?
Mache das ganze doch einmal kleiner, nur 1x16, dann fällt schon einmal 3/4 der
Zählerei weg.
Wenn der geworfene Pfeil in der Scheibe sitzt und wird nicht registriert-
dann drücke den Pfeil doch mal fester rein- ändert sich dann etwas?
Gruß und Glück
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.07.2016, 13:57 (Dieser Beitrag wurde zuletzt bearbeitet: 08.07.2016 16:48 von Scheams.)
Beitrag #3
RE: 4x16 Tastermatrix Problem
Hey!

Erstmal verstehe ich nicht wieso du immer zwischen IN- & OUTPUT wechselst. Entweder alle Rows als OUTPUT und Cols als INPUT oder andersrum, kein hin- und her wechseln nötig.

Ich denke einmal die Impulse werden zu kurz sein und somit können diese nicht ausgelesen werden. Probieren könntest du z.B. nur Row 1 (insg. 4 Lesedurchläufe) auslesen und auf die Reihe schießen. Erkennt er es dann?

Falls die Impulse wirklich das Ausschlaggebende ist könnte man das Softwaremäßig evtl. so lösen, indem die Rows/Cols in regelmäßigen Abständen durchschaltet werden (Timer) und durch Interrupts (PCINT) die Eingänge ausließt.
Hardwaremäßig wäre es evtl. noch einfacher indem ein Impuls gespeichert wird und dann ausgelesen wird.

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.07.2016, 14:36 (Dieser Beitrag wurde zuletzt bearbeitet: 08.07.2016 20:44 von Michel.)
Beitrag #4
RE: 4x16 Tastermatrix Problem
Hi,

Der obige Code ist eigentlich nur zum Testen.
Ich verwende die Keypad Lib von Hier, diese verhält sich aber auch so, normales drücken geht, von weitem nicht, wahrscheinlich ist der Impuls zu kurz.

Code:
#include <Keypad.h>

const byte ROWS = 16;
const byte COLS = 4;
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'0','1','2','3'},
  {'4','5','6','7'},
  {'8','9','A','B'},
  {'C','D','E','F'},
  {'G','H','I','J'},
  {'K','L','M','N'},
  {'O','P','Q','R'},
  {'S','T','U','V'},
  {'W','X','Y','Z'},
  {'a','b','c','d'},
  {'e','f','g','h'},
  {'i','j','k','l'},
  {'m','n','o','p'},
  {'q','r','s','t'},
  {'u','v','w','x'},
  {'y','z','*','#'}
};
byte rowPins[ROWS] = {39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {41, 40, 23, 22}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey){
    Serial.println(customKey);
  }
}

Die Matrix Folie ist aufgebaut wie die von einer Tastatur, die Pins gehen direkt an den Atmega.

Gruß Michel


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.07.2016, 07:11
Beitrag #5
RE: 4x16 Tastermatrix Problem
Hallo,
der Arduino erfast wesentlich kürzere Impulse...
Woher weißt Du eigentlich, das überhaupt "von weitem" geschaltet wird? Das ist Dein Sketch, der den Impuls nicht mitbekommen
kann.
Der erste läuft in einer Schleife in der ein Kontakt nicht bemerkt wird.
Was der zweite soll, weiß ich nicht...
Ich würde da mal einen IRQ drauflegen, der darauf wartet, das getastet wird.
Dafür ist das Ding dann aber falsch verdrahtet. Du müßtest die Tasten entkoppel und könntest über den IRQ sofort feststellen
welche Taste gedrückt ist.
Also nicht- Taste gedrückt, IRQ auslösen, dann auswerten welche Taste gedrückt ist.
Sondern- Taste gedrückt, IRQ weis sofort welche Taste gedrückt ist.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.07.2016, 22:50
Beitrag #6
RE: 4x16 Tastermatrix Problem
HI Andreas,

Die Scheibe ist in einem Dart Automat eingebaut, deshalb weiß ich das die Matrix Schaltet bei den 2 Metern.

Also lege ich jetzt die vier Spalten auf vier Interrupts und die 16 Reihen definiere ich als Inputs, da muss ich aber trotzdem Auswerten welcher der 16 Pins gedrückt wurde, wenn der Interrupt auslöst oder?

Gruß und Danke Michel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2016, 10:04
Beitrag #7
RE: 4x16 Tastermatrix Problem
(09.07.2016 07:11)SkobyMobil schrieb:  Sondern- Taste gedrückt, IRQ weis sofort welche Taste gedrückt ist.
Gruß und Spaß
Andreas

Nach meiner Meinung sollte schon erst Taste gedrückt ausgewertet werde,im IRQ.
Danach ist massig zeit bis zum nächsten Wurf zur Berechnung.
So hatte ich es immer gehalten, auch schon vor >30 Jahren.
Das Prinzip gilt fast immer IRQ so kurz/schnell wie nötig.
Gruß

Nicht jeder Neuling in einem Forum hat keine Ahnung über die Materie!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.07.2016, 14:15
Beitrag #8
RE: 4x16 Tastermatrix Problem
Hey,

(09.07.2016 07:11)SkobyMobil schrieb:  ...
Also nicht- Taste gedrückt, IRQ auslösen, dann auswerten welche Taste gedrückt ist.
Sondern- Taste gedrückt, IRQ weis sofort welche Taste gedrückt ist.
...
Wie meinst du das mit dem "sofort"? In der ISR auswerten welcher Taster gedrückt ist? Wenn's so gemeint ist, kann man das denke ich durchaus machen. Mit Bitmanipulation kann das durchaus schnell genug gemacht werden.

(09.07.2016 22:50)Michel schrieb:  ...
Also lege ich jetzt die vier Spalten auf vier Interrupts und die 16 Reihen definiere ich als Inputs, da muss ich aber trotzdem Auswerten welcher der 16 Pins gedrückt wurde, wenn der Interrupt auslöst oder?
...
Die Interrupts sind auch Eingänge, wenn du alles als Eingänge definierst wird das nicht funktionieren. Dh entwder 4 Interrupts=Eingänge (INT0-3) und 16 Ausgänge die durchgeschalten werden. Oder andersrum 4 Ausgänge die durchgeschalten werden und 16 Interrupts (PCINTx).

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Problem mit SD Card Library BennIY 4 197 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Problem mit SD.remove Eichner 6 212 22.08.2016 19:42
Letzter Beitrag: Eichner
  Problem mit Delay und Millis funnyzocker 1 463 26.06.2016 09:54
Letzter Beitrag: hotsystems
  Problem mit ESP8266 und EMail senden torsten_156 1 611 13.06.2016 21:14
Letzter Beitrag: torsten_156
  ESP8266_01 flashen - Problem torsten_156 12 1.061 30.05.2016 20:12
Letzter Beitrag: torsten_156
  Hardwareserial/Softserial: Problem mit Superklasse tuxedo0801 10 483 19.05.2016 12:25
Letzter Beitrag: amithlon
  ESP8266 HTML Problem arduino_weatherstation 1 500 25.04.2016 21:52
Letzter Beitrag: rkuehle
  Problem mit OLED 0.96" Display torsten_156 3 547 03.04.2016 15:10
Letzter Beitrag: hotsystems
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 490 01.04.2016 05:49
Letzter Beitrag: MartinK
  Problem: RFID code mit Inhalt einer Textdatei auf einer SD Karte vergleichen MartinK 6 516 29.03.2016 16:45
Letzter Beitrag: MartinK

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste