Darkside(https対応しました)

2021年10月7日(木) 21:31

原因判明

 今回の i2c トラブルも、ネットでは悩んでる前例が極端に少ない。みんなすんなり動作している。自分だって、2年前はすんなり動作した。つまり、何か初歩的な大チョンボやってる可能性が大なんだよな。
 もちろん謎の短絡事故で壊してしまった可能性はあるが、2年前に動いたプログラムが動かなかったのはその前である。i2c1 のはずが i2c2 になってる問題も、単に Jetson-IO が /dev/i2c-1/ を i2c2 と表示しているだけの可能性がある。GPIO のピンアサインと照合すると、i2c-0 も i2c1 と表示しているからだ。

 i2c-2 はタイムアウトしないが、0x1d にも 0x3a にもデバイスは検出されない。
 i2c-1 はタイムアウトして、情報を何も取得できない。2年前のプログラムをそのまま実行しても、こっち。

 どうしたものか?
 そもそも3番ピンと5番ピンが i2c-1 なのか i2c-2 なのかはっきりしない、という時点で困る。まずはそこから確認すべきではないか?

 1番ピンに3.3Vが出力されているので、3ピンヘッダーを使って容易にハードウェア試験ができる。1.8KΩのプルアップ抵抗を3.3Vに接続し、3番ピンと5番ピンの電位変化をオシロでチェックするのだ。

 まずは、i2cget -y 1 0x1d 0x00 を実行。これは、i2c-1 のアドレス 0x1d に接続されたナニモノかから先頭レジスターの値を取得する。
 コマンドを実行した瞬間、3番ピンと5番ピンはGND電位に下がり、何秒か経過してタイムアウトになると元の電位に復活した。

 念のため i2cget -y 2 0x1d 0x00 や i2cget -y 0 0x1d 0x00 も実行したが、一瞬で終了するもののオシロの波形に変化はない。つまり、3番ピンや5番ピンを使って何かの情報を取得した訳ではない。
 これにより、3番ピンと5番ピンは i2c-1 であることが確定的となった。また、電位変化しているので、恐らく i2c-1 は壊れていない。

 となると、なぜ2年前に動作したプログラムが動作しないのか?

 2年前との違いは、Sタンク車体の製作が進行したこと。2年前は主砲の開発を先行させていて、射撃に関係しない車体側の機能は手つかず同然だった。しかし現在は、車体側の機能もほぼ実装できている。
 現在の傾斜センサーは、Sタンクの車体側にしっかり取り込まれていて、電源もSタンクの車体から供給されている。つまり、Sタンク車体の主電源を入れなければ、傾斜センサーは動作しない。

 だが主電源を入れれば dsPIC 達も動作し、傾斜センサーに初期化コマンドを送ってその後は値を常に取得する。やられた!

 そうだ、dsPIC はI2Cがどうしても動作せず、仕方なくソフトウェアI2Cを使っていたんだった!
 ソフトウェアI2Cには、複数のマスターが同じスレイブを共有できないという大欠点が存在する。そのせいで、デバッグ用液晶ディスプレイの共有も断念したのである。
 同様で、傾斜センサーも Jetson Nano と共有できない。

 車体を水平にキープする機能の方が圧倒的に重要なので、ここは二択となる。
・Jetson Nano で傾斜センサーの利用を諦めるか?
・dsPIC でハードウェアI2Cが使えるように再挑戦するか?

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4