計測用車いすの開発 〜プログラムの詳細とダウンロード〜 Sub Calc1() ' '****************** ' 計算1 '****************** ' Form1.RetInf = "" Form1.RetInf = "Calculating..." ' Tr = 0.505 '後輪トレッド(幅)(m) Rw = 0.31 '後輪半径(m) ' ' 最大値・最小値の初期化 ' Distance_min(2) = 0: Distance_max(2) = 0 Speed_max(0) = 0: Speed_max(1) = 0 Speed_min(0) = 0: Speed_min(1) = 0 Tq_max(0) = 0: Tq_max(1) = 0 Tq_min(0) = 0: Tq_min(1) = 0 Power_max(0) = 0: Power_max(1) = 0 Power_min(0) = 0: Power_min(1) = 0 x_min = 0: x_max = 0 y_min = 0: y_max = 0 Alpha_deg_min = 0: Alpha_deg_max = 0 Beta_deg_min = 0: Beta_deg_max = 0 Tq_av(0) = 0: Tq_av(1) = 0 Power_av(0) = 0: Power_av(1) = 0 dSpeed(0) = 0: dSpeed(1) = 0: dSpeed(2) = 0 dTq(0) = 0: dTq(1) = 0 dPower(0) = 0: dPower(1) = 0 ' ' 初期値(i=1) ' Angle_deg(0, 1) = 0: Angle_deg(1, 1) = 0 Distance(0, 1) = 0: Distance(1, 1) = 0 If Form1.chkShift.Value = 1 Then '0Vの補正をする Tq(0, 1) = Ka(0, 1) * Volt(0, 1) Tq(1, 1) = Ka(1, 1) * Volt(1, 1) Else Tq(0, 1) = Ka(0, 1) * Volt(0, 1) + Ka(0, 0) Tq(1, 1) = Ka(1, 1) * Volt(1, 1) + Ka(1, 0) End If Alpha(1) = 0 Beta(1) = 0 x(1) = 0: y(1) = 0 ' ' データ処理 ' For i = 2 To DataNum ' ' 車輪角度の計算 ' If Encoder(0, i) - Encoder(0, i - 1) < -500 Then '4095→0(逆回転) Angle_deg(0, i) = Angle_deg(0, i - 1) - (Encoder(0, i) + 4096 - Encoder(0, i - 1)) * 360 / 2000 ElseIf Encoder(0, i) - Encoder(0, i - 1) > 500 Then '0→4095(正回転) Angle_deg(0, i) = Angle_deg(0, i - 1) - (Encoder(0, i) - 4096 - Encoder(0, i - 1)) * 360 / 2000 Else Angle_deg(0, i) = Angle_deg(0, i - 1) - (Encoder(0, i) - Encoder(0, i - 1)) * 360 / 2000 End If Angle(0, i) = Angle_deg(0, i) * 3.14159 / 180 '(rad) ' If Encoder(1, i) - Encoder(1, i - 1) < -500 Then '4095→0(正回転) Angle_deg(1, i) = Angle_deg(1, i - 1) + (Encoder(1, i) + 4096 - Encoder(1, i - 1)) * 360 / 2000 ElseIf Encoder(1, i) - Encoder(1, i - 1) > 500 Then '0→4095(逆回転) Angle_deg(1, i) = Angle_deg(1, i - 1) + (Encoder(1, i) - 4096 - Encoder(1, i - 1)) * 360 / 2000 Else Angle_deg(1, i) = Angle_deg(1, i - 1) + (Encoder(1, i) - Encoder(1, i - 1)) * 360 / 2000 End If Angle(1, i) = Angle_deg(1, i) * 3.14159 / 180 '(rad) ' ' 移動距離・速度の計算 ' Distance(0, i) = Rw * Angle(0, i) '移動距離(m) Distance(1, i) = Rw * Angle(1, i) '移動距離(m) Distance(2, i) = (Distance(0, i) + Distance(1, i)) / 2 '左右の平均移動距離(m) Speed(0, i) = (Distance(0, i) - Distance(0, i - 1)) / (SampClk / 1000) '速度(m/s) Speed(1, i) = (Distance(1, i) - Distance(1, i - 1)) / (SampClk / 1000) '速度(m/s) Speed(2, i) = (Speed(0, i) + Speed(1, i)) / 2 '左右の平均速度(m/s) ' ' トルク・出力の計算 ' If Form1.chkShift.Value = 1 Then '0Vの補正をする Tq(0, i) = Ka(0, 1) * Volt(0, i) Tq(1, i) = Ka(1, 1) * Volt(1, i) Else Tq(0, i) = Ka(0, 1) * Volt(0, i) + Ka(0, 0) Tq(1, i) = Ka(1, 1) * Volt(1, i) + Ka(1, 0) End If Power(0, i) = (Tq(0, i) + Tq(0, i - 1)) * (Angle(0, i) - Angle(0, i - 1)) / 2 / (SampClk / 1000) '出力(W) Power(1, i) = (Tq(1, i) + Tq(1, i - 1)) * (Angle(1, i) - Angle(1, i - 1)) / 2 / (SampClk / 1000) '出力(W) ' ' 旋回角度,角速度の計算 ' dDistance(0) = Distance(0, i) - Distance(0, i - 1) '左車輪の1ステップの移動距離(m) dDistance(1) = Distance(1, i) - Distance(1, i - 1) '右車輪の1ステップの移動距離(m) If dDistance(0) = dDistance(1) Then '直進または不動 Beta(i) = 0 '旋回角速度(rad/sec) Alpha(i) = Alpha(i - 1) Turn$ = "cent" ElseIf dDistance(0) = 0 Or dDistance(1) = 0 Then R = Tr / 2 Beta(i) = (dDistance(1) - dDistance(0)) / Tr '角速度(rad/step)(左旋回が正,右旋回が負) Alpha(i) = Alpha(i - 1) + Beta(i) '旋回角度(rad) If Beta(i) > 0 Then Turn$ = "left" If Beta(i) < 0 Then Turn$ = "right" ElseIf dDistance(0) < dDistance(1) Then '左旋回 R = (Tr / 2 * (dDistance(1) + dDistance(0))) / (dDistance(1) - dDistance(0)) '旋回半径(m) Beta(i) = dDistance(1) / (R + Tr / 2) '旋回角速度(rad/step) Alpha(i) = Alpha(i - 1) + Beta(i) '旋回角度(rad) Turn$ = "left" ElseIf dDistance(0) > dDistance(1) Then '右旋回 R = (Tr / 2 * (dDistance(1) + dDistance(0))) / (dDistance(0) - dDistance(1)) '旋回半径(m) Beta(i) = -dDistance(0) / (R + Tr / 2) '旋回角速度(rad/step) Alpha(i) = Alpha(i - 1) + Beta(i) '旋回角度(rad) Turn$ = "right" End If ' ' 軌跡座標の計算(y=横方向,x=進行方向) ' If Turn$ = "cent" Then x(i) = x(i - 1) + dDistance(0) * Cos(Alpha(i)) y(i) = y(i - 1) + dDistance(0) * Sin(Alpha(i)) ElseIf Turn$ = "left" Then x(i) = x(i - 1) + R * Sin(Alpha(i)) - R * Sin(Alpha(i - 1)) '後輪中心位置の座標(左右方向) y(i) = y(i - 1) - R * Cos(Alpha(i)) + R * Cos(Alpha(i - 1)) '後輪中心位置の座標(進行方向) ElseIf Turn$ = "right" Then x(i) = x(i - 1) - R * Sin(Alpha(i)) + R * Sin(Alpha(i - 1)) '後輪中心位置の座標(左右方向) y(i) = y(i - 1) + R * Cos(Alpha(i)) - R * Cos(Alpha(i - 1)) '後輪中心位置の座標(進行方向) End If Beta_deg(i) = Beta(i) / (SampClk / 1000) * 180 / 3.14159 '旋回角速度(deg/sec) Alpha_deg(i) = Alpha(i) * 180 / 3.14159 '旋回角度(deg) ' ' 最大値・最小値・平均値の計算 ' If Distance_min(2) > Distance(2, i) Then Distance_min(2) = Distance(2, i) If Distance_max(2) < Distance(2, i) Then Distance_max(2) = Distance(2, i) If Speed_min(0) > Speed(0, i) Then Speed_min(0) = Speed(0, i) '最小速度(仮) If Speed_min(1) > Speed(1, i) Then Speed_min(1) = Speed(1, i) '最小速度(仮) If Speed_max(0) < Speed(0, i) Then Speed_max(0) = Speed(0, i) '最大速度(仮) If Speed_max(1) < Speed(1, i) Then Speed_max(1) = Speed(1, i) '最大速度(仮) If Tq_min(0) > Tq(0, i) Then Tq_min(0) = Tq(0, i) '最小トルク(仮) If Tq_min(1) > Tq(1, i) Then Tq_min(1) = Tq(1, i) '最小トルク(仮) If Tq_max(0) < Tq(0, i) Then Tq_max(0) = Tq(0, i) '最大トルク(仮) If Tq_max(1) < Tq(1, i) Then Tq_max(1) = Tq(1, i) '最大トルク(仮) If Power_min(0) > Power(0, i) Then Power_min(0) = Power(0, i) '最小出力(仮) If Power_min(1) > Power(1, i) Then Power_min(1) = Power(1, i) '最小出力(仮) If Power_max(0) < Power(0, i) Then Power_max(0) = Power(0, i) '最大出力(仮) If Power_max(1) < Power(1, i) Then Power_max(1) = Power(1, i) '最大出力(仮) If x_min > x(i) Then x_min = x(i) If x_max < x(i) Then x_max = x(i) If y_min > x(i) Then y_min = x(i) If y_max < x(i) Then y_max = x(i) If Alpha_deg_min > Alpha_deg(i) Then Alpha_deg_min = Alpha_deg(i) If Alpha_deg_max < Alpha_deg(i) Then Alpha_deg_max = Alpha_deg(i) If Beta_deg_min > Beta_deg(i) Then Beta_deg_min = Beta_deg(i) If Beta_deg_max < Beta_deg(i) Then Beta_deg_max = Beta_deg(i) Tq_av(0) = Tq_av(0) + Tq(0, i) Tq_av(1) = Tq_av(1) + Tq(1, i) Power_av(0) = Power_av(0) + Power(0, i) Power_av(1) = Power_av(1) + Power(1, i) Next i ' Speed_av(0) = (Distance(0, DataNum) - Distance(0, 1)) / SampTime '平均速度(m/s) Speed_av(1) = (Distance(1, DataNum) - Distance(1, 1)) / SampTime '平均速度(m/s) Speed_av(2) = (Distance(2, DataNum) - Distance(2, 1)) / SampTime '平均速度(m/s) If Speed_av(0) <> 0 Then dSpeed(0) = (Speed_max(0) - Speed_min(0)) / Speed_av(0) '速度変動率 End If If Speed_av(1) <> 0 Then dSpeed(1) = (Speed_max(1) - Speed_min(1)) / Speed_av(1) '速度変動率 End If If Speed_av(2) <> 0 Then dSpeed(2) = (Speed_max(2) - Speed_min(2)) / Speed_av(2) '速度変動率 End If Tq_av(0) = Tq_av(0) / (DataNum - 1) '平均トルク(Nm) Tq_av(1) = Tq_av(1) / (DataNum - 1) '平均トルク(Nm) If Tq_av(0) <> 0 Then dTq(0) = (Tq_max(0) - Tq_min(0)) / Tq_av(0) 'トルク変動率 End If If Tq_av(1) <> 0 Then dTq(1) = (Tq_max(1) - Tq_min(1)) / Tq_av(1) 'トルク変動率 End If Power_av(0) = Power_av(0) / (DataNum - 1) '平均出力(Nm) Power_av(1) = Power_av(1) / (DataNum - 1) '平均出力(Nm) If Power_av(0) <> 0 Then dPower(0) = (Power_max(0) - Power_min(0)) / Power_av(0) 'エネルギ変動率 End If If Power_av(1) <> 0 Then dPower(1) = (Power_max(1) - Power_min(1)) / Power_av(1) 'エネルギ変動率 End If ' End Sub |
[ Wheelchair Home Page ] [ Wheelchair Measuring System ] |
このページに関するお問い合わせはkhirata@nmri.go.jpまでお願いします |