MCU's AD och Touchscreen -Hur får precission med ett finger
MCU's AD och Touchscreen -Hur får precission med ett finger
Sitter med en ATmega48 och en liten touchscreen på c:a 5x8 cm som fungerar som slavprocessor för att skicka in touch-data (bl.a.) till huvudprocessorn.
För att få bästa precission så läser jag varje tryckning från "båda håll", alltså vänder polariteten i varje led och läser en extra gång och sedan gör ett medelvärde av det.
Detta fungerar över förväntan så länge man använder något vasst föremål att trycka med.
Men använder man fingret så fladdrar värdena ganska hemskt och är sällan mitt under fingret.
Kastar även bort första läsningen (som indikerar ett godkänt tryck) och väntar även 30ms innan jag börjar läsa in det som ska bli slutresultatet.
Jag läser även flera gånger och gör ett medelvärde innan det skickas över till huvudprocessorn.
Men det är nästan så jag funderar på om det är skärmen (eftersom den är så liten) som är gjord för att endast användas med "pennor".
Har någon något banbrytande tips om tillvägagångssätt för att få bättre precission även med ett finger?
För att få bästa precission så läser jag varje tryckning från "båda håll", alltså vänder polariteten i varje led och läser en extra gång och sedan gör ett medelvärde av det.
Detta fungerar över förväntan så länge man använder något vasst föremål att trycka med.
Men använder man fingret så fladdrar värdena ganska hemskt och är sällan mitt under fingret.
Kastar även bort första läsningen (som indikerar ett godkänt tryck) och väntar även 30ms innan jag börjar läsa in det som ska bli slutresultatet.
Jag läser även flera gånger och gör ett medelvärde innan det skickas över till huvudprocessorn.
Men det är nästan så jag funderar på om det är skärmen (eftersom den är så liten) som är gjord för att endast användas med "pennor".
Har någon något banbrytande tips om tillvägagångssätt för att få bättre precission även med ett finger?
Hur många pixlar hoppar pekaren när man använder fingret och det är still? har det med storleken på anläggningsytan mellan finger och skärm eller är den ung samma?
hur lång tid tar en läsning av possitionen?
hur fungerar inläsningen av possitionen rent praktiskt? är det horisontella och vertikala ledare där man mäter om de kortslutits, ung som på en knappsats? Eler är det någon kapacitiv historia?
// daniel
hur lång tid tar en läsning av possitionen?
hur fungerar inläsningen av possitionen rent praktiskt? är det horisontella och vertikala ledare där man mäter om de kortslutits, ung som på en knappsats? Eler är det någon kapacitiv historia?
// daniel
Det är vanlig 4-tråds resistiv touchscreen.
Kör med upplösningen 240x320 och den hoppar ibland över 50 pixlar, så det är inte småfel direkt.
Tiden för mätningen är inget man märker, men i us så har jag inte mätt. I viken storleksordning menar du?
Kör med upplösningen 240x320 och den hoppar ibland över 50 pixlar, så det är inte småfel direkt.
Tiden för mätningen är inget man märker, men i us så har jag inte mätt. I viken storleksordning menar du?
jag funderar på en möjligheten att scanna av hela displayen och räkna ut var possitionen är genom att "mäta tyngdpunkten"
låt säga att du har ett 3x3 ledare
1 = tryck
0 = ej tryck
då borde man ex kunna mäta upp följande värden
0 0 1
0 1 1
0 0 1
om man trycker i kanten av displayen.
Om du då har 2 vektorer x[3] och y[3] så skulle du kunna summera index på x och y beroende på om de är tryck eller inte på just den possitionen.
I detta fall borde x vektorn få värdet
x[] = [0,1,3]
och
y[] = [1,2,1].
(hoppas du förstår hur jag fick fram värdena, annars får jag förklara lite bättre)
Då har du 2 vektorer som du mycket lättare kan arbeta med genom att t.ex filtrera med medelvärdes filter och därefter leta efter max värden för att få ut possitionen.
Men det är kanske så du gör?
Om det fortfarande "hoppar" som fasen så hade du t.ex kunnat låta värdet röra sig inom ett "fönster".
Låt säga att du beräknat possitionen till x = 23. om du i nästa mätning får ett mätvärde minre än +-10 pixlar, så ändrar du inte din beräknade possition. Men om det är som du säger, att den hoppar 50 pixlar så tror jag inte att detta är den första åtgärden man ska göra.
låt säga att du har ett 3x3 ledare
1 = tryck
0 = ej tryck
då borde man ex kunna mäta upp följande värden
0 0 1
0 1 1
0 0 1
om man trycker i kanten av displayen.
Om du då har 2 vektorer x[3] och y[3] så skulle du kunna summera index på x och y beroende på om de är tryck eller inte på just den possitionen.
I detta fall borde x vektorn få värdet
x[] = [0,1,3]
och
y[] = [1,2,1].
(hoppas du förstår hur jag fick fram värdena, annars får jag förklara lite bättre)
Då har du 2 vektorer som du mycket lättare kan arbeta med genom att t.ex filtrera med medelvärdes filter och därefter leta efter max värden för att få ut possitionen.
Men det är kanske så du gör?
Om det fortfarande "hoppar" som fasen så hade du t.ex kunnat låta värdet röra sig inom ett "fönster".
Låt säga att du beräknat possitionen till x = 23. om du i nästa mätning får ett mätvärde minre än +-10 pixlar, så ändrar du inte din beräknade possition. Men om det är som du säger, att den hoppar 50 pixlar så tror jag inte att detta är den första åtgärden man ska göra.
dangraf: jag tror att du inte har förstådd hur en touchscreen fungerar.
Den består av 2 genomskinliga lager av "notståndsmassa", längs över- och underkant sitter det en lång elektrod på ena lagret, dessa är anslutningarna till ena motståndsytan, likaså på höger- och vänsterkanten men då det andra motstånd.
När man petar på ytan kommer de 2 motståndsytor i kontakt med varandra på ett punkt, motsvarande 2 mittledare på 2 potentiometra.
Om man då lägger GND på underkant och +5V på överkant kan man, vid att frikoppla höger- och vänsterkanterna, mäta en spänning som anger vilken Y-koordinat man är på. Sedan kan man polarisera om, byta håll och en massa men det är principen, läsa Y, läsa X osv.
Jag funderar på om det kan vara så att man ska läsa på BÅDA "utgångar" från touchplattan för att få ett legalt värde, om det finns en ströbelastning kan det nog snabbt skena iväg.
Den består av 2 genomskinliga lager av "notståndsmassa", längs över- och underkant sitter det en lång elektrod på ena lagret, dessa är anslutningarna till ena motståndsytan, likaså på höger- och vänsterkanten men då det andra motstånd.
När man petar på ytan kommer de 2 motståndsytor i kontakt med varandra på ett punkt, motsvarande 2 mittledare på 2 potentiometra.
Om man då lägger GND på underkant och +5V på överkant kan man, vid att frikoppla höger- och vänsterkanterna, mäta en spänning som anger vilken Y-koordinat man är på. Sedan kan man polarisera om, byta håll och en massa men det är principen, läsa Y, läsa X osv.
Jag funderar på om det kan vara så att man ska läsa på BÅDA "utgångar" från touchplattan för att få ett legalt värde, om det finns en ströbelastning kan det nog snabbt skena iväg.
Men, hur små "saker" förväntar man sig kunna "peka" på med ett *finger* ??
Normalt brukar det ju vara ganska stora blaffor till "knappar" som man
ska pricka. Om man har knappens ytter-koordinater så borde det gå
att se vilken av knapparan man pekar på, det brukar ju vara fler än en,
även om värdet fladdrar en hel del.
Normalt brukar det ju vara ganska stora blaffor till "knappar" som man
ska pricka. Om man har knappens ytter-koordinater så borde det gå
att se vilken av knapparan man pekar på, det brukar ju vara fler än en,
även om värdet fladdrar en hel del.
OK, jag har läst in mig lite på hur den fungerar och hänger nog med lite bättre nu, var lite het på gröten att pressentera mitt förslag 
måste man inte har en OP koppling till AD omvandlaren pga dess egna innre resistans för att inte påverka mätresultatet?
Mäter man över 1000 ggr i sekunden kan man väl lätt summera ihop 16 värden och medelvärdesbilda, det brukar ta bort en hel del brus. skifta 4 steg tar bara nån extra klockcykel.
Hur ser matningsspänningen ut till touchscreenen, hinner den stiga till 5V eller 3.3V innan du börjar göra AD omvandlingen? Det finns väl en möjlighet att det finns en viss kapacitans som måste laddas upp/ur?

måste man inte har en OP koppling till AD omvandlaren pga dess egna innre resistans för att inte påverka mätresultatet?
Mäter man över 1000 ggr i sekunden kan man väl lätt summera ihop 16 värden och medelvärdesbilda, det brukar ta bort en hel del brus. skifta 4 steg tar bara nån extra klockcykel.
Hur ser matningsspänningen ut till touchscreenen, hinner den stiga till 5V eller 3.3V innan du börjar göra AD omvandlingen? Det finns väl en möjlighet att det finns en viss kapacitans som måste laddas upp/ur?
Det *är* stora knappar, den missar ändå.
Jag *gör* medelvärdesberäkning, det hamnar snett ändå (varpå min fundering kring skärmens tänkta användningsområde).
Jag *har* provat läst båda utgångarna, men de ger samma resultat (och det borde dom ju rent logiskt göra också).
Jag *vänter* även polariseringen och mäter för att få både över- och underkant på fingret.
Jag *har* smittats av Sodjans asterisker.
Jag *gör* medelvärdesberäkning, det hamnar snett ändå (varpå min fundering kring skärmens tänkta användningsområde).
Jag *har* provat läst båda utgångarna, men de ger samma resultat (och det borde dom ju rent logiskt göra också).
Jag *vänter* även polariseringen och mäter för att få både över- och underkant på fingret.
Jag *har* smittats av Sodjans asterisker.
Jag labbade för ett tag sen med en 128x64 lcd med touchscreen.
Det jag upptäckte var att det kan behövas lite tid mellan man polariserar om touchscreen tills man läser värdet. Det hela behöver väl stabilisera sig lite kanske....
Jag löste det genom att använde en interrupt rutin. Varannan gång läste jag X och den andra gången .Y I slutet på interupptrutinen förberedde jag nästa läsning genom att polarisera om. På så vis fick jag en liten fördröjning mellan polarisering och avläsningen.
Nått sånt här: (basic...)
Slutligen använde jag ett par små kondensatorer över touchsreenen
Det jag upptäckte var att det kan behövas lite tid mellan man polariserar om touchscreen tills man läser värdet. Det hela behöver väl stabilisera sig lite kanske....
Jag löste det genom att använde en interrupt rutin. Varannan gång läste jag X och den andra gången .Y I slutet på interupptrutinen förberedde jag nästa läsning genom att polarisera om. På så vis fick jag en liten fördröjning mellan polarisering och avläsningen.
Nått sånt här: (basic...)
Kod: Markera allt
Toggle Touch_pol
If Touch_pol = 0 Then
Temp_y = Getadc(2) ' read y
Config Pina.0 = Output ' prepare for next read
Config Pina.1 = Input
Config Pina.2 = Output
Config Pina.3 = Input
Porta.0 = 1
Porta.2 = 0
Else
Temp_x = Getadc(3) ' read x
Config Pina.0 = Input ' prepare for next read
Config Pina.1 = Output
Config Pina.2 = Input
Config Pina.3 = Output
Porta.1 = 1
Porta.3 = 0
Touch_uppd = 1
End If
jag måste säga att det är ganska svårt att sitta här och gissa exakt vad du gjort och varför det inte fungerar eftersom du inte kommer med särskillt mycket information.
ex: "Kastar även bort första läsningen (som indikerar ett godkänt tryck) och väntar även 30ms innan jag börjar läsa in det som ska bli slutresultatet."
Vad menas med detta? Gör du första mätningen, väntar 30ms polvänder och mäter igen?? mellan vilka moment har du lagt in fördröjningen? Det är kanske väldigt viktigt att du placerar 30ms fördröjningen mellan det att du polariserat som du vill och läser av ADn.
ex2: "Jag läser även flera gånger och gör ett medelvärde innan det skickas över till huvudprocessorn. "
vad är flera gånger?? 1,2 53 eller 0.2sek?? har du något krav på hur ofta du måste uppdatera possitionen?
exakt hur ser din applikation ut hårdvarumässigt?
Vilka steg har du tagit för att felsöka hårdvaran så att du vet att det är den det är fel på?
vad har du gjort för att verifiera att AD omvandlaren och din kod fungerar som den ska?
har du något datablad över just din touchscreen?
Det kanske är som du säger, att skärmen bara klarar av vassa objekt. Har du testat detta? t.ex genom att lägga ut 5 och 0 V på övre och mäta på nedre med oscilloskop för att se om värdet är stabilt?
trycker du över ett stort område som motsvara 3.3-3.5V vad får du då för mätvärde? övre, undre eller medelvärdet??
ex: "Kastar även bort första läsningen (som indikerar ett godkänt tryck) och väntar även 30ms innan jag börjar läsa in det som ska bli slutresultatet."
Vad menas med detta? Gör du första mätningen, väntar 30ms polvänder och mäter igen?? mellan vilka moment har du lagt in fördröjningen? Det är kanske väldigt viktigt att du placerar 30ms fördröjningen mellan det att du polariserat som du vill och läser av ADn.
ex2: "Jag läser även flera gånger och gör ett medelvärde innan det skickas över till huvudprocessorn. "
vad är flera gånger?? 1,2 53 eller 0.2sek?? har du något krav på hur ofta du måste uppdatera possitionen?
exakt hur ser din applikation ut hårdvarumässigt?
Vilka steg har du tagit för att felsöka hårdvaran så att du vet att det är den det är fel på?
vad har du gjort för att verifiera att AD omvandlaren och din kod fungerar som den ska?
har du något datablad över just din touchscreen?
Det kanske är som du säger, att skärmen bara klarar av vassa objekt. Har du testat detta? t.ex genom att lägga ut 5 och 0 V på övre och mäta på nedre med oscilloskop för att se om värdet är stabilt?
trycker du över ett stort område som motsvara 3.3-3.5V vad får du då för mätvärde? övre, undre eller medelvärdet??
anlamotte:
Tack, men jag gör ganska stora väntan mellan varje läsning, 1ms, har ju inte så bråttom som tur är.
sodjan:
Det finns ju _alternativ_, men *detta* har fastnat på något vis. Folk letar alltid efter möjligheter att uttrycka sig i skrift såsom man gör i tal. Därav dessa:
dangraf:
Du jiddrar på fel nivå. Hårdvaran är en touchscreen med 4 trådar som är direkt dragna till AD:n på AVR:en. Vill du ha schema på det?
Allt funkar eftersom det går över förväntan med spetsiga föremål. Det jag är ute efter är om det finns något "smart" sätt att läsa av ett fingers mitt. Mer av algoritmisk typ.
Det du vill ha förtydligat är så tydligt så jag vet inte ens hur jag kan formulera om det.
>> vad är flera gånger?? 1,2 53 eller 0.2sek?? har du något krav på hur ofta du måste uppdatera possitionen?
Vad har det för betydelse? Jag gör en medelvärdesberäkning över flera mätningar för att få en noggrannare position. That's it!
>> Vad menas med detta? Gör du första mätningen, väntar 30ms polvänder och mäter igen?? mellan vilka moment har du lagt in fördröjningen? Det är kanske väldigt viktigt att du placerar 30ms fördröjningen mellan det att du polariserat som du vill och läser av ADn.
Jag menar att jag kastar bort första läsningen (som indikerar ett godkänt tryck) och väntar sedan 30ms innan jag börjar läsa in det som ska bli slutresultatet. Ungefär!
Tack, men jag gör ganska stora väntan mellan varje läsning, 1ms, har ju inte så bråttom som tur är.
sodjan:
Det finns ju _alternativ_, men *detta* har fastnat på något vis. Folk letar alltid efter möjligheter att uttrycka sig i skrift såsom man gör i tal. Därav dessa:

dangraf:
Du jiddrar på fel nivå. Hårdvaran är en touchscreen med 4 trådar som är direkt dragna till AD:n på AVR:en. Vill du ha schema på det?

Allt funkar eftersom det går över förväntan med spetsiga föremål. Det jag är ute efter är om det finns något "smart" sätt att läsa av ett fingers mitt. Mer av algoritmisk typ.
Det du vill ha förtydligat är så tydligt så jag vet inte ens hur jag kan formulera om det.
>> vad är flera gånger?? 1,2 53 eller 0.2sek?? har du något krav på hur ofta du måste uppdatera possitionen?
Vad har det för betydelse? Jag gör en medelvärdesberäkning över flera mätningar för att få en noggrannare position. That's it!
>> Vad menas med detta? Gör du första mätningen, väntar 30ms polvänder och mäter igen?? mellan vilka moment har du lagt in fördröjningen? Det är kanske väldigt viktigt att du placerar 30ms fördröjningen mellan det att du polariserat som du vill och läser av ADn.
Jag menar att jag kastar bort första läsningen (som indikerar ett godkänt tryck) och väntar sedan 30ms innan jag börjar läsa in det som ska bli slutresultatet. Ungefär!
* Hur många värden man drar medelvärdet över har STOR betydelse. kör du ett medelvärde över de 2 senaste eller 128 senaste inläsningarna ger olika resultat, det är självklart. kör du "klossar" av 128 värden och uppdaterar vart 128 värde eller kör en cirkulär vektor och uppdaterar varje värde med ett medel på 128 har det oxå betydelse.
* hur hårdvaran fungerar och om du har en OP mellan som buffert kan ha STOR betydelse. Hur VET du att det inte är en tillfällighet att det fungerar med spetsiga föremål? Om du trycker med ett stort finger och får en stor anläggningsyta mellan 2 resistiva skickt skulle inte detta teoretiskt kunna ha en påverkan eftersom impedansen inte får överstiga ett visst värdet (misstänker jag)?
* har du kollat med skåpet? utan den testen kan man hitta på vilken algorithm som helst utan att man får det att fungera. Om det funkar med skåpet men inte med mjukvaran så ligger antagligen felet i din inläsning på nått sätt. Hoppar spänningsnivån kan man försöka ta reda på vad det beror på, hårt/mjukt tryck? svett på händerna? värme som påverkar resistansen/spänningen?
"Du jiddrar på fel nivå."
när jag löser mina problem börjar jag med att grundligt undersöka hårdvaran och därefter arbeta mig upp mot mjukvaran, det är min metod och den brukar fungera.
Jag har ingen aning om hur duktig du är eller hur bra du är på att verifiera och testa så att allt fungerar. jag tycker inte att du visat nånstans på vilket sätt du säkerställt att allt borde fungera och exakt vart felet ligger.
Om du vill ha en algorithm får du analysera dina mätvärden. vilken varians har du? får du hyffsat jämna värden medan vissa av värdena är åt h-vete fel? possitionen på pekaren, är den nånstans kring fingret, eller är den oxå helt åt helvete fel? alltid lite ovanför vänster mot 5V eller likande slutsats?. Har du nån plott på dina mätvärden så du kan illustrera hur illa signalen ser ut? Om du nu ber om en algorithm kan man inte gissa sig till den heller.
Vill du inte ha hjälp så struntar jag i det. du har ju gjort allt som du ska, så då funkar det ju tydligen.
* hur hårdvaran fungerar och om du har en OP mellan som buffert kan ha STOR betydelse. Hur VET du att det inte är en tillfällighet att det fungerar med spetsiga föremål? Om du trycker med ett stort finger och får en stor anläggningsyta mellan 2 resistiva skickt skulle inte detta teoretiskt kunna ha en påverkan eftersom impedansen inte får överstiga ett visst värdet (misstänker jag)?
* har du kollat med skåpet? utan den testen kan man hitta på vilken algorithm som helst utan att man får det att fungera. Om det funkar med skåpet men inte med mjukvaran så ligger antagligen felet i din inläsning på nått sätt. Hoppar spänningsnivån kan man försöka ta reda på vad det beror på, hårt/mjukt tryck? svett på händerna? värme som påverkar resistansen/spänningen?
"Du jiddrar på fel nivå."
när jag löser mina problem börjar jag med att grundligt undersöka hårdvaran och därefter arbeta mig upp mot mjukvaran, det är min metod och den brukar fungera.
Jag har ingen aning om hur duktig du är eller hur bra du är på att verifiera och testa så att allt fungerar. jag tycker inte att du visat nånstans på vilket sätt du säkerställt att allt borde fungera och exakt vart felet ligger.
Om du vill ha en algorithm får du analysera dina mätvärden. vilken varians har du? får du hyffsat jämna värden medan vissa av värdena är åt h-vete fel? possitionen på pekaren, är den nånstans kring fingret, eller är den oxå helt åt helvete fel? alltid lite ovanför vänster mot 5V eller likande slutsats?. Har du nån plott på dina mätvärden så du kan illustrera hur illa signalen ser ut? Om du nu ber om en algorithm kan man inte gissa sig till den heller.
Vill du inte ha hjälp så struntar jag i det. du har ju gjort allt som du ska, så då funkar det ju tydligen.