チラシの裏は意外と白くない

最近忘れっぽくなったので調べたことをチラシの裏に書きます

MTBの油圧ブレーキ化⑤

今日は少ししか時間が取れなかったので、少しだけ作業を進めた。

この前カットしたブレーキホースの端面にコネクターインサートとオリーブの取り付け。オリーブとコネクターインサートの取り付け順はどちらでも良いと書いてあったが、インサートを圧入することでホースの外径変化があるかもしれないので、念のためにオリーブを通しておく。抵抗なく入っていく。つづいてインサートの圧入…なのだが前ブレーキ側はすんなり入ってしまった。さすがに最後の方はキツかったものの、それでも手で押し込めるくらい。一方のリア側は最初から素手では厳しい感じ。ハンマーで打ち込んでもなかなか入っていかないので、ブレーキホース固定治具を使ってハンマーで衝撃を与えて圧入完了。フロント側の抵抗のなさが心配だ…

次にオリーブの位置決め。ホース端から5mmくらいの場所にセット、ということだがちょっと力を入れたらオリーブの位置も動いてしまう。まあ、オリーブはブレーキ本体と固定ボルトに挟まれて位置が決まるはずだから、この時点で多少緩くてもきっと大丈夫と信じる。

f:id:samurai375:20200928224949j:plain

最後にオリーブの外側と固定ボルトにグリスを塗って、ボルトを締めていく。推奨締め付けトルクが5−8Nということでボルトの大きさに対して結構なトルクをかける必要がある。端面から14mmの位置に印をつけて、それが隠れるくらいまで…というのはボルト固定前の話。ホースが奥までしっかり刺さっているかを確認する目安なだけで、大した意味はなかった。フロント側のインサートの抵抗のなさが気になるが、最悪そこで漏れてもオリーブと固定ボルトで蓋されるといいな。最後にキャップをつけて、ホースの工作は終了。

f:id:samurai375:20200928225327j:plain

ボルトにかじった跡があるが、ブリーディングキットに付属の薄いスパナを使って見たときについたもの。やはりしっかりしたスパナを用意しておいて正解だった。600円だけど。あと、ここはカバーで隠れるので、多少傷がついててもセーフ。

次回、いよいよブリーディングを行う。

MTBの油圧ブレーキ化④

早速、ブレーキの交換に。まずは既存の機械式の取り外しと、ブレーキ・シフトワイヤーの切断。新旧のSTIレバー比較。仕上げを含めてほぼ同じ。 f:id:samurai375:20200926231540j:plain

f:id:samurai375:20200926231527j:plain トップチューブ下を各種ワイヤーが走っていて、ドライブトレイン側から順番にリアシフトワイヤー、フロントシフトワイヤー、リアブレーキワイヤー。このうちリアブレーキワイヤーは油圧にするため総入れ替え。シフトは…まあアウターはそのままで良いかな。もったいないし。

とりあえずどんなもんかリザバータンクを外してみた。ここはプラスドライバー。 f:id:samurai375:20200926232216j:plain f:id:samurai375:20200926232216j:plain f:id:samurai375:20200926232311j:plain リザバータンクの蓋は、プラの蓋とゴム製のフルードを押し出すための部品でできている。後者の部品が結構なフルードを押し除けてくれそうなので、蓋取り付け時の空気の混入(エア噛みというらしい)は避けられそうだ。

ブレーキをフレームに仮止め。フロントはポストマウントタイプ、リアはインターナショナルスタンダードタイプ(アダプタを噛ませる)。リアブレーキは付属の取り付けボルトをつけたら、 f:id:samurai375:20200926232922j:plain こんな感じで、アダプタを貫通してブレーキロータに干渉してしまった。仕方ないのでもともと付いていたAvid機械式の取り付けネジに変更。結構長さがちがう。 f:id:samurai375:20200926232905j:plain

フロントは純正のボルトで問題なく固定完了。

f:id:samurai375:20200926232551j:plain ブリードニップルにチューブとプラ瓶を接続。プラ瓶にはその辺に引っ掛けるためのフックが付属していて良い感じ。チューブの内径も絶妙で、ブリードニップルにしっかりとくっつく。とりあえずレバーを握ってみたり、いろいろしてある程度フルードを除去。リザバータンクでは透明に見えたけど、こうしてチューブ越しに見ると少し黄色い。Avidのオイルが何色かわからないが、シマノはピンク色なのでフルードの入れ替えができたかどうかの判断は簡単そうだ。

そして仮止めしたら、予想通りブレーキホースがめちゃくちゃ余る。どう考えても邪魔。ここは腹を括ってブレーキホースを切ることに。レバー側とブレーキ側のどちらを切り詰めるか悩ましいが、失敗してもカバーで隠れるのでレバー側をカット。ジャグワイヤーのホースカッターはいい感じ。確かに空中でホースを普通のカッターで垂直に切るのは難しいかも。ホース長なんて現物合わせしながら微調整したいので、買ってよかった。そこそこにホース長を追い込み、養生テープで仮止めして本日の作業は終了。

f:id:samurai375:20200926234647j:plain

カットしたホースの構成はこんな感じ。ブレーキホースの固定ボルトは再利用、オリーブとインサートは再利用不可のため廃棄かな。

f:id:samurai375:20200926234300j:plainf:id:samurai375:20200926234312j:plain

緑色の養生テープがビアンキのチェレステに同化している。そういえばブレーキホースを固定するスモールパーツを買い忘れたけど、当面これで良いか。。

次回はオリーブとインサートの打ち込み、そしてブリーディングへ。

MTBの油圧ブレーキ化③

雨の週末なのでできるだけ進めてしまう。

とりあえずいろいろググってアマゾンで調達。

f:id:samurai375:20200926225123j:plain

  • ブリーディングキット(左上)

シマノ純正を買いたかったが、6,000円くらいしたのとレビューで不要なものがあったり足りないものがあるという話だったので、2,000円くらいの怪しげなものを購入。もしこれで事足りたらラッキーくらいな気持ちで。 使いそうなところで、ブリードニップルに差し込むホース、廃棄するフルードをためるプラ瓶、ビニール手袋、7/8mmのレンチ、ブレーキスペーサ、ブレーキホースをバイスに固定するための治具

シマノ純正の500ml。どれくらい使うかわからないけど、とりあえず500mlにしておいた。ほとんどMTBに乗らないだろうから、これを消費するのに何閏年かかるのか。1,700円くらい?

  • レンチセット(右上)

ブリードニップルは結構なトルクで閉める必要があるため、それなりの工具も買っておいた。結果正解。意外と7mmレンチというのはないものだ。中国製で600円くらい。

  • ブレーキホースをバイスに固定するための治具(左下)

シマノ純正。400円くらいかな。ブリーディングキットに含まれていたので、これは不要だったかもしれない。

  • オリーブ・コネクティングインサート(下中)

中国製で10セットで1,000円。純正は1セット400円くらい。使えたらラッキー。

  • ホースカッター(右下)

ブレーキホースを垂直に切るための工具。普通のカッターで良いかと思っていたけど、意外と難しいということでジャグワイヤー製のものを購入。シマノのものは非常に高く、7000円くらい。これは1,500円くらいだったかな。

とりあえずこれでいってみる。

MTBの油圧ブレーキ化②

前回で主要部品の構造はなんとなく理解できた。次にブレーキホースの構造を見ていく。

部品の構造理解:ブレーキホース

機械式の場合、極論切断面は切りっぱなしでも問題ない。ワイヤーの摩擦抑制のためにできるだけ垂直に切るとか、インナーチューブを千枚通しで広げてやるとか、せいぜいその程度。 一方、油圧の場合はホース内部にフルードが充填されるわけで、端面が荒れていたらそこからフルードが漏れてくることは容易に想像がつく。ということで今回使用するBH59の説明書を確認。

f:id:samurai375:20200926112229p:plain

上手の通り、端面を90度に切り落として、コネクタインサートなる部品を圧入する。一方、ブレーキホースの方にはオリーブと呼ばれるリングを通して、さらにその上からコネクティングボルトを通す。コネクティングボルトをブレーキレバーもしくはブレーキ本体に締め付けていくとオリーブが潰され、コネクティングボルトとブレーキホースの隙間が埋まると、そんな理屈らしい。 コネクタインサート・オリーブ・コネクティングボルトのセットはレバー・ブレーキ両方共通で、レバー側にはさらにその上からカバーをかぶせる構造になっている。

この部分は現物でも確認することができる。カバーは特にねじ込み式ではなく、引っ張ってやれば外れる。

f:id:samurai375:20200926112117j:plain

ブレーキホースを切るとき、レバー側とブレーキ側どちらを切ったほうが横着できるかと思って調べたが、どちらも同じ手間だということがわかった。残念。

ブレーキホースの調整についても気をつけるべき点がありそうだ。以下の図によると、ブレーキホース端面から14mmはレバー・ブレーキに埋没することになるらしい。

f:id:samurai375:20200926112530p:plain

また、オリーブは端面から5mmの位置に取り付けろとのこと。

f:id:samurai375:20200926112722p:plain

ということで、ブレーキホースは最低でも5mm+オリーブの厚み分はカットしないといけない。もしインサートがとても長くてオリーブの厚み+5mmを超えるようならインサートがボトルネックになる。まあ、そのくらいは許容範囲か。

ということで、各部品の確認は一通りここまで。次回、いよいよ必要な部品の情報収集に入る。

MTBの油圧ブレーキ化①

手持ちのマウンテンバイクを油圧化するためのメモ書き。

 

最近全く乗る機会がなかったが、来月に活躍する可能性が出てきたので、以前断念した油圧ブレーキ化を再検討。今の機械式で埼玉の山を走ったところ、フルブレーキでも止まれず結構怖い思いをしたので、今度こそ油圧化を。

 

元々の機械式が今はディスコンシマノ黒歴史?などと言われているSTIタイプ。個人的には使いやすくて、復活してくれないかと思っている。ちょうどヤフオクで同じSTIの油圧ブレーキセットを入手したので、これを組み込む予定。

 

各種型番と状況

型番は以下の通り。Deore LXという、いまやどのグレードに属するのかわからないグレード。変速は3x9s。いまやフロントシングルが主流なので、時代を感じる。

STIレバー ST-M585

ブレーキ本体 BR-M585

ブレーキホース SM-BH59(フロント0900、リア1400)

 

さて、購入したセットだがありがたいのかありがたくないのか、すでにレバー、ブレーキ、ホースがセットアップ済みで、ブリーディングも済みのもの。フロント900mm、リア1400mmで取り回しができればそのまま使えることになってはいるが、おそらくミネラルオイルが劣化していたりなんだりで、そのままというわけにはいかないだろう。何よりこのセット、なぜか左前のセッティングになっている。すなわち左レバー側にフロントブレーキ(900mm)、右レバー側にリアブレーキ(1400mm)が接続されている。悩ましい。

 

部品の構造理解:STIレバー

とにかく油圧ブレーキ、というかディスクブレーキ自体の構造をいまいち理解できていないので、まずは各部品の構造を確認しておく。

 

f:id:samurai375:20200920234120j:plain

これがブレーキ本体。今見るとシルバーの塗装が安っぽい。このでかいユニットがシフターになっていて、奥のブレーキレバーは引くとブレーキ動作、上下に動かせばシフト動作を実現している。シフターユニットがブレーキレバー側についているため、なんとももっさりしている。が、この部分は以前の機械式と同じ。右のMINERAL OILと書かれた黒い部分が、リザバータンク。ここからミネラルオイルを注入する。

そう、マニュアルによるとここから。今の油圧システムは後述するブレーキ、つまり下から重力に逆らってオイルを注入する。重力に抗うため注射器を使用する。レバー側は、余ったオイルを受け、かつ蓋の役割を果たす漏斗がセッティングされる。

ところがこのモデルの場合は真逆。上から下にオイルを注入していく。注射器は不要だが、以下の点に注意しないといけないらしい。

  • ブレーキレバーを水平にし、リザバータンクの水平を保つ
  • ブレーキユニットを外してホースとブレーキユニットを鉛直方向に垂らす=自転車本体を高い位置に置いておく必要がある。。
  • ブリーディング後、気泡が入らないようにリザバータンクをオイルで満たし、オイルを溢れさせながらリザバータンクの蓋をする

特に2,3が厄介だ。マニュアルによると以下。

f:id:samurai375:20200920235916j:plain

ハンドルの垂直高より、ホースの方が長いから当然、高いところに自転車をおかないと鉛直に垂らすことができない。めんどくさい。

 

f:id:samurai375:20200921000007j:plain

2コマ目でオイルが溢れている。こんな上品に少量だけ溢れれば良いが、大量に溢れてオイルがブレーキパッドに付着しようものならブレーキパッド買いなおしになってしまう。しかし後述する理由でパッドは新たに買わねばならないかもしれない。

 

部品の構造理解:ブレーキ本体

続いてブレーキ本体。ブレーキを取り付けるための台座には2種類あって、インターナショナルスタンダードマウント方式とポストタイプマウント方式というらしい。

f:id:samurai375:20200921000118j:plain

基本的にブレーキユニット本体はポストタイプ用にネジが切ってあって、インターナショナルタイプを使用する場合は、アダプタを噛ませるようだ。今回の部品もそのような構成になっている。

f:id:samurai375:20200920235145j:plain

黒いコの字型の部品がアダプタ。

オレンジ色の部品はパッドのクリアランスを保つための部品。どうやら油圧システムというのは、パッドの間に何もない状態でブレーキを握ろうものなら、パッド同士がくっついた状態で固まってしまい、元に戻すためには専用工具でこじ開けたりとなんだか大変なことになるらしい。というので、それを防ぐためのスペーサー。

 

f:id:samurai375:20200921000736j:plain

続いて90度回転させた図。

上下真ん中のねじ山だけが見えているネジはポストタイプのフレームやアダプタを固定するためのネジ。

中央のオレンジ色は先ほどのパッドスペーサ。

その両脇の灰色の部品がブレーキパッドで、レジンタイプのものがセットされている。静動力はメタルパッド>レジンパッドとのこと。型番はレジンパッドがM07-S、メタルパッドがM06。いまだに手に入るのかは…不明。

パッドやX字のスプリング?の下側に丸い穴が開いている。ここにピンを挿入して、脱落防止をするらしい。が、このピンが同梱されていない。というので、未使用ながら早速パッドを買わないといけないかもしれない。

最後に多分最も重要なオイル周りの話。右上にブレーキホースが接続されている。六角の部品がブレーキホース固定ボルトで8mmのレンチで固定する。実はブレーキホース側の端面にもいろいろあるらしいのだが、これは次回確認する。

左側にあるのはブリードニップルで、7mmレンチを使用する。

 

先ほど、ブレーキレバー側からオイルを入れていくという話をしたが、最終的にここからオイルが出てくるらしい。いまブリーディング済みのため、ここのニップルを緩めると劣化しているであろうオイルがどんどん出てくるはず。で、それをチューブの先にセットしたビニール袋で受けるらしい。オイルの重さに負けてチューブから袋が脱落するか、ブリードニップルからチューブが抜けて、とにかく床がオイルまみれになる未来しか見えない。

f:id:samurai375:20200921001739j:plain

 

というわけで最新の油圧システムをyoutubeで予習した上で旧世代製品をながめるとなかなかセットアップに苦戦しそうな印象をうける。次回、ブレーキホースのマニュアルから端面処理がどうなっているかを確認していく。実物はすでにSTIとブレーキユニットに接続されているので、実際にどうなっているかはオイルを抜かないことには確認することができない。まずは机上でどうなっているかを見ていこう。

クラスに関して④:仮想関数のメリットとおもわれること

昨日、仮想関数のありがたみがよくわからないという話を書いた。

  1. 親クラスでvirtual void sing()とvoid fly()を用意
  2. 親クラス型のポインタを宣言
  3. 親クラス型のポインタに子クラスをインスタンス
  4. sing()は子クラスのsing()が呼ばれるが、fly()は親クラスのfly()が呼ばれてしまう

じゃあ最初から素直に子クラス型のポインタを宣言して、インスタンスすればいいじゃないか、という内容。実際そうすればうまくいく。

ちょっと例を変えて、main.cppに以下の関数を追加。

void waiting(CBird* bird){
    bird->sing();
}

void throwing(CBird* bird){
    bird->fly();
}

何だかわからないけどとにかくbirdクラスを受け取ったら、それを鳴かせる関数と飛ばせる関数を定義した。 main分で以下の3パターンの動作を確認。

Bird型ポインタにBirdコンストラク

    CBird* b0;
    b0 = new CBird();

    waiting(b0);
    throwing(b0);

結果は

Birds sing
Birds fly

これはOK

Bird型ポインタにCrowコンストラク

    CBird* b1;
    b1 = new CCrow();

    waiting(b1);
    throwing(b1);

結果は

caw caw
Birds fly

これも前回と同じ結果。

Crow型ポインタにCrowコンストラク

    CCrow* b2;
    b2 = new CCrow();
    
    waiting(b2);
    throwing(b2);

結果は

caw caw
Birds fly

昨日の例ではfly()で"clow flies"となっていたのに、"Birds fly"になってしまった。当然だが、throwing関数の引数をCCrow型ポインタにしてやれば"clow flies"になる。

というわけで

BirdとCrowのようにクラスの中身(メンバ関数とかメンバ変数とか)が全く同じで、そのポインタを親クラスへのポインタと解釈する場合において、仮想関数が威力を発揮するらしい。 今回の例だと箱の中に入った鳥の種類を識別するために、鳴くまで待ってみて「カーカー」鳴いたからこれはカラスだな、みたいなことをやろうとすると仮想関数を使わざるを得ない…ということでとりあえず理解しておく。

クラスに関して③:仮想関数と完全仮想関数

たまに関数の頭にvirtualがついているのを見かけるので、それの内容。

仮想関数

cpp-lang.sevendays-study.com

を参考にちょっと変更したコードを作成。

bird.h

#ifndef __BIRD_H__
#define __BIRD_H__

#include <iostream>
#include <string>

using namespace std;

class CBird{
    public:
        virtual void sing(){ cout << "Birds sing" << endl; }
        void fly(){ cout << "Birds fly" << endl; }
};

#endif // __BIRD_H__

crow.h

#ifndef __CROW_H__
#define __CROW_H__

#include "bird.h"

class CCrow : public CBird{
    public:
        void sing(){ cout <<  "caw caw" <<endl; }
        void fly(){ cout << "Crow flies" << endl; }
};

#endif // __CROW_H__

main.cpp

#include <iostream>
#include <string>
#include "bird.h"
#include "crow.h"

using namespace std;

int main(){
    CBird* b0;
    b0 = new CBird();

    b0->sing();
    b0->fly();

    CBird* b1;
    b1 = new CCrow();

    b1->sing();
    b1->fly();

    CCrow* b2;
    b2 = new CCrow();
    
    b2->sing();
    b2->fly();

    return 0;
}

birdクラスでsing()とfly()という2種類のメンバ関数を宣言。うちsingはvirtualをつけた仮想関数。 crowクラスはbirdクラスを継承してsing(),fly()の中身を変えている。 mainでは

  1. birdクラスへのポインタとしてb0を宣言して、CBird()コンストラクタを使用
  2. birdクラスへのポインタとしてb1を宣言して、CCrow()コンストラクタを使用
  3. crowクラスへのポインタとしてb1を宣言して、CCrow()コンストラクタを使用

結果は、

$ ./a.out
Birds sing
Birds fly
caw caw
Birds fly
caw caw
Crow flies
  1. birdクラスのsing(),fly()が呼ばれる(自明)
  2. crowクラスのsing()とbirdクラスのfly()が呼ばれる
  3. crowクラスのsing()とfly()が呼ばれる(自明)

ということで、2番目のケースにおいて、virtualをつけて仮想関数としたsingは子クラスのcrowクラスのものが呼ばれ、普通の関数のfly()はbirdクラスのものが呼ばれている。 あえて親クラスのポインタを子クラスのコンストラクタでインスタンスする理由がよくわからないが…

完全仮想関数

bird.hを以下のように変更。

//        virtual void sing(){ cout << "Birds sing" << endl; }
        virtual void sing() = 0;
        void fly(){ cout << "Birds fly" << endl; }

これによって、sing()は完全仮想関数というものになる。 コンパイルすると、

$ g++ main.cpp
main.cpp: In function ‘int main()’:
main.cpp:10:20: error: cannot allocate an object of abstract type ‘CBird’
     b0 = new CBird();
                    ^
In file included from main.cpp:3:0:
bird.h:9:7: note:   because the following virtual functions are pure within ‘CBird’:
 class CBird{
       ^
bird.h:12:22: note:     virtual void CBird::sing()
         virtual void sing() = 0;
                      ^

のようにbirdクラスのコンストラクタを呼び出すところで怒られる。 完全仮想関数を1つでもメンバとして持つクラスは抽象クラスといって、抽象クラスのインスタンスはできない。