logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c/bascom][mega...]Usuwanie szumów z touchpanela

piotrva 15 Lut 2011 15:36 2136 4
REKLAMA
  • #1 9155278
    piotrva
    VIP Zasłużony dla elektroda
    Witam!
    Mam wyświetlacz graficzny i touchpanel rezystancyjny zamontowany na nim.
    Odczyt współrzędnych i ich przeliczanie to nie żaden problem, ale trudności pojawiają się w innym miejscu. mianowicie napisałem sobie prosty program (w bascom, bo niestety znalezione przez mnie biblioteki w C do t6963c działają strasznie wolno z wyświetlaczem 240*128, a na razie nie mam czasu żeby je przyspieszyć, a te z bascoma spisują się nadpodziw dobrze, ale to inna sprawa), prosty program, który pozwala rysować po ekranie. Przy względnie silniejszym naciskaniu rysika wszystko jest OK, ale gdy rysik przyciśnie się słabiej do Touchpanelu to wtedy piksele pojawiają się nie tylko w miejscu dotyku, ale także w dość dużej odległości od niego (2-5cm)
    I teraz moje pytanie brzmi tak, czy istnieje jakiś algorytm eliminujący takie błędy?
    Z góry dziękuję za odpowiedzi i naprowadzenie na jakąś skuteczną metodę poradzenia sobie z tym problemem
    
    $regfile = "m644pdef.dat"
    $crystal = 16000000
    $lib "glcd.lib"
    Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portc , Ce = 7 , Cd = 6 , Wr = 5 , Rd = 4 , Reset = 3 , Fs = 2 , Mode = 6
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    Dim X As Word , Y As Word , Xt As Single , Yt As Single
    
    Cls
    'Locate 1 , 1
    'Lcd "Touch Panel Test"
    Box(11 , 6) -(43 , 24) , 255
    Cursor Off Noblink
    
    Left_pin Alias Pina.0
    Left_port Alias Porta.0
    
    Right_pin Alias Pina.2
    Right_port Alias Porta.2
    
    Bottom_pin Alias Pina.1
    Bottom_port Alias Porta.1
    
    Top_pin Alias Pina.3
    Top_port Alias Porta.3
    
    
    Do
    'Waitms 250
    Config Left_pin = Output
    Config Right_pin = Output
    Config Top_pin = Input
    Config Bottom_pin = Input
    Top_port = 1
    Bottom_port = 1
    Left_port = 0
    Right_port = 1
    Waitms 6
    Y = Getadc(1)
    Yt = Y - 200
    Yt = Yt / 2.83333333333
    Y = Yt
    
    
    Config Left_pin = Input
    Config Right_pin = Input
    Config Top_pin = Output
    Config Bottom_pin = Output
    Left_port = 1
    Right_port = 1
    Top_port = 0
    Bottom_port = 1
    Waitms 6
    X = Getadc(0)
    Xt = X - 330
    Xt = Xt / 3.4375
    X = Xt
    
    If Y >= 0 And Y <= 239 And X >= 0 And X <= 127 Then
    Locate 2 , 3
    Lcd "Y:"
    If Y < 10 Then Lcd "0"
    If Y < 100 Then Lcd "0"
    Lcd Y
    
    Locate 3 , 3
    Lcd "X:"
    If X < 10 Then Lcd "0"
    If X < 100 Then Lcd "0"
    Lcd X
    
    Pset Y , X , 255
    Else
    Locate 2 , 3
    Lcd "Y:N/A"
    
    Locate 3 , 3
    Lcd "X:N/A"
    End If
    
    If Y > 11 And Y < 43 And X > 6 And X < 24 Then
    Cls
    'Locate 1 , 1
    'Lcd "Touch Panel Test"
    Box(11 , 6) -(43 , 24) , 255
    End If
    
    
    
    Loop
    
    End
    
  • REKLAMA
  • Pomocny post
    #2 9155956
    rrytel
    Poziom 14  
    w temacie Link znalazłem:
    atom1477 napisał:
    Przecież to normalne zachowanie panelu.
    Żeby było dobrze to pomiędzy odczytami osi X i Y trzeba jeszcze odczytywać "współrzędną" Z.
    W zasadzie to od Z trzeba zaczynać i dopiero jak będzie odpowiednia do odczytywać X i Y.
    Odczyt Z:
    X- i X+: Output i na GND
    Y- i Y+: Input i podciąganie do VCC.
    Czekamy kilka ms i odczytujemy wartość ADC z Y- albo Y+.
    Jak bliska VCC to znaczy że panel nie jest dotknięty.
    Jak bliska GND to znaczy że jest dotknięty.
    Gdy mamy blisko GND (czyli panel dotknięty) to dopiero zabieramy się za odczyt osi X i Y.
    Swoją drogą przy odrobinie szczęścia można z tej "współrzędnej" Z zrobić pożytek, na przykład uzależnić od niej grubość rysowanej linii jeżeli ktoś robi jakiegoś Painta na panelu dotykowym.


    można by odczytywać współrzędną Z i reagować na nacisk dopiero od odpowiedniej siły (niestety sposób nie testowany przeze mnie)[/quote]
  • REKLAMA
  • #3 9156494
    piotrva
    VIP Zasłużony dla elektroda
    tak też zrobiłem iii...
    efekt bardzo zadowalający - wszystko działa dokładnie jak chciałem, co prawda wymaga jeszcze drobnej kalibracji, bo Z odczytuje mi się troszeczkę nieliniowo, ale ogólnie działa.
    dzięki za pomoc
  • REKLAMA
  • #4 9160496
    adambehnke
    Poziom 24  
    Podepnę się do tematu. Mam ten sam problem z reakcją na siłę nacisku i czasem naciskając jeden klawisz włącza mi się inny.
    Czy autor mógłby udostępnić procedurkę odczytu osi Z (lub całą procedurę odczytu dotyku) .
    A może Autor znalazł sposób aby dotknięcie ekranu było efektem wywołania przerwania? Można by np. usypiać całe urządzenie a dotknięcie ekranu wybudzało by go. Ja stosowałem dla prób zwykłą diodę 1N4148 podpiętą do jednej osi panela i do INT1. Efekt jakiś tam sobie był ale nie zadowalający do końca.
  • #5 9160597
    piotrva
    VIP Zasłużony dla elektroda
    1. poniżej mój program z odczytem Z, bez komentarzy, bo pisałem na szybko, ale myślę, że koledzy połapią się o co chodzi
    odczytuję Z 2 razy i sumuję 2 pomiary, gdyż nieliniowość o której wspomniałem wynikała z odczytu tylko z jednej strony, odczyt z dwóch stron załatwia sprawę, trzeba tylko odpowiednio dobrać Z
    poza tym w kodzie wszystkie współrzędne sa czytane non stop, a docelowo X i Y powinny być czytane po stwierdzeniu odpowiednio niskiego Z
    2. ja mam osobiście taki pomysł na wybudzanie urządzenia:
    a) ustawiamy na jedną oś VCC
    b) dowolne wyprowadzenie z drugiej osi podpinamy do komparatora A/C
    c) drugie wyprowadzenie komparatora wysterowujemy np. potencjometrem aby komparator reagował na dotknięcie
    d) używamy przerwania komparatora na odpowiednim zboczu
    e) po wybudzeniu urządzenia przełączamy wejście komparatora w stan wysokiej impedancji i załączamy normalny program.
    f) po upływie wyznaczonego czasu nieaktywności urządzenia odpowiednio ustawiamy i przywracamy do pracy komparator
    
    $regfile = "m644pdef.dat"
    $crystal = 16000000
    $lib "glcd.lib"
    Config Graphlcd = 240 * 128 , Dataport = Portb , Controlport = Portc , Ce = 7 , Cd = 6 , Wr = 5 , Rd = 4 , Reset = 3 , Fs = 2 , Mode = 6
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    Dim X As Word , Y As Word , Xt As Single , Yt As Single , Z As Word , Z2 As Long
    
    Cls
    'Locate 1 , 1
    'Lcd "Touch Panel Test"
    Box(11 , 6) -(43 , 24) , 255
    Cursor Off Noblink
    
    Left_pin Alias Pina.0
    Left_port Alias Porta.0
    
    Right_pin Alias Pina.2
    Right_port Alias Porta.2
    
    Bottom_pin Alias Pina.1
    Bottom_port Alias Porta.1
    
    Top_pin Alias Pina.3
    Top_port Alias Porta.3
    
    
    Do
    'Waitms 250
    Config Left_pin = Output
    Config Right_pin = Output
    Config Top_pin = Input
    Config Bottom_pin = Input
    Top_port = 1
    Bottom_port = 1
    Left_port = 0
    Right_port = 1
    'Waitms 6
    Y = Getadc(1)
    Yt = Y - 200
    Yt = Yt / 2.83333333333
    Y = Yt
    
    
    Config Left_pin = Input
    Config Right_pin = Input
    Config Top_pin = Output
    Config Bottom_pin = Output
    Left_port = 1
    Right_port = 1
    Top_port = 0
    Bottom_port = 1
    'Waitms 6
    X = Getadc(0)
    Xt = X - 330
    Xt = Xt / 3.4375
    X = Xt
    
    Config Left_pin = Input
    Config Right_pin = Input
    Config Top_pin = Output
    Config Bottom_pin = Output
    Left_port = 1
    Right_port = 1
    Top_port = 0
    Bottom_port = 0
    Waitms 3
    Z = Getadc(0)
    Z2 = Z
    Z = Getadc(2)
    Z2 = Z2 + Z
    
    
    
    
    
    
    If Y >= 0 And Y <= 239 And X >= 0 And X <= 127 And Z2 < 150 Then
    Locate 3 , 3
    Lcd "Y:"
    If Y < 10 Then Lcd "0"
    If Y < 100 Then Lcd "0"
    Lcd Y
    
    Locate 2 , 3
    Lcd "X:"
    If X < 10 Then Lcd "0"
    If X < 100 Then Lcd "0"
    Lcd X
    
    Locate 5 , 3
    Lcd "Z:"
    If Z2 < 10 Then Lcd "0"
    If Z2 < 100 Then Lcd "0"
    If Z2 < 1000 Then Lcd "0"
    Lcd Z2
    
    Pset Y , X , 255
    Else
    Locate 3 , 3
    Lcd "Y:N/A"
    
    Locate 2 , 3
    Lcd "X:N/A"
    
    Locate 5 , 3
    Lcd "Z:"
    If Z2 < 10 Then Lcd "0"
    If Z2 < 100 Then Lcd "0"
    If Z2 < 1000 Then Lcd "0"
    Lcd Z2
    End If
    
    If Y > 11 And Y < 43 And X > 6 And X < 24 Then
    Cls
    'Locate 1 , 1
    'Lcd "Touch Panel Test"
    Box(11 , 6) -(43 , 24) , 255
    End If
    
    
    
    Loop
    
    End
    
REKLAMA