U
User
Ich fange mal an mit dem Lenkrad:
Ich hatte vor einem längerem Zeitraum schon mal das Konzept vorgestellt, allerdings haben sich bereits einige Dinge geändert. Es gibt immer noch Probleme, diese sind aber darin begründet, das ich ca. 2x Mal pro Woche überhaupt dazu komme, mich mit dem Hobby zu beschäftigen, und viel Zeit für Videoediting, Softwaredebugging draufgeht.
Hier ist nochmal der Link zum Thread, der den Aufbau des Lenkrads erklärt:
https://forum.virtualracing.org/showthread.php/100342-900°-Lenkrad-mit-Wiimote-bauen-für-unter-30€
Inzwischen bin ich soweit, dass das Lenkrad trotz Delay von Software und Bildschirm die Lenkbewegung 1 zu 1 umsetzt, allerdings nur solange sich das Rad bewegt, wenn es stoppt, kann es noch zu geringen Verzögerungen kommen, es ist halt nicht besonders einfach, ein Signal zu glätten, welches zwischen Winkeln mit ca 2° Abstand flackert. Hier ist ein Video, welches das nochmal verdeutlicht:
Glovepie Script:
if starting then
var.max=540
var.wii=0
var.c=120
var.deltamax=90
var.ebrakepressure=1
var.maxv =5
var.maxav =5
var.gangjoystickmin=0.4
var.sl=15
var.bremseDZ=0
var.bremsemax=1
var.bremseprog=1
var.bremsedegr=1
var.gasDZ=0
var.gasmax=1
var.gasprog=1
var.gasdegr=1
var.kupplungDZ=0
var.kupplungmax=1
var.kupplungprog=1.1
var.kupplungdegr=1
end
var.p= (wiimote1.gx/ 0.86)
if abs(var.p)>1 then
var.p=sign(var.p)
end
var.p= acos(var.p)
var.s= ( wiimote1.SteeringAngle + 360) mod 360
if var.s > 180 then
var.p=360- var.p
end
// debug=var.s +" "+var.p+" "+ wiimote1.gx
if var.s>315 || var.s<45 || (var.s>135 && var.s < 225)then
var.alpha=var.s
else
var.alpha=var.p
end
var.dgy=delta(wiimote1.MotionPlus.GyroYaw)
if 2< abs(var.dgy ) then
var.altalpha+= var.dgy
if var.altalpha<0 then
var.kk2=-1
else
var.kk2=0
end
var.k=int(var.altalpha/360)+ var.kk2
else
var.minalpha= min( abs(var.altalpha- (var.alpha+(var.k+1)*360)) ,abs(var.altalpha- (var.alpha+(var.k)*360)))
var.minalpha= min( var.minalpha,abs(var.altalpha- (var.alpha+(var.k-1)*360)) )
if abs(var.altalpha- (var.alpha+(var.k+1)*360)) == var.minalpha then
var.k++
else if abs(var.altalpha- (var.alpha+(var.k)*360)) == var.minalpha then
else if abs(var.altalpha- (var.alpha+(var.k-1)*360)) == var.minalpha then
var.k--
endif
var.altalpha= (var.alpha+(var.k)*360)
if var.k<-2 then
var.k=-2
var.altalpha= (var.alpha+(var.k)*360)
end
if var.k>1 then
var.k=1
var.altalpha= (var.alpha+(var.k)*360)
end
endif
if wiimote1.A then
if var.alpha >180 then
var.k=-1
var.altalpha= (var.alpha+(var.k)*360)
else
var.k=0
var.altalpha= (var.alpha+(var.k)*360)
endif
endif
var.lwdz=0.7
var.lw= var.altalpha
if abs( var.dgy<1.1) then
if abs(var.lw - var.lwc )< var.lwdz && abs(var.lwb - var.lwc )< var.lwdz then
var.lwa=var.lwb
var.lwb=var.lw
var.lw=var.lwc
else if abs(var.lwa - var.lwb)< 2*var.lwdz then
var.lwc= (var.lwa+var.lwb) /2
var.lwa=var.lwb
var.lwb=var.lw
var.lw=var.lwc
else
var.lwa=var.lwb
var.lwb=var.lw
end
end
var.dlw1= var.lw-var.lw1
var.dlw2= var.lw1-var.lw2
var.dlw3= var.lw2-var.lw3
var.lb11=var.lw
if sign(var.dlw2)==sign(var.dlw3) && sign(var.dlw2)!=sign(var.dlw1)&& abs (var.dlw1)>100 then
var.lw=var.lwl1+var.dlw2
end
var.lw1=var.lb11
var.lw2=var.lw1
var.lw3=var.lw2
var.v_lw=Delta(var.lw)
var.a_lw=Delta(var.v_lw)
var.t=pie.FrameTime *1000
if abs(var.v_lw)>3.5 then
var.output=(var.lw+var.v_lw*var.t+0.5*var.a_lw*var.t*var.t )
else
var.output=var.lw
end
var.LWwii=var.output
var.rlwii+=var.vii
var.z=11/60 // Multiplikator je größer umso schneller bewegt sich das Lenkrad
var.vii= (var.LWwii- var.rlwii)*var.z
ppjoy.Analog0= var.rlwii/var.max
// bei 0° -2.63
//bei 90 -2
//bei 180 -5
// bei 360-90 -2
var.waag =-joy7.x
var.vert = -joy7.y
if var.gang<=3 then
var.gangconfi2=0
endif
if var.gang>3 && var.gang<6 then
var.gangconfi2=1
endif
if var.vert> var.gangjoystickmin && var.waag<-var.gangjoystickmin && joy5.Button1 then
var.gang =-1
else if var.vert> var.gangjoystickmin && var.waag<-var.gangjoystickmin && joy5.Button1==false then
var.gang =1
else if var.vert< -var.gangjoystickmin && var.waag<-0.66 && joy5.Button1==false then
var.gang =2
else if var.vert> var.gangjoystickmin && abs(var.waag)<= 0.1 && joy5.Button1==false then
var.gang =3
else if var.vert< -var.gangjoystickmin && abs(var.waag)<=0.4 && joy5.Button1==false then
var.gang =4
else if var.vert>var.gangjoystickmin && var.waag>var.gangjoystickmin && joy5.Button1==false then
var.gang =5
else if var.vert<-var.gangjoystickmin && var.waag>var.gangjoystickmin && joy5.Button1==false && var.gangconfi2==0 then
var.gang =-1
else if var.vert<-var.gangjoystickmin && var.waag>var.gangjoystickmin && joy5.Button1==false && var.gangconfi2==1 then
var.gang =6
else if abs( var.vert )< 0.2 then
var.gang =7
endif
// endif
if var.gang==-1 then
ppjoy.Digital0 =true
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==6 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =true
ppjoy.Digital7 =false
else if var.gang==1 then
ppjoy.Digital0 =false
ppjoy.Digital1 =true
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==2 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =true
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==3 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =true
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==4 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =true
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==5 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =true
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==7 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =true
endif
/*
if released( key.p) then
var.m++
var.m=var.m mod 2
end
if var.m==1 then
var.DotDist = .12 m //Distance left+right dot, in meters
var.ScreenHeight = .18 m //Visualisation Window's Height, measured with ruler
//interesting part
// cam.Stereoscopic=true
// the rest is my degenerated 6DOF Headtracker (with much shorter code)
var.scenter = [1024,768,0]/2/1024 //Sensor's center
var.p1 = [wiimote3.dot1x/1024,wiimote3.dot1y/1024,0]
var.p2 = [wiimote3.dot2x/1024,wiimote3.dot2y/1024,0]
//Look for Left, Right and Middle dot
if wiimote3.dot1x < wiimote3.dot2x then
var.pleft = var.p1
var.pright = var.p2
else
var.pleft =var.p2
var.pright = var.p1
endif
//Do the geometric stuff
if wiimote3.dot1vis and wiimote3.dot2vis then
var.posZ = var.DotDist/Tan(Abs(var.pright-var.pleft)*45)
var.pos = ((var.pright+var.pleft)/2-var.scenter)*var.posZ*3.14/4 + [0,0,var.posZ]
var.yaw = 45*((var.pright+var.pleft)/2-var.scenter)[1] //Changed for Fishtank demo
var.pitch = 45*((var.pright+var.pleft)/2-var.scenter)[2] //Changed for Fishtank demo
endif
//Test 3D Visualisation, comment out if not needed
var.pitchn=Deadzone(abs(var.pitch)/15,0.1) *15
// var.pitchna=var.pitchn*var.pitchn
// var.pitchn=(var.pitchna+( var.pitchn- var.pitchna)* var.pitchn) *15
FakeMouse.DirectInputY = smooth(var.pitchn*3,0)*sign(var.pitch)
var.pitchn=Deadzone(abs(var.yaw)/15,0.1) *15
// var.pitchna=var.pitchn*var.pitchn
// var.pitchn=(var.pitchna+( var.pitchn- var.pitchna)* var.pitchn) *15
FakeMouse.DirectInputX = smooth(-var.pitchn*16,0)*sign(var.yaw)
end
*/
/*if var.pedal1>0.9 then
var.ped=1
end
if var.pedal4>0.9 then
var.ped=2
end
*/
Debug= var.rlwk +" "+ var.t+" " +var.LWwii+" " +int(var.altalpha/360) +" "+var.gang+" "+var.waag
var.A4+=(-6+7*joy6.Button3 ) *pie.FrameTime*0.7 *5
if var.A4<0 then
var.A4=0
end
if var.A4>1 then
var.A4=1
end
var.LWk=var.A4
//für Maus oder Gamepad // vor var.LW löschen
var.rlwk+=var.vk
var.zk=(100*var.A4+2.5)/60 // Multiplikator je größer umso schneller bewegt sich das Lenkrad
var.vk= (var.LWk- var.rlwk)*var.zk
var.pedal2=EnsureMapRange(abs(joy2.ROLL) ,0,1,0,1)
var.pedal3=EnsureMapRange(-joy6.y ,0,1,0,1)
var.pedal4=var.rlwk
if var.ped==1 then
ppjoy.Analog1= var.pedal1
ppjoy.Analog2= var.pedal2
//3*2
ppjoy.Analog4= var.pedal3
end
if var.ped==0 then
ppjoy.Analog1= var.pedal2 *1.2
ppjoy.Analog2= var.pedal3
//3*2
ppjoy.Analog4= var.pedal4
end
ppjoy.Analog3= var.hby*0.8// joy3.y*MapRange(joy3.slider,-1,1,0.001,1)*0.8
var.fr2++
//Debug=var.sin +" "+var.rr +" "+var.fr +" "+ var.r2
if pie.Frame mod 833==0 then
var.r2=(Random*20+10)*2
end
if pie.Frame mod 1000==0 then
for(var.i=0;var.i<120; var.i++)
if (var.i==int(pie.FrameRate)) then
var.fr=var.i
end
end
end
if pie.Frame mod 20==0 then
var.sin=Sin(var.fr2/var.fr*360/var.r2)
end
if var.gang==7 then
var.kup=0
else
var.kup=1- var.pedal4
end
if var.pedal2<0.4 then
var.vibgas= var.pedal2/2+var.pedal2/2/EnsureMapRange(abs(var.gang),1,6,1,2)*var.kup
var.vgasdz=0
else
var.vgasdz+= var.pedal2/var.fr /(EnsureMapRange(abs(var.gang),1,6,1,10)*EnsureMapRange(var.kup,0.8,1,0,1)+1)
if var.vgasdz>1 then
var.vgasdz=1
end
var.vibgas= var.pedal2*(1+var.vgasdz)/2 +var.pedal2*(1+var.vgasdz*2)/2/EnsureMapRange(abs(var.gang),1,6,1,2)*var.kup
end
var.rr=0.8+var.sin*0.051-EnsureMapRange(var.vibgas+var.pedale3+var.lwm*3,0,4,0,0.3)
if abs(var.lw)<=130 then
var.lwm=EnsureMapRange(abs(var.lw) ,0,130,0,1)
else
var.lwm=EnsureMapRange(-abs(var.lw) ,-130,-260,1,0)
end
var.ran= Random
if var.ran>(var.rr) then
wiimote.Rumble=1
else
wiimote.Rumble=0
end
var.z =int(Deadzone(joy3.y,13,0.3)*6)
var.hby= max(joy3.y,var.hby2) //*MapRange(joy3.slider,-1,1,0.001,1)
if joy3.Pov1Up then
var.hby2=var.z /6
end
if joy3.Pov1Down then
var.hby2=0
end
var.max=540
var.wii=0
var.c=120
var.deltamax=90
var.ebrakepressure=1
var.maxv =5
var.maxav =5
var.gangjoystickmin=0.4
var.sl=15
var.bremseDZ=0
var.bremsemax=1
var.bremseprog=1
var.bremsedegr=1
var.gasDZ=0
var.gasmax=1
var.gasprog=1
var.gasdegr=1
var.kupplungDZ=0
var.kupplungmax=1
var.kupplungprog=1.1
var.kupplungdegr=1
end
var.p= (wiimote1.gx/ 0.86)
if abs(var.p)>1 then
var.p=sign(var.p)
end
var.p= acos(var.p)
var.s= ( wiimote1.SteeringAngle + 360) mod 360
if var.s > 180 then
var.p=360- var.p
end
// debug=var.s +" "+var.p+" "+ wiimote1.gx
if var.s>315 || var.s<45 || (var.s>135 && var.s < 225)then
var.alpha=var.s
else
var.alpha=var.p
end
var.dgy=delta(wiimote1.MotionPlus.GyroYaw)
if 2< abs(var.dgy ) then
var.altalpha+= var.dgy
if var.altalpha<0 then
var.kk2=-1
else
var.kk2=0
end
var.k=int(var.altalpha/360)+ var.kk2
else
var.minalpha= min( abs(var.altalpha- (var.alpha+(var.k+1)*360)) ,abs(var.altalpha- (var.alpha+(var.k)*360)))
var.minalpha= min( var.minalpha,abs(var.altalpha- (var.alpha+(var.k-1)*360)) )
if abs(var.altalpha- (var.alpha+(var.k+1)*360)) == var.minalpha then
var.k++
else if abs(var.altalpha- (var.alpha+(var.k)*360)) == var.minalpha then
else if abs(var.altalpha- (var.alpha+(var.k-1)*360)) == var.minalpha then
var.k--
endif
var.altalpha= (var.alpha+(var.k)*360)
if var.k<-2 then
var.k=-2
var.altalpha= (var.alpha+(var.k)*360)
end
if var.k>1 then
var.k=1
var.altalpha= (var.alpha+(var.k)*360)
end
endif
if wiimote1.A then
if var.alpha >180 then
var.k=-1
var.altalpha= (var.alpha+(var.k)*360)
else
var.k=0
var.altalpha= (var.alpha+(var.k)*360)
endif
endif
var.lwdz=0.7
var.lw= var.altalpha
if abs( var.dgy<1.1) then
if abs(var.lw - var.lwc )< var.lwdz && abs(var.lwb - var.lwc )< var.lwdz then
var.lwa=var.lwb
var.lwb=var.lw
var.lw=var.lwc
else if abs(var.lwa - var.lwb)< 2*var.lwdz then
var.lwc= (var.lwa+var.lwb) /2
var.lwa=var.lwb
var.lwb=var.lw
var.lw=var.lwc
else
var.lwa=var.lwb
var.lwb=var.lw
end
end
var.dlw1= var.lw-var.lw1
var.dlw2= var.lw1-var.lw2
var.dlw3= var.lw2-var.lw3
var.lb11=var.lw
if sign(var.dlw2)==sign(var.dlw3) && sign(var.dlw2)!=sign(var.dlw1)&& abs (var.dlw1)>100 then
var.lw=var.lwl1+var.dlw2
end
var.lw1=var.lb11
var.lw2=var.lw1
var.lw3=var.lw2
var.v_lw=Delta(var.lw)
var.a_lw=Delta(var.v_lw)
var.t=pie.FrameTime *1000
if abs(var.v_lw)>3.5 then
var.output=(var.lw+var.v_lw*var.t+0.5*var.a_lw*var.t*var.t )
else
var.output=var.lw
end
var.LWwii=var.output
var.rlwii+=var.vii
var.z=11/60 // Multiplikator je größer umso schneller bewegt sich das Lenkrad
var.vii= (var.LWwii- var.rlwii)*var.z
ppjoy.Analog0= var.rlwii/var.max
// bei 0° -2.63
//bei 90 -2
//bei 180 -5
// bei 360-90 -2
var.waag =-joy7.x
var.vert = -joy7.y
if var.gang<=3 then
var.gangconfi2=0
endif
if var.gang>3 && var.gang<6 then
var.gangconfi2=1
endif
if var.vert> var.gangjoystickmin && var.waag<-var.gangjoystickmin && joy5.Button1 then
var.gang =-1
else if var.vert> var.gangjoystickmin && var.waag<-var.gangjoystickmin && joy5.Button1==false then
var.gang =1
else if var.vert< -var.gangjoystickmin && var.waag<-0.66 && joy5.Button1==false then
var.gang =2
else if var.vert> var.gangjoystickmin && abs(var.waag)<= 0.1 && joy5.Button1==false then
var.gang =3
else if var.vert< -var.gangjoystickmin && abs(var.waag)<=0.4 && joy5.Button1==false then
var.gang =4
else if var.vert>var.gangjoystickmin && var.waag>var.gangjoystickmin && joy5.Button1==false then
var.gang =5
else if var.vert<-var.gangjoystickmin && var.waag>var.gangjoystickmin && joy5.Button1==false && var.gangconfi2==0 then
var.gang =-1
else if var.vert<-var.gangjoystickmin && var.waag>var.gangjoystickmin && joy5.Button1==false && var.gangconfi2==1 then
var.gang =6
else if abs( var.vert )< 0.2 then
var.gang =7
endif
// endif
if var.gang==-1 then
ppjoy.Digital0 =true
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==6 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =true
ppjoy.Digital7 =false
else if var.gang==1 then
ppjoy.Digital0 =false
ppjoy.Digital1 =true
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==2 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =true
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==3 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =true
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==4 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =true
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==5 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =true
ppjoy.Digital6 =false
ppjoy.Digital7 =false
else if var.gang==7 then
ppjoy.Digital0 =false
ppjoy.Digital1 =false
ppjoy.Digital2 =false
ppjoy.Digital3 =false
ppjoy.Digital4 =false
ppjoy.Digital5 =false
ppjoy.Digital6 =false
ppjoy.Digital7 =true
endif
/*
if released( key.p) then
var.m++
var.m=var.m mod 2
end
if var.m==1 then
var.DotDist = .12 m //Distance left+right dot, in meters
var.ScreenHeight = .18 m //Visualisation Window's Height, measured with ruler
//interesting part
// cam.Stereoscopic=true
// the rest is my degenerated 6DOF Headtracker (with much shorter code)
var.scenter = [1024,768,0]/2/1024 //Sensor's center
var.p1 = [wiimote3.dot1x/1024,wiimote3.dot1y/1024,0]
var.p2 = [wiimote3.dot2x/1024,wiimote3.dot2y/1024,0]
//Look for Left, Right and Middle dot
if wiimote3.dot1x < wiimote3.dot2x then
var.pleft = var.p1
var.pright = var.p2
else
var.pleft =var.p2
var.pright = var.p1
endif
//Do the geometric stuff
if wiimote3.dot1vis and wiimote3.dot2vis then
var.posZ = var.DotDist/Tan(Abs(var.pright-var.pleft)*45)
var.pos = ((var.pright+var.pleft)/2-var.scenter)*var.posZ*3.14/4 + [0,0,var.posZ]
var.yaw = 45*((var.pright+var.pleft)/2-var.scenter)[1] //Changed for Fishtank demo
var.pitch = 45*((var.pright+var.pleft)/2-var.scenter)[2] //Changed for Fishtank demo
endif
//Test 3D Visualisation, comment out if not needed
var.pitchn=Deadzone(abs(var.pitch)/15,0.1) *15
// var.pitchna=var.pitchn*var.pitchn
// var.pitchn=(var.pitchna+( var.pitchn- var.pitchna)* var.pitchn) *15
FakeMouse.DirectInputY = smooth(var.pitchn*3,0)*sign(var.pitch)
var.pitchn=Deadzone(abs(var.yaw)/15,0.1) *15
// var.pitchna=var.pitchn*var.pitchn
// var.pitchn=(var.pitchna+( var.pitchn- var.pitchna)* var.pitchn) *15
FakeMouse.DirectInputX = smooth(-var.pitchn*16,0)*sign(var.yaw)
end
*/
/*if var.pedal1>0.9 then
var.ped=1
end
if var.pedal4>0.9 then
var.ped=2
end
*/
Debug= var.rlwk +" "+ var.t+" " +var.LWwii+" " +int(var.altalpha/360) +" "+var.gang+" "+var.waag
var.A4+=(-6+7*joy6.Button3 ) *pie.FrameTime*0.7 *5
if var.A4<0 then
var.A4=0
end
if var.A4>1 then
var.A4=1
end
var.LWk=var.A4
//für Maus oder Gamepad // vor var.LW löschen
var.rlwk+=var.vk
var.zk=(100*var.A4+2.5)/60 // Multiplikator je größer umso schneller bewegt sich das Lenkrad
var.vk= (var.LWk- var.rlwk)*var.zk
var.pedal2=EnsureMapRange(abs(joy2.ROLL) ,0,1,0,1)
var.pedal3=EnsureMapRange(-joy6.y ,0,1,0,1)
var.pedal4=var.rlwk
if var.ped==1 then
ppjoy.Analog1= var.pedal1
ppjoy.Analog2= var.pedal2
//3*2
ppjoy.Analog4= var.pedal3
end
if var.ped==0 then
ppjoy.Analog1= var.pedal2 *1.2
ppjoy.Analog2= var.pedal3
//3*2
ppjoy.Analog4= var.pedal4
end
ppjoy.Analog3= var.hby*0.8// joy3.y*MapRange(joy3.slider,-1,1,0.001,1)*0.8
var.fr2++
//Debug=var.sin +" "+var.rr +" "+var.fr +" "+ var.r2
if pie.Frame mod 833==0 then
var.r2=(Random*20+10)*2
end
if pie.Frame mod 1000==0 then
for(var.i=0;var.i<120; var.i++)
if (var.i==int(pie.FrameRate)) then
var.fr=var.i
end
end
end
if pie.Frame mod 20==0 then
var.sin=Sin(var.fr2/var.fr*360/var.r2)
end
if var.gang==7 then
var.kup=0
else
var.kup=1- var.pedal4
end
if var.pedal2<0.4 then
var.vibgas= var.pedal2/2+var.pedal2/2/EnsureMapRange(abs(var.gang),1,6,1,2)*var.kup
var.vgasdz=0
else
var.vgasdz+= var.pedal2/var.fr /(EnsureMapRange(abs(var.gang),1,6,1,10)*EnsureMapRange(var.kup,0.8,1,0,1)+1)
if var.vgasdz>1 then
var.vgasdz=1
end
var.vibgas= var.pedal2*(1+var.vgasdz)/2 +var.pedal2*(1+var.vgasdz*2)/2/EnsureMapRange(abs(var.gang),1,6,1,2)*var.kup
end
var.rr=0.8+var.sin*0.051-EnsureMapRange(var.vibgas+var.pedale3+var.lwm*3,0,4,0,0.3)
if abs(var.lw)<=130 then
var.lwm=EnsureMapRange(abs(var.lw) ,0,130,0,1)
else
var.lwm=EnsureMapRange(-abs(var.lw) ,-130,-260,1,0)
end
var.ran= Random
if var.ran>(var.rr) then
wiimote.Rumble=1
else
wiimote.Rumble=0
end
var.z =int(Deadzone(joy3.y,13,0.3)*6)
var.hby= max(joy3.y,var.hby2) //*MapRange(joy3.slider,-1,1,0.001,1)
if joy3.Pov1Up then
var.hby2=var.z /6
end
if joy3.Pov1Down then
var.hby2=0
end
Zu Steuerung nutze ich ein selbstgebautes 1080 Grad Lenkrad, welches auf 1800 Grad erweitert werden kann, eine selbstgebaute H-Schaltung, zwei alte 180 Grad Lenkräder für die Pedale, und um das ganze Umsetzen zu können, die Software Glovepie, lässt sich frei programieren, PPJoy, da ich diesen virtuellen Controller mit Glovepie ansteuern kann und UJR damit auch V-JOY um meine virtuellen Kontroller
an Rfactor zu übertragen, da dieser nur die ersten beiden Kontroller erkennt, von PPJOY wird in Winodows Kontrollerliste nach hinten geschoben, und damit von Rfactor nicht erkannt wird, weshalb UJR unabdingbar ist.
Ich habe zum einem mechanisches Forcefeedback, welches ich für einen Miata mit nachgerüsteten Lenkkraftverstärker berechnet habe, allerdings ist es nur bis 130° Grad Lenkwinkel realistisch, da ich keine Idee habe, wie ich erzeugte Kraft von meinen Gewichten ab einem bestimmten Winkel wieder veringern kann.
Hier mal ein paar Quellen dazu:
Das ganze funktioniert dann so, dass sich die Feder bis ca 120° ausdehnt, und dann die Gewichtskraft der Flasche kleiner ist, als die Feder-Kraft der Zugfeder und sich das Gewicht sich nach oben verschiebt, durch die Reibungskräfte an der Wicklung der Sehne um den Haken, entsteht ein dynamisches Kraftverhalten am Lenkrad, welches dem Einlaufverhalten eines Rades ähnelt.
Außerdem nutze ich die Wiibration der Wiimote um mir ein zufallsbasiertes Vibrationsfeedback zu schaffen, welches
aufgrund der Parameter Zeit, Gaspedalstellung, Bremspedalstellung, Lenkwinkel, Kupplungspedalstellung und Gang
unterschiedlich intensiv und häufig vibriert. Wenn jemand eine Möglichkeit kennt, Force-Feedback aus der Sim (in meinem Fall Rfactor und sobald der neue Recher da ist, AC) auf einen virtuellen Kontroller zu übertragen, würde ich mich über eine Anregung sehr freuen.
Benötigte PC-Komponenten-Hardware:
2 alte analoge 180° Lenkrräder
2 Joysticks
alles zusammen kommt man auf 20€ im PC-Gebrauchtwarenladen, allerdings sollte man sich vor dem Kauf die Funktionalität demonstrieren lassen, da diese Leute aufgrund mangelnder Kompetenz auch Schrott annehmen und weiterverkaufen (Flackernde Lenkung), von Privatkäufen dieser Artikel rate ich dringend ab, weil die meisten Verkäufer erst verkaufen, wenn sie selbst aufgrund eines Defekts das Gerät nicht mehr nutzen können. Je netter der Verkäufer umso unbrauchbarer das Gerät (gilt jedenfalls für Sachsen und Mossis) Im Westen mags anders aussehen, dafür sind die Preise generell höher.
DIY-6-Gangschaltung mit Rückwärtsgang:
benötigte Materialen:
diverse Schrauben
Stichsäge
Bohrmaschine
Holzplatte
längeres Holzstück
(beides aus der Verschnittkiste im Baumarkt)
Stockschraube 10x200mm
6x Rohrclips 10-11mm
Knauf für den Schalthebel
Tischklemme
Anleitung:
Von der Holzplatte zwei quadratische ausreichend große Stücke absägen.
Joystickhebel abschrauben,
(die Kabeln im Joystickhebel können abgeschnitten werden, aber es ist darauf zu achten,
dass kein Kurzschluss entsteht, z.B. mit der Stockschraube)
Das Joystickgehäuse von unten an die Platte schrauben, (Reihenfolge: Schraube-> Platte-> Gehäuse)
Vom Holzstück vier gleichlange Stücke in der Höhe des Joystickfusses + 1cm absägen.
Mit den beiden Platten sowie abgebildet verschrauben.
In der oberen Platte soll ein Rechteck entstehen, welches den Schaltweg ermöglicht und begrenzt,
In mehreren Schritten muss das Rechteck nach Wunsch und unter Beachtung der Grenze durch den Joystick
vergrößert werden.
Mit Bohrmaschine mittig ein Loch vorbohren. Dieses mit der Stichsäge vergrößern.
Zwei Holzstücke absägen, an jedem 3 Rohrclips befestigen,
Holzstücke an die zwei gegenüberliegenden Außenkante schrauben.
Die Fassung gewaltsam aus dem Knauf reißen, die Stockschraube
in den Knauf schrauben, dann andere Seite in die Fassung vom Joystick schrauben.
Die Rohrclips so ausrichten, dass das ein geringer Schaltwiderstand entsteht und die Stockschraube gehalten wird.
Um sich nicht zu verschalten, kann man nun einzelne zugesägte Holzstücke so festschrauben, das der Schaltweg weiter eingeschränkt wird, wie bspw. abgebildet.
Um das Holz zu versteclen, habe ich eine Tüte an der Stockschraube befestigt, und deren Griffe an die Ecken der oberen Platte befestigt.
USB-Stick in den PC stecken, Glovepie-Script starten, fertig.
FreePie Script (als Alternative zu Glovepie, da VJoy signierte Treiber hat, welche die Installation erleichtern, vgl. PPJOY:
from System import Int16
def sign(x):
if x > 0:
return 1.
elif x < 0:
return -1.
elif x == 0:
return 0.
else:
return x
if starting:
system.setThreadTiming(TimingTypes.HighresSystemTimer)
system.threadExecutionInterval = 5 # loop delay
max = Int16.MaxValue*0.5+2
gf=90
gangjoystickmin=0.6
gang2=0
gang3=0
gangconfi2=1
gang=0
waag=0
vert=0
if not joystick[1].getDown(0):
vJoy[0].z =0
vJoy[0].rx =0
waag= joystick[1].x/1000.0
vert= -joystick[1].y/1000.0
if gang3 <=3:
gangconfi2=0
if gang3>3 and gang3<6:
gangconfi2=1
if vert> gangjoystickmin and waag<-gangjoystickmin and joystick[1].getDown(2):
gang =-1
elif vert> gangjoystickmin and waag<-gangjoystickmin and not joystick[1].getDown(2):
gang =1
elif vert< -gangjoystickmin and waag<-gangjoystickmin and not joystick[1].getDown(2):
gang =2
elif vert> gangjoystickmin and abs(waag) < 0.4 and not joystick[1].getDown(2):
gang =3
elif vert< -gangjoystickmin and abs(waag) < 0.4 and not joystick[1].getDown(2):
gang =4
elif vert> gangjoystickmin and waag>gangjoystickmin and not joystick[1].getDown(2):
gang =5
elif vert< -gangjoystickmin and waag>gangjoystickmin and not joystick[1].getDown(2) and gangconfi2==0:
gang =-1
elif vert< -gangjoystickmin and waag>gangjoystickmin and not joystick[1].getDown(2) and gangconfi2==1:
gang =6
if int(gang2)== gang:
gang2+= 0.5/gf *sign(gang)
else:
gang2 =gang
if (gang2-int(gang2))*sign(gang)>=0.5:
gang3= int(gang2)
gang=gang3
else:
vJoy[0].z=joystick[1].y *15.0 #handbremse
vJoy[0].rx=joystick[1].y*40.0
diagnostics.watch( vJoy[0].z)
diagnostics.watch( vJoy[0].rx)
if gang==-1:
vJoy[0].setButton(0,1)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==6:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,1)
vJoy[0].setButton(7,0)
elif gang==1:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,1)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==2:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,1)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==3:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,1)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==4:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,1)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==5:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,1)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==7:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,1)
diagnostics.watch(gang3)
diagnostics.watch(waag)
diagnostics.watch(vert)
#vJoy[0].setButton(2,int(mouse.middleButton))
if stopping:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
def sign(x):
if x > 0:
return 1.
elif x < 0:
return -1.
elif x == 0:
return 0.
else:
return x
if starting:
system.setThreadTiming(TimingTypes.HighresSystemTimer)
system.threadExecutionInterval = 5 # loop delay
max = Int16.MaxValue*0.5+2
gf=90
gangjoystickmin=0.6
gang2=0
gang3=0
gangconfi2=1
gang=0
waag=0
vert=0
if not joystick[1].getDown(0):
vJoy[0].z =0
vJoy[0].rx =0
waag= joystick[1].x/1000.0
vert= -joystick[1].y/1000.0
if gang3 <=3:
gangconfi2=0
if gang3>3 and gang3<6:
gangconfi2=1
if vert> gangjoystickmin and waag<-gangjoystickmin and joystick[1].getDown(2):
gang =-1
elif vert> gangjoystickmin and waag<-gangjoystickmin and not joystick[1].getDown(2):
gang =1
elif vert< -gangjoystickmin and waag<-gangjoystickmin and not joystick[1].getDown(2):
gang =2
elif vert> gangjoystickmin and abs(waag) < 0.4 and not joystick[1].getDown(2):
gang =3
elif vert< -gangjoystickmin and abs(waag) < 0.4 and not joystick[1].getDown(2):
gang =4
elif vert> gangjoystickmin and waag>gangjoystickmin and not joystick[1].getDown(2):
gang =5
elif vert< -gangjoystickmin and waag>gangjoystickmin and not joystick[1].getDown(2) and gangconfi2==0:
gang =-1
elif vert< -gangjoystickmin and waag>gangjoystickmin and not joystick[1].getDown(2) and gangconfi2==1:
gang =6
if int(gang2)== gang:
gang2+= 0.5/gf *sign(gang)
else:
gang2 =gang
if (gang2-int(gang2))*sign(gang)>=0.5:
gang3= int(gang2)
gang=gang3
else:
vJoy[0].z=joystick[1].y *15.0 #handbremse
vJoy[0].rx=joystick[1].y*40.0
diagnostics.watch( vJoy[0].z)
diagnostics.watch( vJoy[0].rx)
if gang==-1:
vJoy[0].setButton(0,1)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==6:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,1)
vJoy[0].setButton(7,0)
elif gang==1:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,1)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==2:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,1)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==3:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,1)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==4:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,1)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==5:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,1)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
elif gang==7:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,1)
diagnostics.watch(gang3)
diagnostics.watch(waag)
diagnostics.watch(vert)
#vJoy[0].setButton(2,int(mouse.middleButton))
if stopping:
vJoy[0].setButton(0,0)
vJoy[0].setButton(1,0)
vJoy[0].setButton(2,0)
vJoy[0].setButton(3,0)
vJoy[0].setButton(4,0)
vJoy[0].setButton(5,0)
vJoy[0].setButton(6,0)
vJoy[0].setButton(7,0)
DIY-Handbremse:
2 Stuhlwinkel
diverse Schrauben
2 Haken
Aus der restlichen Platte 2 große Stücke scheiden.
Mit den Stuhlwinkeln verschrauben, eine Platte unter die Gangschaltung schieben und mit der Tischklemme festschrauben. Joystick auf die andere Platte stellen, mit Haken fixieren, die Stuhlwinkel biegen, bis die Stellung des Joysticks ideal ist.
Falls Probleme auftreten, weil bspsw. das Script falsch formatiert ist, ihr aber nicht Mitglied in diesem Forum seid, könnt ihr mich über
justkauser (at) gmail (dot) com kontaktieren.
Zuletzt bearbeitet: