ラベル bicycle の投稿を表示しています。 すべての投稿を表示
ラベル bicycle の投稿を表示しています。 すべての投稿を表示

2017年11月6日月曜日

ギヤ比

ソースコード
https://github.com/index333/gear

ギヤ比は一般には単に前後の比率で表します。
例えばフロント30T x リヤ20Tの場合
30➗20で1.50

欧米では伝統的にダルマ型自転車の前輪径に換算します。
30x20の場合
27x1.5=41インチギヤ
のように表現します。
欧米式の利点は小径車にも統一的に使えることです。
上の場合
20x1.5=30インチギヤとなります。
逆にロードレーサーの41インチギヤと同じ速度を小径車で得るには
30x15あるいは39x20という前後の組み合わせが必要となります。


ケーデンスを固定した時の時速で表したほうが直感的と思います。

まずタイヤ周長を選択します。

データはキャットアイのページからコピーしました。

$ cat tires
18-622 700x18C 2070 207
19-622 700x19C 2080 208
20-622 700x20C 2086 209
23-622 700x23C 2096 210
25-622 700x25C 2105 211
28-622 700x28C 2136 214
30-622 700x30C 2146 215
32-622 700x32C 2155 216
xx-xxx  Tubular 2130 213
35-622 700x35C 2168 217
38-622 700x38C 2180 218
40-622 700x40C 2200 220
42-622 700x42C 2224 222
44-622 700x44C 2235 224
45-622 700x45C 2242 224
47-622 700x47C 2268 227

$ cat tires | runghc selectItem.hs > tmp
$ cat tmp
23-622 700x23C 2096 210


Round モジュール、MySpinBox モジュールが必要です。
$ cat tmp | runghc gear.hs

2017年11月3日金曜日

pcd,歯底距離

チェーンリングのPCD(ピッチ・サークル・ダイアメーター)を計算します。
チェーンリングのPCDとはチェーン用ギヤにチェーンを巻きつけたときチェーンピンが形作る仮想円の直径のことです。
これは1辺の長さが12.7mmの正N角形に外接する円の直径の計算に還元できます。
(
クランクのPCDと区別するため、あちらはBCD(ボルト・サークル・ダイアメーター)と表現します
)
次に歯底距離を計算します。

歯底距離を測ればチェーンリングの歯数がわかります。

$ ghci
Prelude> :l Ch.hs
[1 of 1] Compiling Ch               ( Ch.hs, interpreted )
Ok, modules loaded: Ch.
*Ch> rd0 43
(43,166)
*Ch> rd0 44
(44,170)

歯底距離が166mmであれば歯数は43T
歯底距離が170mmであれば歯数は44T

チェーリングのPCDとリヤスプロケットのPCDがわかれば、シングル・バイクのチェーン長が計算できます。

芯間距離(チェーンステイ長)405mm、前スプロケット歯数48Tそして後スプロケット歯数16Tの場合

*Ch> chlen 48 16 405
1226.491724535387
*Ch> it / p
96.57415153821945

97リンク。(半コマ使用時)
98リンク。(半コマ不使用時)

チェーン長計算は下図を参考にしてください。


SpinBoxで入力を楽に

初期データは「tmp]に

$ cat tmp
[48.0,16.0,405.0]




スプロケを交換したときに
リヤアクスルが何ミリ移動するか計算します。

2017年10月26日木曜日

スポーク長計算


https://github.com/index333/spcal

からソースがDLできます。

新バージョンは

https://github.com/index333/spcal2


各寸法の測り方は
https://www.sheldonbrown.com/spoke-length.html
を参考にしてください。

まずサンプルファイルを作っておきます。

426.0
45.0
37.3
45.0
20.7

次のスクリプトを実行します。

$ cat sample | runghc spcal.hs


MySpinBox モジュール Round モジュールも必要です。

Failed to load module “canberra-gtk-module” のようなエラーメッセージがでるかも知れません。
無視してもかまいませんが
libcanberra-gtk-module
をインストールすると解消します。

sudo apt-get install libcanberra-gtk-module

スポーク長の計算式は








aはErdの2分の1、bはpcdの2分の1、dはフランジとセンター間の距離。 hはホール数、kは組数です。
Haskellでは

calLen a b d k h = sqrt ((a^2+b^2+d^2) - (2*a*b*(cos $ alfa h k))) 
     where alfa h k = rad (360 / h * k) 

この計算は同心円上の2点間の距離の問題に還元できます。このような計算は複素数で行うととても楽になります。

ハブ軸を原点に、交差する2本のスポークの交点を複素平面上の実数軸にあわせます。
(32ホール、6本組)

(見やすいように、ハブは実際より大きく描いています。)

スポークの両端をハブ側をA点,リム側をB点としますと

点Aの位相(実数軸との角度)はどの組み方でも 
360度➗(リムの穴数➗2) x (組数ー1)➗2
32ホール、6本組の場合、22.5度×2.5=56.25度
絶対値(原点までの距離)はハブのPCDの半分

点Bの位相は組み方に関係なく
 360度➗リムの穴数×(−1)
32ホール、6本組の場合、ー11.25度
絶対値はリムのERDの半分。
 これにハブの厚みとスポークの長さ表示方法を考慮して関数化すると

dist :: RealFloat a => Complex a -> Complex a -> a -> a
dist x y z = sqrt (l * l + z * z) where l = magnitude (x - y)
calLen a b d k h = dist x y d - hosei        
    where   x = mkPolar b (yen / (h / 2) * (k - 1) / 2)
                 y = mkPolar a (yen / h * (-1))
     yen = pi * 2

 どちらを使っても同じ結果になります。

なおラジアル組みの場合、簡易な計算で求められますが、
たまたま位相が一致する特殊なケースとして一般化できます。

Javaなどのオブジェクト指向言語ではデータをオブジェクトのまま保存します。

Haskellではdata型をShowして保存し、読み込んでReadすると元のdata型に戻してくれます。

このやり方で新しく書き換えました。

$ runghc menu.hs

もう一度ソースの置き場所を・・・

https://github.com/index333/spcal2

なおリムやハブのデータはテストのための仮データです。



同じような画面構成の小さなプログラムを復数書かなければいけないとき、継承が恋しくなる。

一応テストはしてますが他のサイトでも検算して下さい。

http://spoke.gzmapss.com/

が使いやすいです。



後記:

しばらくたってから実際に使ってみると、復数開くウインドウの閉じ方に難があることがわかりました。
(^_^;)

実用上は問題ないのですが・・・
Guiのプログラムを復数立ち上げるというのは独立したスレッドを生むことになるので制御がむつかしいケースが生じます。

気になる場合は、

runghc mkRim.hs
runghc selector.hs
runghc selectRim.hs
runghc selectHub.hs
runghc spcal.hs

のようなスクリプトを作ります。

myPlayer

-- pipe.hs import System.Process import System.Environment main :: IO () a:_ IO [FilePath] randomize lst = do let c = length lst ...