SSブログ

XP11 ZIBOにRevsim TQを接続する その5 [X-Plane]

OCUSBMapper経由でRevsimを接続する件も、今回が最後。
スピードブレーキです。

日本語でプログラムを書くとこんな流れ。

◆デバイス入出力値
dcmDR_input_analog[4] :revsimスピードブレーキポテンショメーターからの取得値 0-164
dcmDR_input_analog[5]:revsim 左TQポテンショメーター位置 0-242
dcmDR_output_motor[0]:スピードブレーキのDCモーターへの入力値 0:停止、120:展開、220:格納

◆プログラム上の変数
revsim_sb_pos:revsimポテンショメーターからの取得値 0-1
simDR_sb_in:シム上のスピードブレーキ位置(入力先)
sb_arm:スピードブレーキアーム状態 0:disarm、1:arm
simDR_rev_full:リバーサーの状態 0.06:フルリバース
sb_sit:スピードブレーキの状態追跡変数 0:初期状態、1:フル展開中、2:フル展開モーター停止、3:格納中


◆流れ
1.revsim_sb_posが0.303804よりも小さく0.203804よりも大きい場合はスピードブレーキをアーム
2.上記範囲外の場合は、revsimPOTの値をシミュレーターへ入力してアナログ操作を可能に。同時にスピードブレーキをディスアーム
3.スピードブレーキがアームされていて、かつリバーサーがフル状態になったら、スピードブレーキを展開(モーター稼働)
4.スピードブレーキがフル展開されたらモーター稼働停止
5.フル展開状態で左TQが10%程度まで入ったらスピードブレーキ格納(モーター稼働)
7.格納されたらモーター停止。スピードブレーキアーム変数、状態追跡状態変数リセット

本来なら、「接地」でスピードブレーキが展開されるところなんでしょうが、その値がどこで取得できるかわからなかったので、とりあえずリバーサーを操作したら展開するようにしてます。
たたむときはスロットルを入れると自動格納するようにしてみました。

◆動作状況(動画)


◆オイル
ちなみに、しばらくオイルをさしてなかったら動かなくなってしまっていたので、チェーンソー用オイルを購入してスピードブレーキの接点部に塗布してみました。
粘度が適度にあってちょうどいいです。



◆ソースコード(スピードブレーキ該当部のみ)

--*************************************************************************************--
--** 					               CONSTANTS                    				 **--
--*************************************************************************************--

DCMOTORS_DEVICE = 0

--*************************************************************************************--
--** 				             FIND X-PLANE DATAREFS            			    	 **--
--*************************************************************************************--

simDR_sb_pos		= find_dataref("sim/cockpit2/controls/speedbrake_ratio")
simDR_sb_in		  = find_dataref("laminar/B738/flt_ctrls/speedbrake_lever")
simDR_rev_full		= find_dataref("laminar/B738/flt_ctrls/reverse_lever1")

--*************************************************************************************--
--** 				              FIND CUSTOM DATAREFS             			    	 **--
--*************************************************************************************--

dcmDR_input_analog	= find_dataref("pikitanga/ocusbmapper/dcm" .. DCMOTORS_DEVICE .. "/input/analog")
dcmDR_output_motor	= find_dataref("pikitanga/ocusbmapper/dcm" .. DCMOTORS_DEVICE .. "/output/motor")

--*************************************************************************************--
--** 				                 SYSTEM FUNCTIONS           	    			 **--
--*************************************************************************************--

function process_speedbrake()

	-- revsim speedbrake position
	revsim_sb_pos = dcmDR_input_analog[4] / 160

	-- speed brake deproy
	if (revsim_sb_pos > 0.303804) then
			simDR_sb_in = revsim_sb_pos
			sb_arm = 0
	end

	-- speed brake detract
	if (revsim_sb_pos < 0.203804) then
			simDR_sb_in = revsim_sb_pos
			sb_arm = 0
	end

	-- speed brake arm
	if (sb_arm == 0) then
		if (revsim_sb_pos > 0.203804) then
			if (revsim_sb_pos < 0.303804) then
				simDR_sb_in = 0.0889
				sb_arm = 1
			end
		end
	end

	-- speed brake deproy in landing
	if (sb_arm == 1) then
		if (simDR_rev_full == 0.06) then
			dcmDR_output_motor[0] = 120
			sb_sit = 1
		end
	end

	-- speed brake motor off
	if (sb_sit == 1) then
		if (revsim_sb_pos > 0.9) then
			dcmDR_output_motor[0] = 0
			sb_sit = 2
		end
	end

	-- speed brake detent after landing
	if (sb_sit == 2) then
		if (dcmDR_input_analog[5] > 50) then
			dcmDR_output_motor[0] = 220
			sb_sit = 3
		end
	end

	-- speed brake motor off
	if (sb_sit == 3) then
		if (revsim_sb_pos < 0.1) then
			dcmDR_output_motor[0] = 0
			sb_sit = 0
			sb_arm = 0
		end
	end

end


--*************************************************************************************--
--** 				               XLUA EVENT CALLBACKS       	        			 **--
--*************************************************************************************--

function before_physics()

	process_speedbrake()

end




nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。