ArduinoでI2Cする際のプルアップ抵抗について

TJ3BをMasterとし、SlaveのArduinoを2台I2Cで接続した際に、I2Cの通信が不安定になり、いろいろ調べた結果、Arduino側の作りにマズい点があった。参考になったのは次のサイト。


Arduioでの作例ではI2Cのプルアップ抵抗について特に言及されずに外部抵抗を使っているものがあるが、公式のWireライブラリを用いるとArduinoの内部でプルアップが行われるため、外部にプルアップ抵抗を別途設ける必要がない。

内部のプルアップ抵抗を使う場合、Atmega328PであればデータシートからSDA、 SCLがプルアップ抵抗Rpuの20KΩ(Min)〜50KΩ(Max)になるそうだが、プルアップ抵抗は適切な抵抗値を設定する必要がある。

プルアップ抵抗の決め方についは以下を参考に。


次の様な修正で、動作が安定した。

  • 【構成】
    • 同様構成のSlaveのArduino 2台をTJ3Bに接続。
  • 【修正前】
    • SlaveのArduinoで外部プルアップ抵抗(10KΩ)を付けていたが、内部プルアップも有効だった。
  • 【修正点】
    • Wire.begin()の後に「pinMode(SDA, INPUT);pinMode(SCL, INPUT);」記述し、内部プルアップを無効化した。