I have connected a touch sensor breakout board (details) to an Arduino Micro following the guidance given in this Arduino Playground article:
I²C bi-directional level shifter, specifically the first section after the Introduction: Connecting 3.3V I²C components directly to the Arduino.
Using the 'Wire' library, I found the voltage of the 3.3V output from the Arduino was significantly higher than the 3.6V maximum rating of the chip.
This can be explained by the currents that can flow from +5V to the +3.3V rail via the two Arduino input pull-up resistors (minimum 30kΩ) in series with the I²C bus pull-up resistors (4.7kΩ recommended). This total current can amount to 100μA. My touch sensor draws typically 29μA and can draw only 3μA. The 3.3V regulator on the Arduino was therefore not functioning.
I propose the Playground article should be amended to say that a resistor may be needed to load the 3.3V regulator. A resistor value not exceeding 39kΩ should be sufficient (for most Arduino types). Does anyone disagree? Would anyone like to amend the Fritzing drawing?
Please do not respond to this thread to advise me that this method of connecting 3.3V components is inadvisable.
You can disable the 5 volt pullup resistors on the I2C bus.
Wire.begin();
// disable internal pullups for twi.
digitalWrite(SDA, LOW);
digitalWrite(SCL, LOW);
SurferTim:
You can disable the 5 volt pullup resistors on the I2C bus.
Thanks, I was thinking of doing that but there is the argument that the pull-up resistors are actually useful in that they bring the Arduino inputs up closer to 0.7*Vcc input high level (albeit possibly higher than 3.3V). However the option of disabling the pull-up resistors is something that perhaps ought to go in that Playground article.
Strictly there would be a very short time while the input pull-up resistors are enabled.
It's not clear to me why 'Wire' enables the pull-ups. I guess it's so things may work even if no extra bus pull-up resistors are added.
One of the last things Wire.begin() does is this.
// activate internal pullups for twi.
digitalWrite(SDA, 1);
digitalWrite(SCL, 1);
edit: The SD card and w5100 ethernet controller are both 3.3 volt output, and both work fine with the 5 volt Arduino devices without a logic level converter on the outputs. The SD card has logic level converters on the inputs, but the w5100 has 5 volt tolerant inputs, so none are used for it.