ArduinoでI2Cする際のプルアップ抵抗について
TJ3BをMasterとし、SlaveのArduinoを2台I2Cで接続した際に、I2Cの通信が不安定になり、いろいろ調べた結果、Arduino側の作りにマズい点があった。参考になったのは次のサイト。
- Arduino同士でI2C通信する方法
- ArduinoでI2C接続するときにSCL,SDAにプルアップ抵抗は必要か? - ArduinoでI2C接続するときにSCL,SDAにプルアップ抵抗は必要か? - マイブーム
Arduioでの作例ではI2Cのプルアップ抵抗について特に言及されずに外部抵抗を使っているものがあるが、公式のWireライブラリを用いるとArduinoの内部でプルアップが行われるため、外部にプルアップ抵抗を別途設ける必要がない。
内部のプルアップ抵抗を使う場合、Atmega328PであればデータシートからSDA、 SCLがプルアップ抵抗Rpuの20KΩ(Min)〜50KΩ(Max)になるそうだが、プルアップ抵抗は適切な抵抗値を設定する必要がある。
- http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
- 314ページ Table 30-1. Common DC characteristics
プルアップ抵抗の決め方についは以下を参考に。
次の様な修正で、動作が安定した。