Arduinoに複数のセンサを繋げてシリアル通信でデータを取る、ということをしていたのですが、センサ側の基板とケーブルを変えたタイミングでうまく通信できなくなってしまいました。
その解決までにやったことを忘れないうちに残しておきます。
回路の配線チェック
基本中の基本ですが、導通チェックを含めて全部確認しました。
こちらは問題無し。
通信のノイズかな?と思い、色々と調べて試していくことにしました。
プルアップ抵抗を変える
今までは4.7kΩのプルアップ抵抗を使っていましたが、これを変えました。
ケーブルが長い分、余計な浮遊容量があると想定し、抵抗値を小さくするのが正解かと思って色々と試しました。
(調べてみると、プルアップ抵抗はだいたい1-5kΩくらいという説もありました)
最終的には330Ω~33kΩまで試したけどダメでした。
これはもうケーブルを短くするしかない、と思い、次はケーブルをいじりました。
ケーブルの長さを短くする
調べてみると、I2C通信は長いケーブルだとうまくできないらしい。
当初5mあったケーブルを、半分(2.5m)、さらに半分(1.25m)と短くしていった。
オシロスコープで見てみると、確かに短くすると波形が良くなってくる。
これは間違いなく効いている。
ただし、まだ通信できない。
さらにプルアップ抵抗を色々と変えると、一瞬繋がるときもあったりしたので、あと少しな感じもする。
しかし、再現性が無い。
他のケーブルに付け替えたりも試したけど、それでもダメ。
途中経過の写真
新しくもう1つ基板を製作する
ADコンバータが死んでいるのでは?という可能性を確かめるべく、同じ部品でもう1つ基板を作って試しましたが、これもうまく動作せず。
(本当はADコンバータだけ取り換えたかったけど、うまく外せなかったので)
エラーの出方が変わった気もするので、何となく差がありそうな気もしなくはないけど、通信できないという状況は変わらず。
Arduinoを変える
使っているArduinoを他のものに変えると、なんと通信できました!
やっぱ予備にいくつか持っておく必要はあるなぁ…と改めて思いました。
たまたま手持ちのものが1つしか無く、早めに試すことが出来なかったのが悔しい。
トラブルは勉強になるのですが、解決するまでは本当に焦る。
今回は特に再現性が無いところに悩まされました。
最終的には解決できて良かったです。