2020年10月21日水曜日

JB23Wジムニー ヘッドカバーガスケット交換&結晶塗装

以前からオイル滲みが日に日に拡大していた愛車のジムニーですが、今回まとまった時間が取れたのでヘッドカバー(タペットカバー?)ガスケットの交換を行いました。

また、良い機会なので外したヘッドカバーの結晶塗装にもチャレンジしてみました。

~~~~

まずは交換前の状態です。

PCVバルブとフィラーキャップの周囲の滲みが目立ちます。プラグホール内へのオイル漏れは無いので、周囲のガスケットがヘタれているんだと思います。

↑PCVバルブ周辺

↑フィラー周辺1

↑フィラー周辺2

とりあえずヘッドカバーを取り外します。8mm 6本で止まっています。

カバー側にスラッジがこびりついていますが、エンジン側はまぁまぁ綺麗です。肝心のガスケットですが、硬化しているもののひび割れ等はありませんでした。

↑エンジン側はまぁまぁ綺麗

↑カバー側はスラッジがこびり付いている。中性洗剤と真鍮ブラシで簡単に落ちる。

外したヘッドカバーは、台所用洗剤とワイヤーブラシでゴシゴシ洗いました。良く乾かして水分を飛ばしたあと、パーツクリーナで脱脂しました。塗装前にネジ穴やガスケットの当たり面などをマスキングしておきます。



結晶塗料と焼付乾燥用のヒートガン、交換用ガスケットなどはまとめてAmazonで購入しました。


塗装は2回に分けて行いました。初回は表面が見えなくなる程度に薄く全体に吹きかけて少し放置します。表面が乾く前に2回目を塗ります。一気に垂れる程度まで塗りましたが、淵の部分に塗料が溜まって厚くなりすぎるため、垂れる直前でやめておいたほうが良さそうです。(乾燥後にブヨブヨした仕上がりになる)

また、塗装中に吹き出しノズルが2回ほど詰まってやや焦りました。塗装開始前に十分に缶を振っておくのに加えて、塗装中も手元にパーツクリーナを用意しておくと安心だと思います。

以下は乾燥前の状態です。かなりの厚塗りで垂れまくっているのがお分かりいただけるでしょうか(笑)

↑超厚塗り(垂れまくっています・・・)

↑BBQ用の網に載せましたが、網と接している部分に塗料が貯まるため、内部から浮かせて直接網に触れないようにしておいたほうが良さそうです。

塗装してから5~10分ほど置いてから120℃で予熱しておいた乾燥炉へ入れるのが推奨されていますが、自作の乾燥炉の能力を考慮してすぐに乾燥工程に入りました。

乾燥炉は、Amazonのダンボールに給排気の穴を開けてヒートガンのノズルを差し込んだだけの簡易的なものです。ヒートガンに温度調節機能が付いているため、熱電対の測定値を見ながら途中で調整を掛けます。箱の内部温度が120℃まで上昇したらそのまま120~130℃の温度を保ちながら25分ほど乾燥させました。


↑適当な小物でテスト中の様子。左上から突き出ている青色の線が熱電対の測温部。

↑120℃を維持するには十分な熱量があります。最高温度に設定すると160℃程度まで上昇します。(ダンボールが燃えないように注意)

↑内部で温風が旋回し、極力均一温度になることを期待して穴を開けた。

↑小物でテストした結果です。垂れない程度に薄めに塗布しましたが、丁度良い具合に縮れています。

↑小物の表面拡大

↑焼付乾燥後のヘッドカバー。上面は完璧な仕上がりですが、側面やエッジなどの塗料が溜まりやすい場所は凸凹した仕上がりとなっています。


焼付乾燥が終わり、一晩寝かせた後も塗膜が厚い部分が触るとブヨブヨ柔らかかったため、130℃で30分ほど追加で乾燥させました。


PCVバルブとシールも交換しておきました。シールはペンチで掴むと割れてしまう程度にカチカチに硬化していました。これだと漏れても仕方ないですね・・・。

↑カチカチに硬化したシールとオイル滲み

↑新しいシールとPCVバルブを組み込み。薄くサラダオイルを塗っておくとスムーズに取り付けられる。ホースも交換用に純正品を買ってみたが、長さが足らず取り付けできず・・・_| ̄|○ il||li

↑微妙に足りん。

その後、型番違いに気づき再発注しました。
JB23WJXCUD6(2005年式)のPCVホース品番は11193-83A00です。
短い方は11193-81AA0で、適合年式は1998/09-2002/01となっていました。


ヘッドカバーの取り付け前には、チェーンカバーとエンジン本体のつなぎ目部分と、カムシャフト付近の半月状のガスケット部分に液体ガスケットを塗布しておきます。



ジムニーに取り付けた様子です。ヘッドカバーを止めるボルトの締め付けトルクは11N・mらしいですが、ここまで小さいトルクに対応したトルクレンチを持っていないため手ルクレンチで締めました。4回程度に分けてじわじわ締め込みました。

インタークーラーを乗せると半分以上が隠れて見えなくなりますが、エンジンルーム内が鮮やかになってナカナカGoodです。とりあえずこれでしばらく乗ってオイル漏れがないか確認してみたいと思います。





今回、初めて結晶塗装にチャレンジしましたが、DIYの障壁となる乾燥炉もダンボールとヒートガンで十分に実用になることがわかりました。塗膜の厚みさえ均一に出せれば(少し難しいですが)素人でも十分に綺麗に仕上げることができそうです。機会があれば他のパーツでも試してみようと思います。


超参考にさせていただいた動画:

旧車屋さんが教えてくれた自宅で出来る『結晶塗装』 https://youtu.be/2aORS3yVGVI


以上。

交換部品 品番リスト:

・PCVバルブ:18118-78G50

・PCVバルブシール:11198-58B00

・PCVホース:11193-83A00

・ガスケット:大野ゴム SP-0015

作業実施日:2020/10/19-21 走行距離:99,451km


2020年7月23日木曜日

10MHz GPSDOの作製

ご無沙汰しております。金魚です。元気でやっています。

久々に実用的な電子工作(?)をやったので紹介したいと思います。今回は計測器の周波数基準器として使われるGPSDOを作製しました。
GPSDO(GPS Disciplined Oscillator)とは、GPS/GNSS測位時に得られる正確な1PPSパルスを用いて、内蔵した発振器の周波数を常時補正しながら動作する周波数基準器を指します。eBay, Aliexpressなどで探すと1万~2万円程度で完成品が購入できますが、ダブルオーブン式のOCXOを持っているので自作してみることにしました。

以前投稿した「OCXOの安定度測定」という記事で、PPS信号を使用してフリーラン状態のOCXOの周波数安定性を評価しました。1週間フリーランさせた場合に20mHz程度の変動がありそうだなーという結果が得られました。10MHzにおける20mHzというのは2ppbの誤差に相当します。温度補償水晶発振器(TCXO)の精度が1ppm程度なので、それに比べると正直十分すぎる精度なのですが、やはり限界を突き詰めたい・・・というロマン(沼)があるので、取り敢えず作ってみたという感じです。
なお、周波数基準器(他の測定器にも言えるが)の沼は深いので注意したほうが良いです。高精度な機器を手に入れると、その機器の精度が気になりはじめて更に高精度なものを・・さらにさらに高精度なものを・・・と、気づけば散財しがちです。究極を求めるのは楽しくて色々と学べることもあるので良いのですが、程々のところで妥協しておくのがコツです。幸いなことに、GPSモジュールから出力される1PPS信号は常時校正されているので、長期的な精度に関しては安心(諦め?)ができます。

さて、作製したGPSDOのざっくりした仕様は次のとおりです。
  • 出力周波数:10MHz±2mHz, ±0.2ppb
  • 出力数:3CH(CH間及び筐体アースとは絶縁)
  • 出力波形/レベル:正弦波/約240mVrms(50Ω終端時)
  • 内蔵発振器:TCO-6920N(EPSON TOYOCOM製)
  • 周波数測定分解能:±1mHz(測定時間1000sec)
  • 周波数制御分解能:約0.2mHz(DAC分解能とOCXO感度より算出)
  • 電源:AC100V / 約8W(OCXOオーブン温度安定後)
  • UI:16x2行キャラクタLCD、LED3灯(LOCK、1PPS、アラーム)、ロータリエンコーダ
  • 通信I/F:USB接続(UART通信、筐体アースとは絶縁)
  • 主要機能:周波数測定結果表示、DACレジスタ値表示・設定、GPS衛星捕捉状態表示、NMEAデータ出力、日時・周波数・内部温度ログデータ出力、PPSサウンド出力他


【完成写真】
先に完成写真と動作の様子を載せておきます。文字のレタリングを手抜きしているのがバレバレですが、売り物ではないのでヨシとします(笑)

普段はファンクションジェネレータの上に乗っけて通電状態にしています。
LCDの表示内容は左上から順に、現在の周波数、ゲート時間(10sec単位)、UTC時刻、位置特定品質、使用衛星数です。ロータリエンコーダにはプッシュスイッチが内蔵されており、押すごとに表示内容および設定項目が変わります。

背面です。白色マーカが活躍。



【作製の様子】
(以下、写真だらけの見づらい内容ですがご了承ください・・・)
①筐体検討
まずは主要な大柄部品を並べて、筐体サイズの検討から行います。
少し窮屈ですが、タカチのアルミケースYM-180に収まりそうな感じなので、これで行くことにします。
YM-180の底面サイズにダンボールを切り抜き・・・

部品を乗せてみる。なんとか収まりそう。

②パネルデザイン・部品配置検討
ケースや足りない部材やらを秋月で発注して、パネルデザイン・部品配置の検討に入ります。BNCコネクタやLCD、ACインレットなどは内部の部品と干渉しがちなので、実際のケースを手にとって確認しておくと安心です。なお、この段階ではロータリエンコーダではなくボタン3つを使用する予定でしたが、良さげなパネル取り付けのボタンが見つからずに途中でロータリエンコーダに変更しました。また、USB-UARTの取り付けを考慮できておらず、後々基板をカットすることになります・・・。
配置がおおよそ決まったら、CADツールに入力し、実寸サイズで印刷しておくと後の加工で役に立ちます。
部品同士が干渉しないように注意

背面加工図(USB-UARTが抜けてる)

前面加工図

③ケース加工
ケースに実寸サイズで印刷した図面を糊付けし、穴あけなどをやっていきます。
ハンドニブラを持っていないので、角穴はドリル + ヤスリで仕上げていきます。
オートセンターポンチ(SK11製AP-10)を購入したので使ってみましたが、最弱の設定でもパワーが有りすぎてケースが歪みました。柔らかいアルミケースにはもう少し優しいポンチを使うべきでした。
このような工作において、ケース加工が一番面倒ですね。特に表面パネルは失敗すると目立つので気を使うし、思った通りの寸法で仕上がらなくて部品が収まらなかったり・・・単に自分がヘタクソなだけなんですが、3Dプリンタをうまく活用して楽したいところでもあります。
オートセンターポンチが強すぎた・・・

角穴はドリルで輪郭を穴あけ→ニッパーでつなげてヤスリで仕上げる

良い感じに加工できた

④回路設計・部品実装・配線作業
やっとThe 電子工作という感じのフェーズに入ります。
今回は、制御MCUとして使い慣れているAVRマイコンを使用しました。アナログ回路についてはよく分かっていないので、雰囲気+LTspiceを活用して設計していきます。OCXOの制御端子に与える電圧精度・安定性が出力周波数精度にもろに影響するため、GNDのとり方や基準電圧IC、分圧抵抗には気を使います。
参考までに回路図を添付しておきます。動作の保証はありませんので、真似される際にはご注意願います。
回路図

処理部基板

出力バッファ基板(この上に処理部基板がスタックされる)

クリティカルなVC生成部は、OCXO基板の裏側に実装しました。少々雑な仕上がりですが、OCXOのGND端子直近にベタGNDを確保できるため、配線抵抗による誤差要因を排除でき安定動作が期待できます。

絶縁ヨシ!

配線完了後の様子

⑤ソフトウェア実装
次は楽しいソフトウェアの実装です。
ドライバ層からコーディングしていき、マイコンのペリフェラルが意図通りに動作すること、周辺部品(LCD、I2C-DAC、I2C温度センサ、スイッチ、LED類)が動作することを確認していきます。
Timer1のインプットキャプチャのトリガを1PPS信号にしておくと、ソフトウェアの遅延やデッドタイムなしに周波数計測が可能となります。
なお、10MHz信号を直接AVRでカウントする際には注意点があります。Timer1のカウンタクロック入力は、AVRの動作クロックで同期化(2段D-FF)されているため、AVRの動作周波数を20MHz以上にしないと取りこぼしが発生し正しい計測ができません。推奨としてはカウンタクロック * 2.5倍以上とされているため、今回は25MHzでAVRを動作させています。
最大動作周波数20MHzに対して25%ほどオーバークロックしていることになりますが、この程度なら問題なく動作します(といっても定格範囲外なので、半導体プロセスのばらつきによりFmaxが低い個体にあたった場合はオーバークロック耐性が劣る場合もあるかと思います。使用する石で必要なペリフェラル機能が動作することを確認の上採用ください。過去の実験では30MHz程度までなら問題なく動作していました。趣味の世界なので動きゃOKですが、量産品ではもちろんNGです(笑))
肝心なOCXOの周波数制御ですが、ゲートタイム1000secで周波数測定を行い、10MHz±1mHz以上の誤差が生じた場合は、DACレジスタを1LSBずつ調整する動作となっています。この方式では、目標周波数に到達するまでにかなりの時間がかかりますが、予め調整用VRで目標値付近に追い込んだあとに、DACレジスタ初期値を適切に与えてやればすぐに収束します。
LOCK表示灯は、10MHz±2mHz以内の場合に点灯するようにしています。ALM表示灯は、PPS信号が出力されない or 衛星補足数が3基未満の場合に点灯します。ソフトウェア機能については追加・改善の余地ありです・・・。
ソースコードは以下で公開しています。

マイコンリソースの割り当て状況。

基準電圧IC + I2C-DACの動作確認

DACレジスタを1LSBづつ変化させたときのVC電圧変化
200μVステップ(≒0.2mHz)で周波数制御できる

⑥完成&評価
以上で作製は完了です。USB-UART経由でログが出力されるので、約3日間の周波数変動を取得してみました。エアコンの風がもろに当たる環境なので、外出・帰宅時に内部温度が10℃以上急変する場面がありますが、出力周波数は±2mHz以内の変動に収まっています。想像していた以上に安定しているようです。(周波数カウント処理で±1mHzのカウント誤差が生じるため、厳密には±3mHzと考えるべきかな?)
これからも継続的にログを取得し、1年を通してどのような変化があるのか観察していきたいと思います。
10MHz 3CH出力波形(終端開放時)

約3日間の動作ログ



【まとめ】
GPSDOの自作にあたって、VC生成部の温度特性に悩まされて基準電圧ICをTL431からREF192Fに変更したり、簡易恒温槽で評価したりと色々試しましたが、最終的にはそこそこ高精度な物に仕上げることができました。適当に作った割に周波数が安定しているのは、EPSON TOYOCOM製のTCO-6920Nが優秀なおかげと思います・・・。回路やソフトはまだまだ改善の余地があると思いますが、現状の機能・性能で取り敢えずは満足しているので、追々Updateしていく予定です。面白いネタがあれば投稿します。
1PPSが出力できるGPSモジュールも、Aliexpressで600円程度で購入できるようになりました。これで常時校正された10E-13程度(1PPS信号の短期精度は、大気中の伝播経路の状態変化やモジュール内部クロックに依存する揺らぎが存在するため、長期平均化が必要)のタイミングが手に入るわけですから、GPS衛星とそれを支える技術には感謝しかありません。今回のように周波数基準器として使うなり、時計にするなり、多拠点で精密にタイミング同期を取るなり、速度計を作るなり、インテリアとして飾るなり・・・応用は無限大です。
また、GPS衛星から送られてくる電波(L1信号:1575.4MHz)は波長が短く、アンテナも小型に作ることができます。右旋円偏波のため、通常のダイポールアンテナではなく、QFHアンテナが適しています。付属のパッチアンテナに飽きたらアンテナ自作にチャレンジしてみるのもアリです。なかなか思うような特性にならずイライラ(?)しますが、高度約2万kmの衛星から送られてくるGPS電波に思いを馳せながら針金細工をするのも良いものです。

試作した1575.4MHz用QFHアンテナ

自作のQFHアンテナで受信を試みている様子


【参考資料】

2019年10月20日日曜日

IOEのFast Input/Output Registerを活用しよう

MAX10 FPGAの評価ボード(EK-10M50F484)を用いて、HDMI信号を出力する際に数日間嵌まったので忘れないようにここに書いておく。

■嵌まった内容
FPGAボード上に搭載されているHDMIトランスミッタPHY(アナデバADV7513。以下PHYと呼ぶ)から、Full-HD 60fpsの信号を出力している際に、稀に同期信号が外れて映像が乱れる or 映らなくなる現象が発生した。FPGA内部のビデオ信号/同期信号以外のモジュールを修正した場合や、ドライヤーでFPGAパッケージ温度を上昇させることでも現象が発生することもあり、非常に悩まされた。
発生当初、タイミング系のトラブルだろうな・・・?とは予想していたが、Fmax値は満足しており、タイミング制約の書き方が誤っているのではないだろうか??と疑いを掛けて何度もSDCファイルを書き換えては再合成を繰り返していた。
SDCファイルを何度か書き換えて試行錯誤していると、一時期安定動作することもあったが、周辺回路を追加していくことで映像が乱れる現象が再発し、ますますワケガワカラナイ状態だった・・・。

■PHY < = > FPGA間の信号観測(失敗)
映像が乱れる原因として、PHYのタイミング制約を満たしていないのでは・・・?という疑問が湧いてきた。
気になったので、オシロスコープで信号を見てみることにした。
以下の画像が測定した波形だ。
オシロでPHY信号を測定(CH1:CLK / CH2:Video Data)

う~む・・・分からん。
オシロの水平軸は目一杯拡大しているが、5ns/divが限界。また、このオシロのアナログ帯域は100MHz、サンプリング速度は500MS/s(2ch時)である。観測したい信号のクロック周波数はFull-HD 60fpsのピクセルクロック ≒ 150MHzなので、帯域/サンプリング速度ともに不足している。また、PHY信号線にプローブを接続すると、プローブの入力容量により信号が劣化し、全く映像が出なくなってしまった。
手持ちの測定器による評価は無理だと分かった。。😨

参考までに使用したプローブのスペックを以下に示す。RIGOLのRP2200というパッシブプローブだ。
RP2200のスペック

x10で使用したときの帯域は150MHz、上昇時間2.3ns、入力容量は標準で17pFだ。
プローブを接続することで映像が出なくなった原因は、プローブの入力容量による信号レベルの低下や歪が考えられる。17pFの容量は、150MHz信号に対して約62Ωのインピーダンスとなり、ドライブする側(FPGA)の負担となる。

■Quartus Timing Analyzerでの解析
オシロスコープによるタイミング測定が失敗に終わったので、Quartus Primeに付属のTiming Analyzerを使用してPHYの駆動タイミングを検証してみた。
Quartus上のTools => Timing Analyzer => Custom Reports => Report Path...
で対象の信号を選択する。

Report Pathボタンを押すと内部レジスタからポートまでの遅延時間が解析される。
内部レジスタからポートまでの遅延時間解析結果

ここで解析された時間をブロック図に書き込んだのが以下の図になる。
FPGAとPHYの接続と遅延時間の関係

PHYのビデオデータセットアップタイム(min)は1.8ns、ホールドタイム(min)は1.3nsとなっている。FPGAからPHYまでの配線は、目視によるボード確認でミアンダ配線となっており等長と予想される。PWB上のCLKとデータの伝搬遅延がほぼ同じになれば、CLKを基準としてデータをサンプリングするPHYにとっては配線長を考慮する必要が無くなる。そうなると、CLKの遅延時間4.584nsに対して最も近いDE(Data Enable)の遅延時間5.407nsの両者でホールドタイムが満たせていないことになる。
 セットアップタイムは 6.666 - (5.407 - 4.584) = 5.843ns (min 1.8ns OK)
 ホールドタイムは 5.407 - 4.584 = 0.823ns (min 1.3ns NG)
と計算できる。
セットアップタイム/ホールドタイムの計算

SDCファイルを何度か書き換えて試行錯誤していると稀に上手く動いていたのは、たまたま出力レジスタとポート間の遅延時間がこれらセットアップ/ホールドタイムの制約を満たす位置に配置されたためと想定される。CLKはFFを介さずに出力ポートへ接続されるため、何度かコンパイルを行っても同じ遅延時間(4.584ns)となっていた。

FPGAに回路を追加したり、SDCファイルを少し変えただけで信号遅延時間がコロコロ変わるのは非常に扱いづらい。そこで、本題のIOEに内蔵されたレジスタが活躍する。これはFPGAの各I/Oピンの直近に固定配置されたレジスタで、出力用/入力用/OutputEnable制御用の3つがある。今回はOutput Registerを使用する。
MAX10 IOEの構造図

IOEのOutput Registerの使い方はとっても簡単だ。
・・・とその前に、Output Registerを使用するためには、最終段のFFからFPGAの出力ポートの間に組み合わせ回路を入れてはならないという制約事項がある。上のブロック図からも明白なように、Output Registerから出力ポートまでに組み合わせ回路を入れられる構造を持たないからだ。また、この制約のおかげで遅延時間が最小かつ固定にできているとも言える。
今回、PHYへの信号はすべてFF出しとなっているため、この制約をクリアする。
PHY制御信号生成部のRTL Viewer抜粋

まず、プロジェクトの解析と論理合成フェーズまでを完了しておく。
次にQuartusツールバーのAssignments => Assignments Editorを起動する。
Toの<<new>>を選択し、Node FinderからOutput Registerを使用したいポート名を入れて検索する。
Node Finderで対象の信号を追加

信号を右側のNodes Foundに追加したあと、OKを押すと以下のようにAssignments Editorに追加される。
Assignments Editorに追加された様子

次に、黄色くなっているAssignment Nameに”Fast Output Register"を選択し、Valueを"on"にする。一行設定できれば、複数の行を選択してCtrl + C, Ctrl + Vで一括で設定できる。設定が完了すると、Status欄にチェックマークがつく。
Status欄にチェックが付けばOKだ

ここまでできたら、フルコンパイルを実行して、制約内容を配置配線に反映させる。
以上でIOEのOutput Registerを使用する設定は完了だ。
なお、今回は出力ポートを指定したが、RTLのレジスタ名を指定して制約を掛けることもできる。

コンパイルが完了したら、再びTiming Analyzerを起動して、遅延時間を確認してみよう。OutputRegisterに割り当てられたことで、CLKを除く各信号の遅延時間が2.345~2.386nsに収まっている。出力ポートまでの遅延時間が短くなっていることに加えて、信号間のばらつきが小さくなっていることにも注目したい。(From:6.662 - 5.407 = 1.255ns、To:2.386 - 2.345 = 0.041ns)
内部レジスタからポートまでの遅延時間解析結果(Output Register使用後)

FPGAから出力されるバス信号の出力遅延が揃うことで、タイミングマージンを確保しやすくなり、等長配線の効果も発揮される。

ここで再びPHYのタイミング制約を満たしているか確認してみよう。
クロックのほうがデータよりも遅延時間が長くなったため、以下のように算出できる。
 セットアップタイムは 4.584 - 2.386 = 2.198ns (min 1.8ns OK)
 ホールドタイムは 6.666 - 2.198 = 4.468ns (min 1.3ns OK)
今度はホールドタイムのほうがマージンが大きい結果となった。
セットアップタイム/ホールドタイムの計算

これで、PHYのタイミング制約を満たすことができた。実際の評価ボードでも、安定した映像出力を確認できた。

更にマージンを確保するためには、位相差を微調整した2出力のPLLクロックにて、CLK信号とデータ信号を生成する方法が考えられる。今回は使用しなかったが、今後タイミング関連で嵌ったときには試してみたい。

それでは楽しいFPGAライフを!

■参考資料
https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/hb/max-10/ug_m10_gpio_j.pdf
https://timetoexplore.net/blog/video-timings-vga-720p-1080p
https://www.analog.com/jp/products/adv7513.html