PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3x4 Matrix Tastatur an I2C



RobotMichi
30.10.2010, 11:58
Hallo,

ich habe vor, diese Matrixtastatur über einen PCF8574 an den I2C-Bus meines RP6 anzuschließen:
http://www.conrad.de/ce/de/product/709840/

Muss ich da Widerstände zwischen die Ports der Tastatur und die des PCF8574 geben (wenn ja, wie hoch) oder kann ich die Tastatur direkt dranhängen?

lg
Michi

Dirk
30.10.2010, 15:09
Die Tastatur ermöglicht ja nur eine einfache Spalten-/Zeilenauswertung.
Wenn du das mit einem I/O-Expander machen willst, müßtest du dafür 7 I/O-Ports benutzen. Für jeden Port brauchst du noch einen Pullup-Widerstand (z.B. 4,7 kOhm) gegen VCC. Die Entprellung kannst du mit Software machen.

Alternativ könnte man diese Tastatur gut analog mit nur einem ADC-Port auslesen. Dafür brauchts ein paar Widerstände.

Gruß Dirk

RobotMichi
30.10.2010, 17:14
Hi,

danke für deine Antwort.
Ich habe schon mir zu der Alternative mit dem ADC-Port Gedanken gemacht, jedoch hätte das wie bei der M32 den Nachteil, dass immer nur eine Taste zur gleichen Zeit gedrückt sein kann.
Mit 7-Ports kann ich zumindest 4 Tasten gleichzeitig auslesen.

Die Pullup-Widerstände hänge ich dann zwischen Expanderport und Tastaturport, oder?

lg
Michi

TobiKa
30.10.2010, 18:08
Hi

PullUp Widerstände kommen zwischen Versorgungsspannung und Eingang.

Du kannst mit einem ADC auch mehrere Taster gleichzeitig abfragen!

Besserwessi
30.10.2010, 22:07
Ein paar Tasten gehen über einen AD, aber 12 Tasten sind dann doch recht viel, wenn man auch noch zulassen will, dass mehrere gleichzeitig gedrückt werden.

An einen 8 Bit Port-expander könnte man 12 Tasten auch als 2x6 Matirx anbringen und so bis zu 6 Tasten gleichzeitig drücken. Um beliebige Tastenkombination abzufragen könnte man bei der Matrix zu jeder Taste eine Diode in Reihe schalten.

Dann würde es sich aber ggf noch anbieten doch alle Tasten einzlen anzuschließne und eine 12 (bzw. 16) Port Erweiterung zu nehmen.

RobotMichi
31.10.2010, 08:14
Hallo,

ja ich habe auch schon überlegt, eine 1x12 Matrix zu verwenden, aber da bräuchte ich dann einen 16Bit Portexpander (PCF8575),
doch den krig ich in Österreich leider nirgens her :(

Ich werde dann doch bei der 3x4 bleiben, denn mehr als 4 Tasten gleichzeitig benötigt man sowieso nicht
und 2x6 Tastaturen sind ebenfalls schwer zu bekommen, so wie ich das nach meiner bisherigen Recherche einschätzen kann.

lg
Michi

TobiKa
31.10.2010, 09:33
Hi

Du kannst aber auch 2 8bit-PortExpander anschliessen.
Gibt es z.B. bei eBay.at recht güsntig http://cgi.ebay.at/IC-PCF8574P-I-C-8bit-I-O-Exp-DIP16-PCF8574-P-/160445977203?pt=Bauteile&hash=item255b535273

Dirk
31.10.2010, 10:37
Leute,

bei den kleinen Bedientastaturen an Geräten, Handys ... spielt die Betätigung von mehreren Tasten gleichzeitig praktisch keine Rolle, da man sie meistens nur mit 1 Finger bedient.

Stattdessen gibt es eine oder 2 Umschalttasten, mit denen man sozusagen die "Ebenen" der Tastenbelegung einblendet. Denkt z.B. an die Groß-/Kleinschreibung oder die Zahlen-/Buchstabenumschaltung bei Handys.

Auf eine Auswertung von gleichzeitig gedrückten Tasten kann man also gut verzichten. Oder wofür braucht man das wirklich?
Braucht man aber mehr als 12 Tasten, könnte man eine Taste softwaremäßig als Umschalttaste vorsehen. Man hätte dann 2 x 11 = 22 Funktionen.
Nimmt man 2 Umschalttasten, hätte man 4 x 10 = 40 Funktionen.

Gruß Dirk

radbruch
31.10.2010, 10:42
Hallo

Die D.... hätten auch einen Schaltplan ins Datenblatt stellen können. Es ist eine 3x4-Matrix die man mit 7 Pins abfragen kann. Deshalb wohl auch die 7 Steckkontakte:

http://www.google.de/search?q=s512j-bf7kuv

Gruß

mic

Ach, jetzt ist mir auch der Aufbau der Platine klar:

radbruch
05.11.2010, 23:49
Hallo

Eher zufällig habe ich einen PCF8574A rumliegen, eine 4x4-Tastatur und 'nen RP6. Und ich wollte schon immer mal in die I2C-Technik einsteigen. Hier meine Umsetzung der Aufgabe:

Der PCF8574(A) kennt, anders als die AVRs, nur zwei Zustände an seinen Ausgängen. Eine "0" schaltet den Ausgang auf Low, eine "1" ist mit einem Eingang mit internem PullUp des AVRs vergleichbar. Die Spalten der Matrix sind mit den Bits 0 bis 3 des PCF8574 verbunden, die Zeilen mit den Bits 4 bis 7. Zur Abfrage schaltet man nacheinander die Bits 0 bis 3 auf Low und prüft dann jeweils, ob die High-Pegel der Bits 7-4 durch einen Tastenkontakt auf Low gezogen werden. Eigentlich sehr einfach, ich bin deshalb auch nicht der Erste, der das hinbekommen hat;)

http://radbruch.bplaced.net/robot/arm/4x4_tastatur_klein.jpg (http://radbruch.bplaced.net/robot/arm/4x4_tastatur.jpg) http://radbruch.bplaced.net/robot/arm/PCF8574A_auf_steckbrett_klein.jpg (http://radbruch.bplaced.net/robot/arm/PCF8574A_auf_steckbrett.jpg) http://radbruch.bplaced.net/robot/arm/rp6_mit_ra2_klein.jpg (http://radbruch.bplaced.net/robot/arm/rp6_mit_ra2.jpg)

http://i1.ytimg.com/vi/tMIc6e9dLnY/1.jpg (http://www.youtube.com/watch?v=tMIc6e9dLnY)
http://www.youtube.com/watch?v=tMIc6e9dLnY

Das Programm auf Basis der RP6 I2C-Library:

// 4x4-Tastenmatrix an PCF8574A 5.11.2010 mic

// https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=56693

#include "RP6RobotBaseLib.h"
#include "RP6I2CmasterTWI.h"

uint8_t c=0, leds=0;
uint16_t tasten;

uint16_t PollSwitch16(void)
{
uint8_t i, j, x, temp;
uint16_t mask=0;

temp=I2CTWI_readByte(0b01110001); // aktuelles Bitmuster sichern
for(j=0; j<4; j++)
{
I2CTWI_transmitByte(0b01110000, ~(1<<j)); // Pin j (0 bis 3) auf Low
sleep(2); // Warten auf Pegel
x=(I2CTWI_readByte(0b01110001)>>4); // Eingang 7-4 wird zu Bit 3-0 in x
for(i=0; i<4; i++) // Bits 0-3 überprüfen
if(!(x & (1<<i))) // Wenn Eingang low ist wurde die Taste gedrückt
mask += (1 << (i*4)) * (1<<j); // entsprechendes Bit in Maske setzen
}
I2CTWI_transmitByte(0b01110000, temp); // gespeichertes Bitmuster ausgeben
return(mask);
}
int main(void)
{
initRobotBase();
I2CTWI_initMaster(100);
startStopwatch1();
startStopwatch2();
while(1)
{
if(getStopwatch1() > 300) // Lauflicht an Pin 0 bis 7 des PCF8574A
{
setStopwatch1(0);
I2CTWI_transmitByte(0b01110000, ~(1<<c));
c++;
if(c>7) c=0;
}

if(getStopwatch2() > 50) // Tastenabfrage
{
setStopwatch2(0);
tasten=PollSwitch16();
if(tasten)
{
writeInteger(tasten, 2); // Bitmuster des Keypads an Terminal ausgeben
writeChar('\n');

leds=0; // Spielerei mit den Leds
if(tasten & (1<<0)) leds+=8; // Taste 1
if(tasten & (1<<1)) leds+=1;
if(tasten & (1<<2)) leds+=16;
if(tasten & (1<<3)) leds+=2;
if(tasten & (1<<4)) leds+=32;
if(tasten & (1<<5)) leds+=4; // Taste 6
setLEDs(leds);
}
else setLEDs(0); // Keine Taste gedrückt
}
}
return(0);
}

Gruß

mic