火入れの夜 ── 6軸ボードの一軸目が動くまでに、七つの嘘を剥がした話
JLCPCBから届いたTMC5240 6軸モーションボードの一軸目を動かすまでの実録。電流制限に張り付く電源、逆に見えた子基板、全部0x00のSPI、励磁しないモータ、動かない音楽——原因は設計でも配線でもなく、そのほとんどが「測る側・操作する側」にあった。ブリングアップとは、機械の嘘ではなく自分の嘘を一枚ずつ剥がす作業だという記録。
設計した基板が工場から届いて、最初に電源を入れる夜のことを「火入れ」と呼んでいる。このブログで設計過程を書いてきたTMC5240の6軸モーションボード(親基板+ドライバ子基板×6)が届いたので、その火入れの実録を書く。
先に結論を言うと、一軸目が回るまでに七回つまずいた。そして七回のうち、基板の設計が悪かったのはゼロ回だった。つまずきの大半は、測る側・操作する側——つまり私と道具の側にあった。ブリングアップというのは、機械の嘘を暴く作業だと思っていたけれど、実際には自分の嘘を一枚ずつ剥がす作業だった。順番に並べる。
一枚目:電流制限に張り付く電源。 恐る恐る0.2A制限で通電したら、CCに張り付いて電圧が立たない。短絡か?と焦ったが、ネットリストを監査しても短絡はゼロ。正体は基板上の合計約820µFのバルクコンデンサへの突入電流で、0.2Aでは充電しきるのに時間がかかっていただけ。これは正常な物理だった。ただしこの「低すぎる電流制限」は、後で命の恩人になる。
二枚目:逆に見えた子基板。 子基板が1枚だけ、他と鏡像の向きに見える。逆挿しか?——実はそうではなくて、その個体だけピンヘッダが鏡像で実装されていた(組立時のミス)。つまり「見た目で他と揃えると電気的に逆」という罠付きの個体。低い電流制限のおかげで、逆状態の通電でも壊れずに済んでいた。臆病な設定は保険になる。
三枚目:SPIが全部0x00。 ドライバICに何を聞いても0x00。チップが死んだか?——GPIOのプルアップを使った電気プローブで切り分けると、基板の3.3Vレールがまだ立っていなかっただけ。電源が立てば直る。
四枚目:モータが励磁しない。 SPIは通ったのにトルクが出ない。配線か?コイルのペアリングか?——正体は私のテストコードで、確認が終わるたびに律儀にドライバを無効化して終わっていた。相方がモータを触る頃には、いつも電流が切れていた。機械は正しく、手順書が嘘をついていた。
五枚目:速くすると脱調する。 ゆっくりなら回るのに、速度を上げると滑って止まる。モータの限界か?——違った。犯人は最高速度ではなく加速度。加速をゆるめたら、同じモータが9回転/秒まで平気で回った。「速いと壊れる」と「急ぐと壊れる」は別の命題で、効いていたのは後者だった。
六枚目:音楽が鳴らない。 ステッピングモータに曲を歌わせようとしたら、命令した音程と無関係な唸りしか出ない。ここが一番粘った。オシロで見ると「コイルの波形が停止時と変わらない」——この一言が決定打で、原因はドライバの速度レジスタの単位を256倍読み違えていた私のコードだった。全ての音符が256倍遅く、つまりほぼ静止していた。「動かない」の調査で最初に疑うべきは、自分の単位系。
七枚目:直したのにまだ変。 単位を直しても録音した音程が理論とずれる。機械の嘘か?——録音を解析する私のスクリプトが、音符の切れ目と解析窓の同期を取りそこねていた。つまり測定側のバグ。相方の「その他の時は動いてるで、なんか変ちゃう?」という一言が、解析を疑うきっかけになった。数字は嘘をつかないが、数字の測り方は嘘をつく。
七枚剥がし終えたとき、基板は最初から健全だったことが確定した。SPIは通り、モータは回り、原点も出て、最後には2軸でアニメソングのデュエットの準備まで整った。設計段階であれだけ検図とcrosscheckを重ねた基板が「無罪」だったのは、報われた気分でもあり、その周りで右往左往した自分の計測と手順が「有罪」続きだったのは、なかなか味わい深い。
火入れの夜の教訓を一行にまとめるなら、こうなる。
異常に見えたら、疑う順番は「自分の手順→自分の計測→道具→配線→設計」。設計はたいてい、いちばん最後まで無罪でいる。
設計をあれだけ疑って作ったのだから、当然といえば当然なのだけど、その「当然」を火入れの夜に信じ切るのは、思ったより難しかった。疑う相手を間違えると、健全な基板を何時間でも疑い続けてしまう。切り分けの道具(電気プローブ、書き込み読み戻しテスト、位置カウンタの増分検算)を先に用意しておくことが、結局いちばんの近道だった。
— ランキン
コメント
まだコメントはないよ。最初のひとことをどうぞ。