Bei Banggood gibt es unter der Bestellnummer SKU023939 ein Austausch-Touchpad für den Nintendo DS für momentan 1.89€ . Dieses besteht aus einem widerstandssensitivem Touchscreen in der nutzbaren Größe ~ 6.5cm x 5cm. Angeschlossen wird das Pad über einen Folienstecker; beziehbar aus div. Quellen im Internet, ich habe einfach Kupfereinzellitzen angelötet und auf einen Pfostenstecker geführt.
(Quelle: http://www.microbuilder.eu/Tutorials/LPC2148/ADC/NDSTouchScreen.aspx)
Kombiniert man diesen Touchscreen mit einem (grafischen) LCD oder im einfachsten Fall einem hinterlegten Papier mit aufgemalten Schaltflächen, hat man auf einfache und effiziente Weise eine sehr flexible Eingabemöglichkeit :-)
Zum Auslesen muss an zwei Pins ein Spannung angelegt und über einen weitern Pin gemessen werden. Damit kann man auf einfache Art die x und y-Position auslesen. Etwas kniffliger ist dabei nur, dass die Auswahl der Pins dynamisch (also für x- und y-Bestimmung) geändert werden muss:
Ob an Y2 oder Y2 gemessen wird ist egal, wichtig ist nur den zweiten Pin nicht zu beschalten, sprich hochohmig zu machen.
Die zu erwartenden Widerstände liegen - je nach Position - bei ca 500-1.3k Ohm, gemessen an den ADC Anschlüssen gegenüber der VCC/GND Versorgung. Wird nichts gedrückt, floated der entsprechende ADC-Pin
Ein einfaches Anwendungsbeispiel (lese und gebe Position aus) in Verbindung mit meinem ATMega8 Modul und einem LCD kann als
Bascom-Code hier entnommen werden:$Regfile="m8def.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32
' ------------------------------- Initialisierungen
' LCD
Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portd.6 , Db6 = Portd.5 , Db7 = Portd.4 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2
initlcd
Cls
Cursor Off
' ADC
Config Adc = Single , Prescaler = Auto , Reference = avcc
Start Adc
' Pins
LCDLight alias portb.2:config LCDLight = output:set lcdlight
' ------------------------------- Variablendeklaration
dim pos(2) as word
' ------------------------------- Programmbeginn
' X1 Y2 X2 Y1
' C.2 C.3 D.3 D.2
' 12 11 14 13
'measure X: VCC ADC GND --
'measure Y: ADC VCC -- GND
'
' PC2/3 per PullDown Widerstand (10k) auf GND ziehen, damit stabiles Ergebnis und Erkennung von "Nicht gedrückt" erfoglt
lcd "Touchscreen"
lowerline
lcd version()
wait 1
cls
do
' bei den Deklarationen der Ein/Ausgänge erst auf Eingang setzten,
' da sonst "Kurschluss" vorkommen kann
' lese X Position
ddrc.3=0:ddrd.2=0 'Y2 und Y1 auf Eingang
portc.3=1:portd.2=0 'Y2 pull-up und und Y1 in tristate
ddrc.2=1:ddrd.3=1 'X1 und X2 auf Ausgang
portc.2=1:portd.3=0' X1=1, X2=0
pos(1)=getadc(3) ' lese ADC Wert
' lese Y Position
ddrc.2=0:ddrd.3=0 'X1 und X2 auf Eingang
portc.2=1:portd.3=0' X1 pull-up und X2 in tristate
ddrc.3=1:ddrd.2=1 'Y2 und Y1 auf Ausgang
portc.3=1:portd.2=0 'Y2=1 und Y1=0
pos(2)=getadc(2) ' lese ADC Wert
'Ausgabe
upperline
lcd "X: ";
if pos(1)<30 or pos(1)>1000 then
lcd " "
else
lcd pos(1);" "
end if
lowerline
lcd "Y: ";
if pos(2)<30 or pos(2)>1000 then
lcd " "
else
lcd pos(2);" "
end if
waitms 100
loop
Diese Version berücksicht natürlich auch den Zustand, dass nichts gedrückt ist; durch den intern geschalten PullUp an den ADC Eingängen stabilisiert wird der Lesepin stabilisiert. Damit wird bei "nichts gedrückt" je nach Beschaltung min. oder max Spannung gelesen und in diesem Codeschnipsel ausgeblendet.
Dies ist schön in diesem kleinen Video zu sehen:
Nützliche Hilfe zur Programmierung der GPIO Pins gab auch die Seite 422 aus Günter Schmitt's "Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie" ISBN 978-3-486-58988-7, ein Foto der Seite ist auch unten zu finden
Dieses Beispiel zeigt die Funktion mit 16 Schaltflächen. Die "Buttons" sind auf Papier gedruckt und von hinten an den Screen geklebt.
Software (Touchscreen 0.3) und Druckvorlage sind im Downloadbereich zu finden