Räkna ut lutningen på analoga-spakar

Permalänk
Medlem

Räkna ut lutningen på analoga-spakar

Vill ha ett värde på 0-1000 där 0 är i mitten och 1000 längst ut i kanten.
Dessa beräkningar funkar bra i mitten men i kanterna ger de värden över 1000.
Vänstra spaken går från -1000 till 1000
√(X^2+Y^2)

Högra spaken går från 0 till 65535
((X-32767)^2+(Y-32767)^2)/32.767

Skulle kunna ha ett maxvärde på 1000 om det bara var speed strafing jag ville förhindra men behöver korrekta värden.

Promblemet är att spakarna är avrundade kvadrater och inte cirlkar så de blir "luddiga" ut i kanterna och man får maxvärden 20-40° ifrån räta vinklar och samma position på spakarna ger inte alltid samma värden.

EDIT: maxvärde funkar, värdena är korrekta, har inte hållt på med sånt här förut så blev förvirrad när jag började med det

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401

Permalänk

Vad ska du ha lutningen till? Kan du inte bara använda de resulterande värdena som faktorer i uträkningen av hur mycket/lite någonting ska förändras?

Visa signatur

Supermicro X10SDV-6C-TLN4F m. Xeon-D 1528 | Crucial 64GB 2400MHz ECC | Silverstone DS380B | Corsair SF450 450W | HDD

Permalänk
Medlem

Jag följer tråden med intresse, men baserat på din första post är inte dina spakar tillräckligt tillförlitliga för att basera uträkningen på.

Visa signatur

Desktop: | Win10 | InWin 303 | ASUS TUF X570 | AMD Ryzen 5 3600 | Noctua NH-U12S (PP) | Intel 600p 256GB | Gigabyte GTX 670 | 32GB DDR4 2400Mhz | Corsair RM650x | 3x 1080 Screens |
Datacenter: | 1x Physical | 1x Virtual |
Laptop: | 2x |

Dell Certified Technician

Permalänk
Medlem
Skrivet av JamesBanana:

Jag följer tråden med intresse, men baserat på din första post är inte dina spakar tillräckligt tillförlitliga för att basera uträkningen på.

Jag tyckte det verkade märkligt när samma läge på spakarna gav olika värden olika gånger men då hade jag bara kollat på värdena, men när du skrev att spakarna inte var tillförlitliga gjorde jag ett litet test och precisionen var sämre än jag trodde.
Vänster spak

Höger spak

Dessutom rör det sig i alla fall på vänsterspaken i alltför raka linjer för att kunna vara rådata

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401

Permalänk
Medlem
Skrivet av Andre_H:

Jag tyckte det verkade märkligt när samma läge på spakarna gav olika värden olika gånger men då hade jag bara kollat på värdena, men när du skrev att spakarna inte var tillförlitliga gjorde jag ett litet test och precisionen var sämre än jag trodde.
Vänster spak
http://i.imgur.com/RbxANVK.jpg

Höger spak
http://i.imgur.com/BPsjGb8.jpg

Dessutom rör det sig i alla fall på vänsterspaken i alltför raka linjer för att kunna vara rådata

Vad är det för typ av spakar? Jag mixtrade med en spak till Playstation 2 för några år sedan, och den var ganska besvärlig. Då körde jag med helt ren rådata (analog koppling till en Arduino, mjukvara knackad i assembler). Bland annat kunde nollpunkten röra sig en del och den hade en tendens att hoppa mellan vissa värden (xxxx0111 och xxxx0011) .

Visa signatur

Desktop: | Win10 | InWin 303 | ASUS TUF X570 | AMD Ryzen 5 3600 | Noctua NH-U12S (PP) | Intel 600p 256GB | Gigabyte GTX 670 | 32GB DDR4 2400Mhz | Corsair RM650x | 3x 1080 Screens |
Datacenter: | 1x Physical | 1x Virtual |
Laptop: | 2x |

Dell Certified Technician

Permalänk
Rekordmedlem

Du får väl byta spakar eller göra nån typ av filter och kalibreringsfunktion i mjukvara, är det "potentiometerspakar" som ger olika resistans beroende på position ? I så fall så påverkas de antagligen av mekaniska glapp i släpskor o dylikt, det kan säkert också skilja beroende på kontakttrycket, det gör att det blir lite olika värden beroende på hur du rört spaken innan du hamnar på den vinkel du vill läsa av, bra vinkelgivare med hög repetitionsnogranhet är dyra, bara en ren potentiometer som är bra kan kosta 1000kr styck, man måste trimma dem, tex skära till måtten på resistansbanan med en laser individuellt för att de ska håla hög precision, men det borde gå att lösa mycket med mjukvaran, tex ta hänsyn till hur spaken rörts "före" så att man kan förutsäga det mekaniska glappet, typ om du byter riktning på spaken så kanske den kräver att du rör spaken 2 grader innan signalen ändras men i sidled kanske den "glappar" 3 grader, dessutom blir det förmodligen en stick/slip effekt som du måste ta hänsyn till om du har krav på hög precision.

http://en.wikipedia.org/wiki/Stick-slip_phenomenon

Däremot vet jag inte hur du ska lösa det i mjukvaran, men jag vet att det går i industriella tillämpningar.

Visa signatur

R5 5600G, Asus ROG STRIX X470-F Gaming, WD SN850X 2TB, Seasonic Focus+ Gold 650W, Aerocool Graphite v3, Tittar på en Acer ET430Kbmiippx 43" 4K. Lyssnar på Behringer DCX2496, Truth B3031A, Truth B2092A. Har också oscilloskop, mätmikrofon och colorimeter.

Permalänk
Medlem
Skrivet av JamesBanana:

Vad är det för typ av spakar? Jag mixtrade med en spak till Playstation 2 för några år sedan, och den var ganska besvärlig. Då körde jag med helt ren rådata (analog koppling till en Arduino, mjukvara knackad i assembler). Bland annat kunde nollpunkten röra sig en del och den hade en tendens att hoppa mellan vissa värden (xxxx0111 och xxxx0011) .

Det är en trådlös xbox-360 dosa med standard Microsoft drivrutiner och de verkar förutom precisionsproblem ha effekter som behandlar rådatan innan den skickas vidare, det verkar som datan man får inte enbart beror på spakens fysiska position utan även på i vilken riktning och hastighet man rört den innan och detta går inte att inaktivera.
Försökte hitta någon tredjeparts drivrutin men hittade bara en som gick att ladda ner, den hette masahiko morii och den lyckades jag inte installera och vill helst att man ska kunna använda Microsofts egna drivrutiner och gärna andra kontroller än Xbox också, som säkert också har sina brister.

Min tanke med tråden var att hitta om det fanns några enkla matematiska formler för att räkna om avrundade kvadrater till cirklar.

Man rör ju de fysiska spakarna i cirklar och det känns ju intuitivt som att de då borde göra det i mjukvaran också.

Var dock inte medveten om riktigt hur dålig precision det var, har man inte perfekta avrundade kvadrater får man ju inga perfekta cirklar heller.

Jag får nog tänka om och designa utefter spakarnas begränsningar.

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401

Permalänk
Medlem
Skrivet av mrqaffe:

Du får väl byta spakar eller göra nån typ av filter och kalibreringsfunktion i mjukvara, är det "potentiometerspakar" som ger olika resistans beroende på position ? I så fall så påverkas de antagligen av mekaniska glapp i släpskor o dylikt, det kan säkert också skilja beroende på kontakttrycket, det gör att det blir lite olika värden beroende på hur du rört spaken innan du hamnar på den vinkel du vill läsa av, bra vinkelgivare med hög repetitionsnogranhet är dyra, bara en ren potentiometer som är bra kan kosta 1000kr styck, man måste trimma dem, tex skära till måtten på resistansbanan med en laser individuellt för att de ska håla hög precision, men det borde gå att lösa mycket med mjukvaran, tex ta hänsyn till hur spaken rörts "före" så att man kan förutsäga det mekaniska glappet, typ om du byter riktning på spaken så kanske den kräver att du rör spaken 2 grader innan signalen ändras men i sidled kanske den "glappar" 3 grader, dessutom blir det förmodligen en stick/slip effekt som du måste ta hänsyn till om du har krav på hög precision.
...

Däremot vet jag inte hur du ska lösa det i mjukvaran, men jag vet att det går i industriella tillämpningar.

Är bara ett litet hobbyprojekt, såtillvida inte XBone eller PS4 kontroller har revolutionerande precision jämfört med 360 får jag nog fundera på om det går att lösa utan korrekta värden, och går det inte är det inte hela världen.

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401

Permalänk
Avstängd
Skrivet av Andre_H:

Man rör ju de fysiska spakarna i cirklar och det känns ju intuitivt som att de då borde göra det i mjukvaran också.

Fsst det gör man ju inte. När man drar spaken längs ytterkanterna känner man ju att det är en fyrkant man rör dem i...hörs ju desdutom på ljudet att det inte är en cirkel.

Skickades från m.sweclockers.com

Visa signatur

///M4

Permalänk
Medlem
Skrivet av hoski:

Fsst det gör man ju inte. När man drar spaken längs ytterkanterna känner man ju att det är en fyrkant man rör dem i...hörs ju desdutom på ljudet att det inte är en cirkel.

Skickades från m.sweclockers.com

360 kontrollern har runda analoga spakar så du måste syfta på någon annan.

Visa signatur

Arch - Makepkg, not war -||- Gigabyte X570 Aorus Master -||- GSkill 64GiB DDR4 14-14-15-35-1T 3600Mhz -||- AMD 5900x-||- Gigabyte RX6900XT -||- 2x Adata XPG sx8200 Pro 1TB -||- EVGA G2 750W -||- Corsair 570x -||- O2+ODAC-||- Sennheiser HD-650 -|| Boycott EA,2K,Activision,Ubisoft,WB,EGS
Arch Linux, one hell of a distribution.

Permalänk
Medlem

Problemet med X360-kontrollen är egentligen inte att du får ut fel värden, men att området som spaken kan röra sig är lite större än det som mäts upp. När du drar spaken i botten rakt åt vänster (t.ex.) så går du utanför mätområdet och "mättar" mätningen. Detta kan man enkelt förvissa sig om genom att röra spaken lite grann fram och tillbaka någon millimeter från kanten - där finns ett dött område där mätvärdet alltid är detsamma! I diagonalerna når mätområdet längre från centrum (eftersom mätområdet är en kvadrat) och där får du alltså rätt värde överallt.

Om det är själva vinklarna du vill åt så är de alltså korrekta så länge inte signalen är mättad. Vill du ändå ha en cirkel när du drar spaken runt kanten går det att skala ner alla hörnvärden, men då tappar du linjäriteten i vinklarna - och du kommer ändå inte att kunna mäta hela området.

Ett alternativ som inte ger någon olinjäritet är att expandera området lite grann; dra en stor cirkel runt den "avrundade kvadraten", som i bilden i förstainlägget, och översätt alla mättade värden till en punkt på den cirkeln. Då får du dock problemet att alla utslag nära kanten ger maxutslag, så du får ett litet hopp mellan "nästan mättat" och maxutslaget.

EDIT; Eller så sätter du helt enkelt ett maxvärde så att hörnen också får samma döda zon. Detta skulle nog jag gjort.

Permalänk
Medlem
Skrivet av Andre_H:

Jag tyckte det verkade märkligt när samma läge på spakarna gav olika värden olika gånger men då hade jag bara kollat på värdena, men när du skrev att spakarna inte var tillförlitliga gjorde jag ett litet test och precisionen var sämre än jag trodde.
Dessutom rör det sig i alla fall på vänsterspaken i alltför raka linjer för att kunna vara rådata

Skrivet av Andre_H:

Det är en trådlös xbox-360 dosa med standard Microsoft drivrutiner och de verkar förutom precisionsproblem ha effekter som behandlar rådatan innan den skickas vidare, det verkar som datan man får inte enbart beror på spakens fysiska position utan även på i vilken riktning och hastighet man rört den innan och detta går inte att inaktivera.

Dumt av mig att spekulera i dåliga drivrutiner som jag inte vet något om. Skulle ju som mrgaffe säger kunna vara elektriska, mekaniska fenomen som spökar. Och att det rör sig i raka linjer "alltså inte ute i kanten utan överallt" beror nog på fjädrarna i spaken och att att det märks mest på vänsterspaken kan bero på att de är mindre slitna.

Skrivet av dagbro:

Problemet med X360-kontrollen är egentligen inte att du får ut fel värden, men att området som spaken kan röra sig är lite större än det som mäts upp. När du drar spaken i botten rakt åt vänster (t.ex.) så går du utanför mätområdet och "mättar" mätningen. Detta kan man enkelt förvissa sig om genom att röra spaken lite grann fram och tillbaka någon millimeter från kanten - där finns ett dött område där mätvärdet alltid är detsamma! I diagonalerna når mätområdet längre från centrum (eftersom mätområdet är en kvadrat) och där får du alltså rätt värde överallt.

Om det är själva vinklarna du vill åt så är de alltså korrekta så länge inte signalen är mättad. Vill du ändå ha en cirkel när du drar spaken runt kanten går det att skala ner alla hörnvärden, men då tappar du linjäriteten i vinklarna - och du kommer ändå inte att kunna mäta hela området.

Ett alternativ som inte ger någon olinjäritet är att expandera området lite grann; dra en stor cirkel runt den "avrundade kvadraten", som i bilden i förstainlägget, och översätt alla mättade värden till en punkt på den cirkeln. Då får du dock problemet att alla utslag nära kanten ger maxutslag, så du får ett litet hopp mellan "nästan mättat" och maxutslaget.

EDIT; Eller så sätter du helt enkelt ett maxvärde så att hörnen också får samma döda zon. Detta skulle nog jag gjort.

Har fått mer klarhet i hur det fungerar nu, det är dödzonerna klockan 12-3-6-9 som är promblemet, inte diagonalerna.
Och det går inte göra något åt så det är dumt att lägga ner för mycket tid på.
Den enklaste lösningen att maxa lutningen vid en cirkel med radien, 1000 är nog inte hela världen ändå, ligger ju bara ett par millimeter från kanten.

Visa signatur

mobo Asus M4A88TD-M EVO/USB3 cpu 1100T kylare Noctua NH-D14
gpu RX 460 passive ram 16GB DDR3 1600MHz ssd Samsung 850 EVO 250GB
psu Corsair AX 850 skärmar 3 * 40" NEC P401