Forum: Mikrocontroller und Digitale Elektronik Tastermatrix mit µC ansteuern (für MSM2 MP3 Modul)


von Christian B. (butzc)


Lesenswert?

Hallo,

ich bin ein Schüler und versuche mich gerade in die große weite Welt der 
µC einzuarbeiten. Dank diesem Forum und den Tutorials habe ich schon 
sehr viel gelernt, ohne dass mir jemand persönlich helfen musste.

Nun stehe ich aber vor einem Problem das meine Elektronik- und 
µC-Kenntnisse übersteigt:

Ich habe mir bei ELV ein MP3 Soundmodul gekauft (MSM2).

http://www.elv.de/output/controller.aspx?cid=74&detail=10&detail2=30546

Dies musste nur ein wenig zusammenglötet werden und das war's auch 
schon. Elektronikkenntnisse waren eigentlich nicht erforderlich um auf 
Tastendruck eine MP3 abzuspielen. Es gibt 10 Anschlüsse für Taster die 
je 10 MP3 zugeordnet sind. Das war alles kein Problem.

Den Microcontroller so zu programmieren und zu beschalten, dass ich per 
Tastendruck eine LED anschalte war auch kein Problem. Ich habe einfach 
den internen Pull-Up Widerstand benutzt. Naja ganz so einfach war es 
nicht aber dank dieses Forums habe ich's geschafft.

Nun wollte ich die einzelnen Taster zum Abspielen der MP3 durch den µC 
ersetzen und so die MP3 direkt aus meinem µC-Programm abspielen.

Da habe ich aber festgestellt, dass die Entwickler des MP3 Moduls sich 
ein paar µC-Pins eingespart haben und eine Tastermatrix aufgebaut haben. 
Somit kann ich z. B. nicht PINB1 (mein µC)direkt mit PINX1 
(MP3-Steuerung) verbinden.

Ich bin also gezwungen irgendwie die Kontakte von Taster1 - Taster10 
physikalisch zu verbinden oder zumindest so zu beschalten, dass das MP3 
Modul denkt sie wären verbunden.

Ich dachte zuerst an Relais. Aber das ist irgendwie uncool 
(Stromverbrauch, Größe, außerdem habe ich keine)

Ich hatte noch einen Optokoppler aus einer alten Lehraufgabe und habe es 
damit probiert, aber irgendwie war das auch nicht zielführend. 
Prinzipiell hat der funktioniert (habe mal Testweise eine LED an- und 
wieder ausgeschaltet), das Signal wurde allerdings nichts als 
"gedrückter Taster" interpretiert.

Hat jemand eine Idee wie ich das halbwegs elegant hinbekomme?

von Christian B. (butzc)


Lesenswert?

Ich habe noch ein wenig weiter gerätselt.

Ich habe es nun hinbekommen EINIGE Dateien abzuspielen. Bei einigen 
Tastern funktioniert es, dass ich nicht Taster-Pin-1a mit Taster-Pin-1b 
sondern z. B. Taster-Pin-1a mit Masse verbinde.

Es gibt aber auch, z. B. Taster-10, wenn ich da versuche Taster-Pin-10a 
mit Masse zu verbinden dies als "Taster 1" interpretiert wird.

Ganz so einfach ist es also nicht.

Wenn ich das aber so recht durchgemessen habe schaffe ich es nicht den 
Optokoppler mit 0 Ohm zu schließen. Oder bekommt man dies mit einer 
externen Schaltung irgendwie hin?

von Stefan Frings (Gast)


Lesenswert?

Also ich habe sowas bisher immer mit Optokoppler gemacht. Nur einmal 
nicht, weil mir diese Schaltungsvariante zu primitiv erschien, da war 
ich besonders ehrgeizig.

Da hat mein Mikrocontroller nachgeschaut, weile Tasten-Reihe das Gerät 
gerade abfragt und dann im richtigen Moment (quasi synchron) die 
entsprechende Spalte auf Low gezogen.

Ich würd's aber nicht nochmal so machen. Bis das Programm fertig war, 
hätte ich Optokoppler Variante nämlich mindestens 10 mal gebaut.

Bist Du sicher, daß der Spannungsabfall am Optokoppler deine 
Problemursache ist? Wie hoch ist der der LED Strom?

von Christian B. (butzc)


Angehängte Dateien:

Lesenswert?

Also ich stehe immer noch auf dem Schlauch, mit beiden Füßen. Und mein 
Kumpel steht daneben. Das übersteigt unsere Kenntnisse irgendwie, dabei 
kann es doch nicht so schwer sein.

Ich habe mal die Schaltung der Tastermatrix angehängt.

Die Leitunden KS[1] und CheckKS [1...4] gehen direkt auf die Eingänge 
eines Atmega328P-MU. Prinzipiell habe ich ja kapiert wie es 
funktioniert:

Taster 1        KS1 + CKS1
Taster 2        KS1 + CKS2
Taster 3        KS1 + CKS3
Taster 4        KS1 + CKS4
Taster 5        KS2 + CKS1
Taster 6        KS2 + CKS2
Taster 7        KS2 + CKS3
Taster 8        KS3 + CKS1
Taster 9        KS3 + CKS2
Taster 10       KS3 + CKS3

Mein Plan war nun, die sieben Leitungen KS1...CKS4 mit meinem µC 
nachzubilden und dann, wenn ich z. B. die Taste 6 per Software 
simulieren möchte die Leitungen KS2 und CKS2 per Optokoppler zu 
verbinden. Ich bräuchte dann für die gesamte Schaltung 10 Optokoppler.

Aber genau dies funktioniert nicht.

Habe ich einen Fehler in meiner Software?:
1
// Hier werden die Leitungen aus der Matrixschaltung mit dem gleichen Namen wie
2
3
//PORTC
4
#define KS1    0b00000001
5
#define KS2    0b00000010
6
#define KS3    0b00000100
7
8
//PORTB
9
#define KCS1  0b00000010
10
#define KCS2  0b00000100
11
#define KCS3  0b00001000
12
#define KCS4  0b00010000
13
14
int i = 0;
15
int j = 0;
16
int l = 20000;
17
18
//Nur eine doofe Delay-Schleife
19
void delay (int k)
20
{
21
  j = k*10;
22
    
23
  while (j > 0)
24
  {
25
    while (l > 0)
26
    {
27
      l--;
28
    }
29
    l = 20000;
30
    j--;
31
  }
32
}
33
34
35
//Entsprechend der Tastermatrix aus dem Schaltplan wurden folgende 10 Kombinationen identifiziert.
36
37
void Taster1 (int time)    //Falls jemand den Taster 1 drückt...
38
{
39
  PORTC = KS1;  //...wird damit die Leitung KS1...
40
  PORTB = KCS1;  //...und KCS1 verbunden.
41
  delay (time);   //Und zwar für die übergebene Zeit
42
  PORTC = 0;    //Danach bitte...
43
  PORTB = 0;    //...alles wieder aus schalten.
44
}          //Diese Information wird dann von dem µC auf dem MSM2 Board als "Taste 1" identifiziert.
45
46
void Taster2 (int time)
47
{
48
  PORTC = KS1;
49
  PORTB = KCS2;
50
  delay (time);  
51
  PORTC = 0;    
52
  PORTB = 0;    
53
}
54
55
void Taster3 (int time)
56
{
57
  PORTC = KS1;
58
  PORTB = KCS3;  
59
  delay (time);  
60
  PORTC = 0;    
61
  PORTB = 0;    
62
}
63
64
void Taster4 (int time)
65
{
66
  PORTC = KS1;
67
  PORTB = KCS4;  
68
  delay (time);  
69
  PORTC = 0;    
70
  PORTB = 0;  
71
}
72
73
void Taster5 (int time)
74
{
75
  PORTC = KS2;
76
  PORTB = KCS1;  
77
  delay (time);  
78
  PORTC = 0;    
79
  PORTB = 0;  
80
}
81
82
void Taster6 (int time)
83
{
84
  PORTC = KS2;
85
  PORTB = KCS2;  
86
  delay (time);  
87
  PORTC = 0;    
88
  PORTB = 0;  
89
}
90
91
void Taster7 (int time)
92
{
93
  PORTC = KS2;
94
  PORTB = KCS3;  
95
  delay (time);  
96
  PORTC = 0;    
97
  PORTB = 0;  
98
}
99
100
void Taster8 (int time)
101
{
102
  PORTC = KS3;
103
  PORTB = KCS1;  
104
  delay (time);  
105
  PORTC = 0;    
106
  PORTB = 0;  
107
}
108
109
void Taster9 (int time)
110
{
111
  PORTC = KS3;
112
  PORTB = KCS2;  
113
  delay (time);  
114
  PORTC = 0;    
115
  PORTB = 0;  
116
}
117
118
void Taster10 (int time)
119
{
120
  PORTC = KS3;
121
  PORTB = KCS3;  
122
  delay (time);  
123
  PORTC = 0;    
124
  PORTB = 0;  
125
}
126
127
128
129
130
int main(void)
131
{
132
  DDRC  = 0xFF;  // PORTC0 bis PORTC2 und ...
133
  DDRB  = 0xFF;  // ... PORTB1 bis PORTB4 als Ausgang definieren.
134
  
135
  PORTC = 0x00;  //Zur Sicherheit mal ...
136
  PORTB = 0x00;  //... definiert ausschalten.
137
    
138
    
139
  while (1) //Kleiner Taster Test
140
  {
141
  PORTC=0xFF;
142
  delay(5);
143
  PORTC=0x00;
144
  delay(5);
145
  }  
146
}

Das ist nur der "erste Schuss", das gleichzeitige Drücken von Tastern 
wird (noch) nicht gebraucht und es hängt auch sonst nichts an den Ports, 
so dass man getrosst direkt die kompletten Ports setzten und rücksetzen 
kann.

Hat jemand eine Idee? Ich sehe mein Osterferienprojekt schon scheitern.

von Christian B. (butzc)


Lesenswert?

Wenn die Leitungen auf einen anderen Atmel gehenn, könnte ich doch auch 
direkt die 7 PINS verbinden, oder?

Ganz ohne Optokoppler oder andere Bauteile.

Kann jemand aus der obigen Schaltung erkennen welche Konfiguration meine 
PINS dazu haben müssten? Also ich meine ob ich Ausgänge mit Pull-Up oder 
ohne oder gar mit extra Pull-Downs brauche.

von spess53 (Gast)


Lesenswert?

Hi

>möchte die Leitungen KS2 und CKS2 per Optokoppler zu
>verbinden. Ich bräuchte dann für die gesamte Schaltung 10 Optokoppler.

Hast du schon überprüft, welcher von beiden Eingang und welcher Ausgang 
ist? Danach richtet sich der Anschluss am Optokoppler.

MfG Spess

von Christian B. (butzc)


Lesenswert?

Hallo,

nein das habe ich noch nicht herausgefunden, wie mache ich das denn?

Ich habe auch einfach mal die Leitungen beim Optokoppler vertauscht, 
ohne Erfolg. Oder könnte es sein, dass ich damit den Optokoppler kaputt 
gemacht habe?

von Christian B. (butzc)


Lesenswert?

Boah ey, ich bin echt am verzweifeln.

Kann mir bitte mal jemand eine korrekte Schaltung vom µC-Pin, über den 
Optokoppler zu einer beliebigen Tasterkombination aufzeichnen?

Ich brauch bisschen Starthilfe, nicht dass meine Osterferien vorbei sind 
und ich es nur schaffe ein paar LED zum leuchten zu bringen ;o)

von Hati (Gast)


Lesenswert?

Hallo Christian,

Habe auch msm2-Module bestellt und möchte sie mit einem Microprozessor 
(C-Control) ansteuern. Dachte auch ich müsste die Pins nur gegen Masse 
ziehen bis ich deinen Eintrag gelesen habe (Wie gesagt, bestellt aber 
noch nicht erhalten). Habe mir jetzt Gedanken über eine mögliche Lösung 
gemacht:

Wenn diese Matrix so funktioniert wie du es beschreibst, würde ich es 
mit UND-Gatter versuchen (ev. 3 Stk. 7408). Dein Vorhaben ist ja 
ziemlich zeitkritisch.

1. Eingang ==> 1. Tasteraanschluß vom MP3-Player
2. Eingang ==> Ausgangsport von deinem Steuer-Prozessor

Ausgang von UND-Gatter ==> 2. Tasteraanschluß vom MP3-Player

Daer Ausgang des Und-Gatter schaltet nur auf high (5V), wenn an beiden 
Eingängen 5V (min. 3,5V) anliegen (Vom Player und vom Prozessor).

D.h. das Gatter würde nur durchschalten wenn die Tastenreihe gerade 
getaktet wird. Somit erhält die richtige Kolonne nur Spannung wenn die 
gewünschte "Taste" gedrückt wird. Diese Schaltung mus für jede Taste, 
also 10 mal ausgeführt werden.

Ein Eingang des Gatters erhält jedoch eine niedrigere Spannung 
(Spannungsabfall an der Matrix-Diode). Das sollte aber kein Problem für 
das Gatter sein.

Ich habe das zwar noch nicht getestet, aber ich denke es funktioniert.
Sicherheitshalber eine Testschaltung mit einem Gatter machen.

Teil mir deine Fortschritte mit, ich werde es testen wenn ich das Modul 
habe.
Viel Glück bei deinem Projekt!

von chick (Gast)


Lesenswert?

Deine Optokoppler hast Du wohl falsch beschaltet.

Verbinde doch mal den Collector mit Pin 3 der Stiftleiste, und den 
Emitter mit Pin 4.

Lass den ganzen Ballast der µC-Ansteuerung weg und schalte den 
Optokoppler mit einem gewöhnlichen Taster.
Wenn das geht (und es sollte gehen bei genug LED-Strom), dann mach erst 
den nächsten Schritt und häng den µC dran.

Step by Step, sonst wirds nix.

von Peter D. (peda)


Lesenswert?

Oftmals wird eine Matrix in 2 Phasen eingelesen, einmal die Spalten und 
einmal die Zeilen. D.h. Dein Optokoppler muß beide Richtungen 
durchlassen (z.B. Opto-MOS).
Oder nimm Analogschalter CD4066.


Peter

von Peter D. (peda)


Lesenswert?

Mit 2 Multiplexern CD4051 kann man sogar eine 8*8-Matrix (64 Tasten) 
simulieren.


Peter

von Christian B. (butzc)


Lesenswert?

Cool, den CD4066 / HEF4066B kannte ich noch garnicht. Damit probiere ich 
es mal.

Vielen lieben Dank!

von Christian B. (butzc)


Lesenswert?

Hallo Hati,

ja das MSM2 MP3 Modul hat so seine Tücken. Bei eBay gibt's eine Menge 
besserer MP3 Module, meistens aus China mit entsprechender Lieferzeit.

Schönen Gruß

Chris

von Hati (Gast)


Lesenswert?

Hallo Chris,

Habe das Modul am Freitag noch bekommen. Perfekte Beschreibung, 
Stereo-Ausgang auf Pins geführt, Einziger Nagel im Brett ist die 
Tastatur. (zumindest auf dem ersten Blick).

Laut Schaltplan arbeitet die Matrix-Tastatur nur in eine Richtung. Geht 
nicht anders aufgrund der drei Dioden. Ich versuche es mit den 
UND-Gattern.
Ich denke, das ist die einfachtse Lösung ohne Eingriff in das Modul und 
ohne 10 Optokoppler.
Ich melde mich wieder, Bei Erfolg ev. mit Schaltplan.

von Hati (Gast)


Lesenswert?

Hallo Chris,

Funktioniert genau umgekehrt als ich dachte. Sorry, mein 
Schaltungsvorschlag funktioniert daher nicht.

Nach mißlungenen Testaufbau habe ich mit dem Oszilloskop festgestellt:

Die Ausgänge des µP sind diodenseitig.
Die 4 Eingänge des µP dürften mit Pullup-Wstd. gegen 3,3V gezogen 
werden.
An den Eingängen misst man daher ca. 3V. Durch takten der Ausgänge gegen 
Masse werden bei gedrückter Taste die Eingänge kurz über die Dioden 
gegen Masse gezogen. Ist keine Taste gedrückt, bleiben die Eingänge auf 
high.

Andere Lösung muss ich erst überlegen und testen.
Bist du schon weitergekommen?

von Christian Butz (Gast)


Lesenswert?

Ja, bin ich ;o) Ich habe mir ein billiges Chinamodul bei eBay gekauft wo 
ich per µC 256 Dateien abspielen kann. Dazu muss ich nur ein paar PIN 
binär ansteuern. So schön einfach sollte das MSM aus sein, kann ja nicht 
so schwer sein sich vorher mal Gedanken zu machen wie die Leute damit 
höchstwahrscheinlich umgehen möchten, oder?

von Achim S. (achims)


Lesenswert?

Hallo
Habt Ihr eine Lösung gefunde? Bin auch gerade an dem Teil dran.
a.

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.