Toon posts:

[VB] Analoge data inlezen vanaf de gameport

Pagina: 1
Acties:
  • 232 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo allemaal! :)

Ik zou graag wat analoge data inlezen op mijn computer. Eerst dacht ik aan de line in van een oude geluidskaart, wat een optie is, maar SA007 wees mij nog eens op het bestaan van de Gameport, die ook analoge data kan inlezen (weerstand van 0-100K ohm).
Daarna startte ik mijn zoektocht richting Google, om wat schema's van de poort, en vooral code te vinden om de analoge data uit te lezen.
Ik vond inderdaad mogelijkheden. Spijtig genoeg niet echt werkende, en soms ook codes die heel handig zijn, maar uiteindelijk betalend blijken...
Hier op het forum vond ik ook wel opties voor Delphi, C++ en dergelijke, maar ik beheers die talen nauwelijks.
Het zou normaal ook moeten lukken door DirectX aan te roepen, maar daarvoor heb ik de Microsoft website doorzocht, en niets gevonden. De pagina's die hier vroeger over opstonden, blijken verwijderd te zijn.
De mensen die hier over de kennis der wonderen van electronika beschikken, zullen mij misschien willen attent maken op het gebruik van microcontrollers en dergelijke. Maar hier heb ik (nog) geen ervaring mee...

Dus uiteindelijk, mijn vraag: Heeft er iemand onder jullie de beschikking over een goede Visual Basic 6 code om de Gameport in te lezen?

Alvast bedankt,

Stijn

Verwijderd

Topicstarter
Owkeej, mede dankzij SA007 heb'k nu dus een prog dat de poort constant inleest, en het omzet naar ohm.
Dit is m'n code:
Module1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Option Explicit

Public Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long
Public Declare Function joyGetDevCapsA Lib "winmm.dll" (ByVal uJoyID As Long, pjc As JOYCAPS, ByVal cjc As Long) As Long

Public Type JOYCAPS
    wMid As Integer
    wPid As Integer
    szPname As String * 32
    wXmin As Long
    wXmax As Long
    wYmin As Long
    wYmax As Long
    wZmin As Long
    wZmax As Long
    wNumButtons As Long
    wPeriodMin As Long
    wPeriodMax As Long
    wRmin As Long
    wRmax As Long
    wUmin As Long
    wUmax As Long
    wVmin As Long
    wVmax As Long
    wCaps As Long
    wMaxAxes As Long
    wNumAxes As Long
    wMaxButtons As Long
    szRegKey As String * 32
    szOEMVxD As String * 260
End Type

Public Type JOYINFOEX
    dwSize As Long
    dwFlags As Long
    dwXpos As Long
    dwYpos As Long
    dwZpos As Long
    dwRpos As Long
    dwUpos As Long
    dwVpos As Long
    dwButtons As Long
    dwButtonNumber As Long
    dwPOV As Long
    dwReserved1 As Long
    dwReserved2 As Long
End Type

Public JoyNum As Long
Public MYJOYEX As JOYINFOEX
Public MYJOYCAPS As JOYCAPS
Public CenterX As Long
Public CenterY As Long
Public JoyButtons(15) As Boolean
Public CurrentJoyX As Long
Public CurrentJoyY As Long

Public Function StartJoystick(Optional ByVal JoystickNumber As Long = 0) As Boolean
JoyNum = JoystickNumber
If joyGetDevCapsA(JoyNum, MYJOYCAPS, 404) <> 0 Then 'Get joystick info
    StartJoystick = False
Else
    MYJOYEX.dwSize = 64
    MYJOYEX.dwFlags = 255
    Call joyGetPosEx(JoyNum, MYJOYEX)
    CenterX = MYJOYEX.dwXpos
    CenterY = MYJOYEX.dwYpos
    StartJoystick = True
End If
End Function

Public Sub PollJoystick()
Dim i As Long
Dim t As Long

MYJOYEX.dwSize = 64
MYJOYEX.dwFlags = 255

' Get the joystick information
Call joyGetPosEx(JoyNum, MYJOYEX)

t = MYJOYEX.dwButtons
For i = 15 To 0 Step -1
    JoyButtons(i) = False
    If (2 ^ i) <= t Then
        t = t - (2 ^ i)
        JoyButtons(i) = True
    End If
Next i

CurrentJoyX = MYJOYEX.dwXpos
CurrentJoyY = MYJOYEX.dwYpos
End Sub


Form:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub Form_Load()
If Not StartJoystick Then
    MsgBox "No joystick!"
    End
End If
End Sub

Private Sub Timer1_Timer()
PollJoystick
Label1.Caption = "X: " & Module1.CurrentJoyX & " Y: " & Module1.CurrentJoyY
Label2.Caption = "Weerstand tussen 1 en 3: " & Round(Module1.CurrentJoyY * (47000 / 18881), 1) & " Ohm"
Label3.Caption = "Weerstand tussen 1 en 6: " & Round(Module1.CurrentJoyX * (47000 / 18881), 1) & " Ohm"
End Sub


Nu het volgende: Ik heb een NTC op de poort hangen. Da's een electronisch componentje dat een hogere weerstand krijgt, naarmate de temperatuur stijgt.
Dus: een omgekeerd evenredig verband tussen de weerstand en de temperatuur. Hoe zou je hier dan de temperatuur uit kunnen halen?
Array maken met verschillende waardes van weerstand, en corresponderende temperatuur? Of een of andere wiskundige formule?

  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 15-02 11:41

Tukk

De α-man met het ẞ-brein

Verwijderd schreef op donderdag 06 juli 2006 @ 08:21:
Owkeej, mede dankzij SA007 heb'k nu dus een prog dat de poort constant inleest, en het omzet naar ohm.
Dit is m'n code:
Module1:
Nu het volgende: Ik heb een NTC op de poort hangen. Da's een electronisch componentje dat een hogere weerstand krijgt, naarmate de temperatuur stijgt.
Dus: een omgekeerd evenredig verband tussen de weerstand en de temperatuur. Hoe zou je hier dan de temperatuur uit kunnen halen?
Array maken met verschillende waardes van weerstand, en corresponderende temperatuur? Of een of andere wiskundige formule?
Tof, ik heb een huis genoot die dit een 6 jaar geleden ook heeft gedaan in Delphi.
Je moet het systeem ijken, het is een rechte ijklijn aangezien er een recht everedige relatie is tussen de temperatuur en de weerstand.

Neem een thermometer, bekijk de temperatuur, deze weerstand en de bij behorende temp is bekend.
Zorg voor een andere temp (koelkast oid?), hoe groter het verschil met de 1e temperatuur hoe beter, meet de weerstand weer.

De relatie temperatuur en weerstand kun je dan gebruiken om te interpoleren en extrapoleren bij in de toekomst gemeten weerstanden

Beetje moeilijk verhaal geworden, dit is makkelijker met een stuk papier erbij.

edit:
De formule is
code:
1
temperatuur = a * weerstand + b


Met de twee (of meer) ijkpunten ga je dan a en b bepalen, deze sla je op en daarmee
kun je voortaan de temperatuur berekenen aan de hand van de weestand
a en b kunnen ook negatief zijn.

[ Voor 65% gewijzigd door Tukk op 06-07-2006 08:54 ]

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15-02 17:57
Ik zou het met een formule doen. Ik zou niet weten hoe je ijkpunten voor alle temperaturen binnen het bereik van je NTC zou willen maken om deze in je array op te nemen,

Aangezien er een lineair verband tussen weerstand en temperatuur is, is dat prima met een formule te doen. Legt je NTC in de koelkast samen met een ebtrouwbare termometer, en lees na een half uurtj ede waarde uit je programma en van de termometer.
Doe dat twee of driie keer met andere temperaturn, en maak een formule :)

[ Voor 64% gewijzigd door frickY op 06-07-2006 08:52 ]


Verwijderd

Topicstarter
frickY schreef op donderdag 06 juli 2006 @ 08:50:
Ik zou het met een formule doen. Ik zou niet weten hoe je ijkpunten voor alle temperaturen binnen het bereik van je NTC zou willen maken om deze in je array op te nemen,

Aangezien er een lineair verband tussen weerstand en temperatuur is, is dat prima met een formule te doen. Legt je NTC in de koelkast samen met een ebtrouwbare termometer, en lees na een half uurtj ede waarde uit je programma en van de termometer.
Doe dat twee of driie keer met andere temperaturn, en maak een formule :)
Hoe moest je nu ook alweer zo'n formule opstellen... :P
Sorry, maar ik had dit jaar niet echt 100% op wiskunde (eerder iets van de 65 O-) ).
Zal straks wel eventjes wat temperaturen gaan meten.
Spijtig dat 'k geen PTC meer heb (kan er iig geen vinden :P), die hun weerstand is nl recht-evenredig met de temperatuur...

  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 15-02 11:41

Tukk

De α-man met het ẞ-brein

Verwijderd schreef op donderdag 06 juli 2006 @ 10:04:
[...]


Hoe moest je nu ook alweer zo'n formule opstellen... :P
Sorry, maar ik had dit jaar niet echt 100% op wiskunde (eerder iets van de 65 O-) ).
Zal straks wel eventjes wat temperaturen gaan meten.
Spijtig dat 'k geen PTC meer heb (kan er iig geen vinden :P), die hun weerstand is nl recht-evenredig met de temperatuur...
Het enige verschil is dat de variabele a een negatieve waarde zal krijgen indien het niet recht-everedig is, dat is toch geen probleem?

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


Verwijderd

Topicstarter
Wiej, heb eventjes zitten prutsen.
kamertemperatuur 25.5°C: 4340 ohm
koelkast 8°C: 10610 ohm.
Hoe zou ik hier dan een formule uit opstellen? :$

  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 10:11
kamertemperatuur 25.5°C: 4340 ohm
koelkast 8°C: 10610 ohm.
Als het echt een rechtevenredig verband is:
code:
1
2
3
4
5
6
7
8
9
y=ax+b
y=-(6270/17.5)X+(2866+10610)=(-6270/17.5)X+13476

y=weerstand
x=temperatuur in graden C

x =     Y - 13476
      ---------------------
        -(6270/17.5)

  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 15-02 11:41

Tukk

De α-man met het ẞ-brein

NLChris schreef op donderdag 06 juli 2006 @ 15:26:
[...]


Als het echt een rechtevenredig verband is:
code:
1
2
3
4
5
6
7
8
9
y=ax+b
y=-(6270/17.5)X+(2866+10610)=(-6270/17.5)X+13476

y=weerstand
x=temperatuur in graden C

x =     Y - 13476
      ---------------------
        -(6270/17.5)
Je was me voor, thnx.

Dit alles gaat er dus wel vanuit dat er een rechtevenredig verband is, maar dat kun je simpel testen door wat anders dan 8 of 25 graden te meten en dan weer de thermometer er bij te leggen, het aantal Ohm in te vullen in de formule en dan dient de juiste temp er uit te komen. Indien de drie punten op een rechte lijn liggen kun je er (bijna zeker) van zijn dat het een linieare verband heeft.

De formule kun je in je app gebruiken om voortaan de temp te bereken uit het aantal Ohm.

[ Voor 8% gewijzigd door Tukk op 06-07-2006 15:39 ]

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 13-02 11:49
of:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 4340 = a*25.5 + b
10610 = a*8    + b

gelijkstellen:
25.5/8 = 3.1875

    4340      =         a*25.5 + b
3.1875*10610  = 3.1875*(a*8 +    b)

    4340      =         a*25.5 + b
33819,375     =         a*25.5 + 3.1875*b

aftrekken:

29479,375 = 2.1875*b
b= 13476,286

invullen:

4340 = a*25.5 + 13476,286
a = -358,258

narekenen:

10610 ~= -358*8 + 13476

dus:

R = -358*t + 13746

Memories of yesterday, will grow, but never die


Verwijderd

Topicstarter
NLChris schreef op donderdag 06 juli 2006 @ 15:26:
[...]


Als het echt een rechtevenredig verband is:
code:
1
2
3
4
5
6
7
8
9
y=ax+b
y=-(6270/17.5)X+(2866+10610)=(-6270/17.5)X+13476

y=weerstand
x=temperatuur in graden C

x =     Y - 13476
      ---------------------
        -(6270/17.5)
Excuseer, maar ik kan je berekening echt niet volgen O+
Hoe kom jij in je berekening aan 6270, 17.5 en 2866?
Het is trouwens toch geen recht-evenredig verband? (Maar omgekeerd-evenredig?)
Ben ik nou echt zo dom, ofzo?

[ Voor 8% gewijzigd door Verwijderd op 06-07-2006 15:57 ]


  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 10:11
10610 - 4340 = 6270 (de gemeten weerstanden)
25,5-8=17,5 (de graden)


y=(-6270/17.5)*X+b
Als je X= 8 invult moet je op 10610 uitkomen, je komt echter op -2866 uit en dit moet je dus compenseren met die b (b=2866+10610)

edit: De uitleg van Bintje is uitgebreider en komt op bijna op hetzelfde neer.
edit2: Alleen gaat de formule van Bintje de andere kant op (je weet de temperatuur en wilt de weerstand weten)

Er zijn volgens zowel sensors die rechtevenredig verband aangeven als omgekeerd rechtevenredig. Zoals gezegd geld mijn formule (en die van Bintje) alleen voor een rechtevenredig verband.

[ Voor 64% gewijzigd door NLChris op 06-07-2006 16:15 ]


  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 15-02 11:41

Tukk

De α-man met het ẞ-brein

NLChris schreef op donderdag 06 juli 2006 @ 16:09:
Er zijn volgens zowel sensors die rechtevenredig verband aangeven als omgekeerd rechtevenredig. Zoals gezegd geld mijn formule (en die van Bintje) alleen voor een rechtevenredig verband.
Met dat laatste volg ik je niet, het enige verschil is een rechte lijn die stijgt of daalt, maar beiden zijn
goed met de formule te beschrijven. Het verschil is het feit je getal onder de streep positief of negatief is.
Aangezien het aantal Ohm daalt bij het stijgen van de temp heb je daar nu dus een negatief getal staan, maar voldoen doet het perfect.

Je moet alleen oppassen dat het wel een rechte lijn is, niet een asymptoot, een kromme lijn, enz. en dat kun je tackelen door drie of vier meetpunten te nemen.

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 10:11
omgekeerd rechtevenredig is juist de vorm met asymptoten volgens mij :?

Verwijderd

Topicstarter
Heb de formule in visual basic taal gegoten:
code:
1
2
3
Public Function ohmnaargraden(ohm As Integer) As Integer
ohmnaargraden = (-6270 / 17.5) * ohm + 2866 + 10610
End Function


Maar dat stoot op een runtime error 6: overflow?

  • Tukk
  • Registratie: Januari 2002
  • Laatst online: 15-02 11:41

Tukk

De α-man met het ẞ-brein

Verwijderd schreef op donderdag 06 juli 2006 @ 18:35:
Heb de formule in visual basic taal gegoten:
code:
1
2
3
Public Function ohmnaargraden(ohm As Integer) As Integer
ohmnaargraden = (-6270 / 17.5) * ohm + 2866 + 10610
End Function


Maar dat stoot op een runtime error 6: overflow?
Ik vermoed dat ook dat het antwoord uit de berekening zeker geen integer zal zijn.

Daarbij weet ik zeker dat de berekening niet klopt die je daar hebt.

Q: How many geeks does it take to ruin a joke? A: You mean nerd, not geek. And not joke, but riddle. Proceed.


  • NLChris
  • Registratie: Juli 2004
  • Laatst online: 10:11
code:
1
2
3
x =     Y - 13476
      ---------------------
        -(6270/17.5)


dit zou de formule Ohm->Graden moeten zijn ALS het een rechtevenredig verband is en ik geen fout heb gemaakt :7

Die je nu hebt is de andere kant op
Pagina: 1