カテゴリー別アーカイブ: Python

速度からエンジン回転数を計算する

マニュアル車の速度におけるエンジンの回転数を調べたくなりました。試しにNDロードスターが時速30キロで走るための各ギアの回転数を計算してみました。

 

エンジン回転数は1分間にエンジンが回転する回数です。単位はrpm (rotations per minute)

式にするとこうなります。

車速=タイヤの外周長×エンジン回転数÷(ギア比×最終減速比)

エンジンが一分間に回転することでタイヤがどれだけ回転するか分かればタイヤの円周長から一分あたりの走行距離が分かります。

 

また、この式を変形することでエンジン回転数を求めることができます。

エンジン回転数=車速×(ギア比×最終減速比)÷タイヤの外周長

 

ギア比×最終減速比の値がタイヤが一回転するためのエンジン回転数になるので

NDロードスターの場合

5.087(一速)×2.886(最終減速比)=14.68

タイヤが1回転するためにエンジンは14.68回転します。

 

import math

# ホイールの直径 (inch)
wheelDiameter = 16

# タイヤ幅 (mm)
tireWidth = 195

# 扁平率 (%)
tireFlatness = 0.5

# タイヤの外周長(m)
perimeterLength = ((tireWidth * tireFlatness * 2) + wheelDiameter * 25.4) * math.pi / 1000

# 最終減速比
finalReductionRatio = 2.866

# ギア比
gearRatio = [5.087, 2.991, 2.035, 1.594, 1.286, 1.000]

# 速度(km/h)
speed = 30

# 回転数を計算する
for i in range(0, len(gearRatio)):
    rpm = (speed * 1000 / 60) * gearRatio[i] * finalReductionRatio / perimeterLength
    print(str(i+1) + ': ' + str(int(rpm)) + ' rpm')

結果このようにプリントされます。

1: 3858 rpm
2: 2268 rpm
3: 1543 rpm
4: 1208 rpm
5: 975 rpm
6: 758 rpm

減速時に30kmあたりで2速に落とすには2268rpmあたりでつなげばスムーズなギアチェンジができますね。

※この計算はあらゆる抵抗などを無視した概算です

WPFを使った作例です。

Python: バイナリの編集

Pythonでわりと簡単にバイナリを編集することが出来たのでメモ。たまに一括でヘッダーを編集したりしたいことがありますよね。

 

読み込み

バイナリ情報を読み込んで表示させてみます。まずはバイトで読み込み(000000AFまでを読み込む場合)

f = open('test.dat', 'r+b')
header = f.read(16*11)
f.close()
print (header)

 

16進数で確認したい場合はさらに以下を書く

hex_string = header.hex()
print(hex_string)

 

1バイト区切りで確認したい場合はさらに以下のコードを続けて書く

# 文字列をN文字ずつ分割
def splitStr(str, num):
    counter = 0
    w = ''
    strList = []
    for s in str:
        w += s
        counter += 1
        if counter == num:
            strList.append(w)
            counter = 0
            w = ''
    if w:
        strList.append(w)
    return strList

rows = splitStr(hex_string,32)
for row in rows:
    byte = splitStr(row,2)
    print(byte)

 

書き込み

続いてバイナリの書き込み例です。ファイルAのヘッダ(最初から000000AFまで)をそのままにして、ファイルBのヘッダ以外のデータ部分(00000094から最後まで)を書き込む場合。

#ヘッダーを読む
source = open('a.dat', 'r+b')
header = source.read(16*11)
#print (header)
source.close()

target = open('b.dat', 'r+b')
target.seek(16*9+4)
data = target.read()
#print(data)
target.close()

# 新しいファイルを作成し、書き込む
with open('a.dat', 'wb') as f:
    f.seek(0)
    f.write(header + data)

input()