電子工作でセンサー類やその他デバイスを入手すると、インターフェースがI2Cとなっているものがあります。これは電子部品のバス接続でよく用いられるインターフェースで、2線接続で複数デバイスを制御できるのが特徴です。
これらのI2Cデバイスは3.3V動作のものが多い印象があります。一方でArduinoは5V動作のものが多いので、電子工作初心者のうちは両者をどう接続したものか悩んでしまいます。
そこで、5V動作のArduino Nanoから、双方向ロジックレベルコンバータを介して3.3V動作のI2Cデバイスに接続してみました。その内容をまとめます。
双方向ロジックレベルコンバータとは
ロジック電圧が異なるデバイスを接続する場合、電圧を適切に変換してやる必要があります。特に、5VのHigh出力を3.3Vデバイスに入れるとデバイスが壊れてしまうかもしれません。
このようなときに、ロジックのHigh/Lowのタイミングを維持しながら電圧を適切に変換してくれるのがロジックレベルコンバータ(レベルシフタとか電圧レベル変換モジュールなどと呼ばれることもあるようです)と呼ばれる部品です。SPIやUARTであれば一方向のみの電圧変換を行う「単方向ロジックレベルコンバータ」で十分なこともあるのですが、I2Cのように1つの信号線が入出力両方に使われる場合は双方向ロジックレベルコンバータが必要になります。
筆者はBSS138を使った4chのモジュールをeBayで1.12豪ドル(約97円)で買いましたが、秋月で販売されているPCA9306利用 2chロジックレベルコンバータ(150円)も良いと思います。
準備
- Arduino Nano 互換ボード
- 双方向ロジックレベルコンバータ
- 気圧モジュール(BMP180利用、I2C接続)
- 気温・湿度モジュール(SHT21利用、I2C接続)
実行例
Arduino NanoのA4/A5ピンをロジックレベルコンバータ経由でI2CデバイスのSDA/SDLに接続しています。3.3V動作のI2Cデバイスを2個(右下)接続してみましたが、両方のデバイスから値を取得できました。
実験に使ったソースコードは下記のようなものです。動作には下記ライブラリが必要です。
#include <Wire.h>
#include <SHT2x.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
void setup()
{
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
}
void loop()
{
Serial.print("Humidity(%RH): ");
Serial.print(SHT2x.GetHumidity());
Serial.print(" Temperature(C): ");
Serial.println(SHT2x.GetTemperature());
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.print(" *C");
Serial.print(" Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.println();
delay(5000);
}