PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anleitung: Tastatur einbinden



Reeper
08.08.2006, 18:15
Hallo,

ich habe von euch soviel gelernt, dass ich natürlich so viel wie nur möglich zurückgeben will (einiges ist aber immernoch im Aufbau).

Vielleicht ist der eine oder andere beim integrieren einer Tastatur, so kann ich evtl. helfen O:)

Ziel:
Nutzung eines Ports (adc)
Mehrfachbelegung der Tastatur

Vor einiger Zeit sah ich ein Schema zu einer Tastatur über Spannungsteiler (sieht aus wie eine Matrix) von Manf.
Das war mein Leitfaden.

Nun hatte ich eine schöne simple Tastatur von einem Kumpel erhalten.
Diese wollte ich über einen analogen Port auswerten.
Die Bilder zur Tastatur sind im Anhang, die Farben ziehen sich durch alle Blätter - einheitlich).
Auf der Rückseite sind 2 Layer angebracht, die eine für die Umrandung und die andere für den Druckpunkt der Tasten. Den mittleren Layer konnte man mit einer Taschenlampe "verfolgen" (von anderer Seite durchleuchten).

Als die Hardware erledigt war, kam das programmieren. Da gab es gleich das Problem mit der Spannung. Diese müsste absolut konstant sein, wenn man direkt mit den Spannungswerten arbeitet.
Also habe ich der Tastatur 2x 100nF und einen 4,7yF Elko spendiert (siehe Zeichnung) und die Spannungen ausgelesen und die Werte aufgeschrieben.
Nun habe ich den Werten einen Toleranzbereich zugeordnet, indem etwas passiert (indem Fall einfach print ""). Jedoch war das sinnlos, da der Wert absolut identisch bleibt, falls die Spannungsquelle exakt identisch bleibt. Also habe ich danach mit den exakten Werten programmiert.

Aber was ist, wenn man die Spannungsquelle wechseln muss, oder ähnliches. Es reicht schon eine Differenz in 1/100 Bereich, um den erhaltenen Wert im 1/10 Bereich zu verändern.
Es blieb mir nichts anderes übrig, als alles abzuspeichern. Da Volt als single gespeichert ist, lag es auf der Hand alle Tastenspannungen auch als single abzuspeichern und vergleichen zu lassen.

Jetzt kann man durch die jeweilige Taste etwas im terminal anzeigen lassen, auf dem LCD, oder einen anderen Port damit steuern.
Zuvor muss man alle Tasten einmal drücken, diese Spannungswerte werden dann abgespeichert.
Man kann somit auch auf andere Spannungsquellen problemlos umsteigen.

Die Tastatur hat aber noch andere Zeichen (Mehrfachbelegung), also habe ich die "Ctrl", "Shift" und die "Alpha" Taste zum Umschalten missbraucht. Später kann ich dafür einen entsprechenden Schalter benutzen.
Nur die Taste "0" und die "3" haben sich überschnitten, sodass ich die Taste "Alt" als "0" betreibe.

abgespeckter Code (habe nur die Demo):

$regfile = "m32def.dat"
$framesize = 32
$swstack = 256
$hwstack = 128
$crystal = 16000000
$baud = 9600

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Pina.0 = Input
Config Pina.7 = Input
Const Ref = 5 / 1023

Dim Volt As Single
Dim Ws As Word
Dim T1 As Single
Dim T2 As Single
Dim T3 As Single
Dim T4 As Single
Dim T5 As Single
Dim T6 As Single
Dim T7 As Single
Dim T8 As Single
Dim T9 As Single
Dim T10 As Single
Dim T11 As Single
Dim T12 As Single
Dim T13 As Single
Dim T14 As Single
Dim T15 As Single
Dim T16 As Single
Dim T17 As Single
Dim T18 As Single
Dim T19 As Single
Dim T20 As Single
Dim T21 As Single
Dim T22 As Single
Dim T23 As Single
Dim T24 As Single
Dim T25 As Single
Dim T26 As Single
Dim T27 As Single
Dim T29 As Single
Dim T30 As Single

Declare Sub Initialisierung
Declare Sub Speichern
Declare Sub Terminal

Do
Print "start"
Gosub Speichern
Print "terminal"
Gosub Terminal

Loop

Sub Terminal
Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
If Volt = T1 Then
Print "F1"
Waitms 500
Elseif Volt = T2 Then
Print "F2"
Waitms 500
Elseif Volt = T3 Then
Print "Pfeilnachoben"
Waitms 500
Elseif Volt = T4 Then
Print "Esc"
Waitms 500
Elseif Volt = T5 Then
Print "Backslash"
Waitms 500
Elseif Volt = T6 Then
Print "F3"
Waitms 500
Elseif Volt = T7 Then
Print "Pfeilnachlinks"
Waitms 500
Elseif Volt = T8 Then
Print "Pfeilnachunten"
Waitms 500
Elseif Volt = T9 Then
Print "Pfeilnachrechts"
Waitms 500
Elseif Volt = T10 Then
Print "Stern"
Waitms 500
Elseif Volt = T11 Then
Print "F4"
Waitms 500
Elseif Volt = T12 Then
Print "7"
Waitms 500
Elseif Volt = T13 Then
Print "8"
Waitms 500
Elseif Volt = T14 Then
Print "9"
Waitms 500
Elseif Volt = T15 Then
Print "Plus"
Waitms 500
Elseif Volt = T16 Then
Print "F5"
Waitms 500
Elseif Volt = T17 Then
Print "4"
Waitms 500
Elseif Volt = T18 Then
Print "5"
Waitms 500
Elseif Volt = T19 Then
Print "6"
Waitms 500
Elseif Volt = T20 Then
Print "Punkt"
Waitms 500
Elseif Volt = T22 Then
Print "1"
Waitms 500
Elseif Volt = T23 Then
Print "2"
Waitms 500
Elseif Volt = T24 Then
Print "3"
Waitms 500
Elseif Volt = T25 Then
Print "Enter"
Waitms 500
Elseif Volt = T29 Then
Print "Komma"
Waitms 500
Elseif Volt = T30 Then
Print "0"
Waitms 500
End If
Loop
End Sub


Sub Initialisierung

Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
Loop Until Volt > 0
End Sub

Sub Speichern
Gosub Initialisierung
T1 = Volt
Print "F1"
Waitms 500
Gosub Initialisierung
T2 = Volt
Print "F2"
Waitms 500
Gosub Initialisierung
T3 = Volt
Print "Pfeilnachoben"
Waitms 500
Gosub Initialisierung
T4 = Volt
Print "ESC"
Waitms 500
Gosub Initialisierung
T5 = Volt
Print "Backslash"
Waitms 500
Gosub Initialisierung
T6 = Volt
Print "F3"
Waitms 500
Gosub Initialisierung
T7 = Volt
Print "Pfeilnachlinks"
Waitms 500
Gosub Initialisierung
T8 = Volt
Print "Pfeilnachunten"
Waitms 500
Gosub Initialisierung
T9 = Volt
Print "Pfeilnachrechts"
Waitms 500
Gosub Initialisierung
T10 = Volt
Print "Stern"
Waitms 500
Gosub Initialisierung
T11 = Volt
Print "F4"
Waitms 500
Gosub Initialisierung
T12 = Volt
Print "L"
Waitms 500
Gosub Initialisierung
T13 = Volt
Print "M"
Waitms 500
Gosub Initialisierung
T14 = Volt
Print "N"
Waitms 500
Gosub Initialisierung
T15 = Volt
Print "Plus"
Waitms 500
Gosub Initialisierung
T16 = Volt
Print "F5"
Waitms 500
Gosub Initialisierung
T17 = Volt
Print "Q"
Waitms 500
Gosub Initialisierung
T18 = Volt
Print "R"
Waitms 500
Gosub Initialisierung
T19 = Volt
Print "S"
Waitms 500
Gosub Initialisierung
T20 = Volt
Print "Punkt"
Waitms 500
Gosub Initialisierung
T21 = Volt
Print "Ctrl"
Waitms 500
Gosub Initialisierung
T22 = Volt
Print "U"
Waitms 500
Gosub Initialisierung
T23 = Volt
Print "V"
Waitms 500
Gosub Initialisierung
T24 = Volt
Print "U"
Waitms 500
Gosub Initialisierung
T25 = Volt
Print "Enter"
Waitms 500
Gosub Initialisierung
T26 = Volt
Print "Shifttaste"
Waitms 500
Gosub Initialisierung
T27 = Volt
Print "Alpha"
Waitms 500

Gosub Initialisierung
T29 = Volt
Print "Komma"
Waitms 500
Gosub Initialisierung
T30 = Volt
Print "Alt"
Waitms 500
End Sub

End

vollständiger Code (so soll er aussehen, aber ich kann ihn nicht testen, da er für die Demo zu groß ist ---> muss mir wohl die Vollversion kaufen =P~ ):

$regfile = "m32def.dat"
$framesize = 32
$swstack = 256
$hwstack = 128
$crystal = 16000000
$baud = 9600

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Pina.0 = Input
Config Pina.7 = Input
Const Ref = 5 / 1023

Dim Volt As Single
Dim Ws As Word
Dim T1 As Single
Dim T2 As Single
Dim T3 As Single
Dim T4 As Single
Dim T5 As Single
Dim T6 As Single
Dim T7 As Single
Dim T8 As Single
Dim T9 As Single
Dim T10 As Single
Dim T11 As Single
Dim T12 As Single
Dim T13 As Single
Dim T14 As Single
Dim T15 As Single
Dim T16 As Single
Dim T17 As Single
Dim T18 As Single
Dim T19 As Single
Dim T20 As Single
Dim T21 As Single
Dim T22 As Single
Dim T23 As Single
Dim T24 As Single
Dim T25 As Single
Dim T26 As Single
Dim T27 As Single
Dim T29 As Single
Dim T30 As Single

Declare Sub Initialisierung
Declare Sub Speichern
Declare Sub Terminal
Declare Sub Erstbelegung
Declare Sub Zweittbelegung
Declare Sub Dritttbelegung

Do
Print "start"
Gosub Speichern
Print "terminal"
Gosub Terminal

Loop

Sub Speichern
Gosub Initialisierung
T1 = Volt
Print "F1"
Waitms 500
Gosub Initialisierung
T2 = Volt
Print "F2"
Waitms 500
Gosub Initialisierung
T3 = Volt
Print "Pfeilnachoben"
Waitms 500
Gosub Initialisierung
T4 = Volt
Print "ESC"
Waitms 500
Gosub Initialisierung
T5 = Volt
Print "Backslash"
Waitms 500
Gosub Initialisierung
T6 = Volt
Print "F3"
Waitms 500
Gosub Initialisierung
T7 = Volt
Print "Pfeilnachlinks"
Waitms 500
Gosub Initialisierung
T8 = Volt
Print "Pfeilnachunten"
Waitms 500
Gosub Initialisierung
T9 = Volt
Print "Pfeilnachrechts"
Waitms 500
Gosub Initialisierung
T10 = Volt
Print "Stern"
Waitms 500
Gosub Initialisierung
T11 = Volt
Print "F4"
Waitms 500
Gosub Initialisierung
T12 = Volt
Print "L"
Waitms 500
Gosub Initialisierung
T13 = Volt
Print "M"
Waitms 500
Gosub Initialisierung
T14 = Volt
Print "N"
Waitms 500
Gosub Initialisierung
T15 = Volt
Print "Plus"
Waitms 500
Gosub Initialisierung
T16 = Volt
Print "F5"
Waitms 500
Gosub Initialisierung
T17 = Volt
Print "Q"
Waitms 500
Gosub Initialisierung
T18 = Volt
Print "R"
Waitms 500
Gosub Initialisierung
T19 = Volt
Print "S"
Waitms 500
Gosub Initialisierung
T20 = Volt
Print "Punkt"
Waitms 500
Gosub Initialisierung
T21 = Volt
Print "Ctrl"
Waitms 500
Gosub Initialisierung
T22 = Volt
Print "U"
Waitms 500
Gosub Initialisierung
T23 = Volt
Print "V"
Waitms 500
Gosub Initialisierung
T24 = Volt
Print "U"
Waitms 500
Gosub Initialisierung
T25 = Volt
Print "Enter"
Waitms 500
Gosub Initialisierung
T26 = Volt
Print "Shifttaste"
Waitms 500
Gosub Initialisierung
T27 = Volt
Print "Alpha"
Waitms 500

Gosub Initialisierung
T29 = Volt
Print "Komma"
Waitms 500
Gosub Initialisierung
T30 = Volt
Print "Alt"
Waitms 500
End Sub

Sub Initialisierung

Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
Loop Until Volt > 0
End Sub

Sub Terminal
Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
If Volt = T21 Then
Gosub Erstbelegung
Elseif Volt = T26 Then
Gosub Zweittbelegung
Elseif Volt = T27 Then
Gosub Dritttbelegung
End If
Loop Until Volt > 0
End Sub


Sub Erstbelegung
Print "Erstbelegung"
Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
If Volt = T1 Then
Print "F1"
Waitms 500
Elseif Volt = T2 Then
Print "F2"
Waitms 500
Elseif Volt = T3 Then
Print "Pfeilnachoben"
Waitms 500
Elseif Volt = T4 Then
Print "Esc"
Waitms 500
Elseif Volt = T5 Then
Print "Backslash"
Waitms 500
Elseif Volt = T6 Then
Print "F3"
Waitms 500
Elseif Volt = T7 Then
Print "Pfeilnachlinks"
Waitms 500
Elseif Volt = T8 Then
Print "Pfeilnachunten"
Waitms 500
Elseif Volt = T9 Then
Print "Pfeilnachrechts"
Waitms 500
Elseif Volt = T10 Then
Print "Stern"
Waitms 500
Elseif Volt = T11 Then
Print "F4"
Waitms 500
Elseif Volt = T12 Then
Print "7"
Waitms 500
Elseif Volt = T13 Then
Print "8"
Waitms 500
Elseif Volt = T14 Then
Print "9"
Waitms 500
Elseif Volt = T15 Then
Print "Plus"
Waitms 500
Elseif Volt = T16 Then
Print "F5"
Waitms 500
Elseif Volt = T17 Then
Print "4"
Waitms 500
Elseif Volt = T18 Then
Print "5"
Waitms 500
Elseif Volt = T19 Then
Print "6"
Waitms 500
Elseif Volt = T20 Then
Print "Punkt"
Waitms 500
Elseif Volt = T22 Then
Print "1"
Waitms 500
Elseif Volt = T23 Then
Print "2"
Waitms 500
Elseif Volt = T24 Then
Print "3"
Waitms 500
Elseif Volt = T25 Then
Print "Enter"
Waitms 500
Elseif Volt = T29 Then
Print "Komma"
Waitms 500
Elseif Volt = T30 Then
Print "0"
Waitms 500
Elseif Volt = T26 Then
Gosub Zweittbelegung
Elseif Volt = T27 Then
Gosub Dritttbelegung
End If
Loop
End Sub

Sub Zweittbelegung
Print "Zweitbelegung"
Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
If Volt = T1 Then
Print "F6"
Waitms 500
Elseif Volt = T2 Then
Print "F7"
Waitms 500
Elseif Volt = T3 Then
Print "Pg Up"
Waitms 500
Elseif Volt = T4 Then
Print "\"
Waitms 500
Elseif Volt = T5 Then
Print "Space"
Waitms 500
Elseif Volt = T6 Then
Print "F8"
Waitms 500
Elseif Volt = T7 Then
Print "Home"
Waitms 500
Elseif Volt = T8 Then
Print "End"
Waitms 500
Elseif Volt = T9 Then
Print "/"
Waitms 500
Elseif Volt = T10 Then
Print "9"
Waitms 500
Elseif Volt = T11 Then
Print "F10"
Waitms 500
Elseif Volt = T29 Then
Print "Del"
Waitms 500
Elseif Volt = T21 Then
Gosub Erstbelegung
Elseif Volt = T27 Then
Gosub Dritttbelegung
End If
Loop
End Sub

Sub Dritttbelegung
Print "Drittbelegung"
Do
Start Adc
Ws = Getadc(7)
Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen
Volt = Ws * Ref
If Volt = T1 Then
Print "A"
Waitms 500
Elseif Volt = T2 Then
Print "B"
Waitms 500
Elseif Volt = T3 Then
Print "C"
Waitms 500
Elseif Volt = T4 Then
Print "D"
Waitms 500
Elseif Volt = T5 Then
Print "E"
Waitms 500
Elseif Volt = T6 Then
Print "F"
Waitms 500
Elseif Volt = T7 Then
Print "G"
Waitms 500
Elseif Volt = T8 Then
Print "H"
Waitms 500
Elseif Volt = T9 Then
Print "I"
Waitms 500
Elseif Volt = T10 Then
Print "J"
Waitms 500
Elseif Volt = T11 Then
Print "K"
Waitms 500
Elseif Volt = T12 Then
Print "L"
Waitms 500
Elseif Volt = T13 Then
Print "M"
Waitms 500
Elseif Volt = T14 Then
Print "N"
Waitms 500
Elseif Volt = T15 Then
Print "O"
Waitms 500
Elseif Volt = T16 Then
Print "P"
Waitms 500
Elseif Volt = T17 Then
Print "Q"
Waitms 500
Elseif Volt = T18 Then
Print "R"
Waitms 500
Elseif Volt = T19 Then
Print "S"
Waitms 500
Elseif Volt = T20 Then
Print "T"
Waitms 500
Elseif Volt = T22 Then
Print "U"
Waitms 500
Elseif Volt = T23 Then
Print "V"
Waitms 500
Elseif Volt = T24 Then
Print "W"
Waitms 500
Elseif Volt = T25 Then
Print "X"
Waitms 500
Elseif Volt = T29 Then
Print "Z"
Waitms 500
Elseif Volt = T30 Then
Print "Y"
Waitms 500
Elseif Volt = T21 Then
Gosub Erstbelegung
Elseif Volt = T26 Then
Gosub Zweittbelegung
End If
Loop
End Sub

End

So, nun ein paar Bilder der Tastatur:

Reeper
08.08.2006, 18:18
So, nun noch meine Blätter und der Schaltplan:

ähM_Key
08.08.2006, 19:36
Coole Sache!
...nur wo bekommt man so ne Tastatur her, wenn man ni so nen Kumpel hat wie du? 8)
Weiß jemand, ob's die ev. auch in 'groß' in der Art gibt?

Reeper
08.08.2006, 19:46
Er hat es von einem Einschubkasten zur Raum-Kontrolle.

Die Anleitung soll eher stellvertretend für andere sein. Genausogut kann man einfach beliebig viele Taster nebeneinander anordnen und als Tastatur nehmen.
Jedoch steigt mit der Anzahl der Taster auch das Risiko der Überschneidung von Spannungswerten.