yoshiyuki's blog

Arduino/Teensy/Raspberry pi pico を利用した I2C, SPI 通信アプリを紹介します

Arduino で I2C / High Level を 3.3 V や 1.8 V にする

この記事では、Arduino を 3.3 V や 1.8 V のデバイスと接続して使用するために必要なレベルシフタを紹介します。また、最初から 3.3 V のマイコンを搭載したボードを使用するという手段もありますので、それについても紹介します。

レベルシフタの例

Arduino と組み合わせて使うことを想定したレベルシフタは Amazon で入手可能なので、それらを購入してしまうのが簡単です。以下は製品例です。

KeeYees のレベルシフタ
5 V - 3.3 V 変換は問題無く動作すると思われます。5 V - 1.8 V 変換は、たぶん動作しますが、あまり余裕が無さそうです
KeeYees 双方向ロジックレベル変換モジュール

サンハヤトのレベルシフタ
5 V - 3.3 V 変換でも 5 V - 1.8 V 変換でも問題無く動作すると思われます。
サンハヤト モジュール MM-TXS01

レベルシフタの使用例

KeeYees のレベルシフタの使用例です。サンハヤトのレベルシフタを使用する場合は端子名を下記に読み替えてください。

KeeYees サンハヤト
HV VCCB
LV VCCA
HVx Bx
LVx Ax
GND GND


KeeYees もサンハヤトも HVx (Bx)、 LVx (Ax) がそれぞれ HV (VCCB)、LV (VCCA) に対して抵抗で Pull-up されているため、I2C で使用する場合、別途 Pull-up 抵抗を置かなくてもある程度動作します。

レベルシフタが必要な理由

Arduino が出力する信号の High Level は Arduino の電源電圧となります。例えば Arduino nano の場合は、 USB から供給される電源電圧の 5 V が High Level です。 (実際には 4.5 V 程度)
これに対して SPI や GPIO の接続先が 3.3 V や 1.8 V のデバイスの場合、この High = 5 V をそのまま印加すると耐圧超過により接続先のデバイスを破壊する怖れがあります。

I2C の場合、High Level は Arduino の電源電圧ではなく Pull-up 電圧なので、Slave デバイスの VCC と同じ電圧を Pull-up 電圧とすれば耐圧超過は発生しません。しかしこの場合、 このPull-up 電圧が Arduino の High Level として十分かどうかが問題となります。Arduino が High を認識する電圧は、データシートでは電源電圧の 70 % 以上となっています。Arduino の電源電圧が 5 V の場合は 5 V x 0.7 = 3.5 V 以上が必要となります。これに対して Pull-up 電圧が 3.3 V の場合、SCL/SDA が High のつもりで 3.3 V を維持しても Arduino はそれを High Level と認識できず、結果、通信が成り立たなくなります。(でも、これは厳密な話であって、実際にやってみたら Pull-up = 3.3 V でもわりと通信できるとは思います)

これらの解決方法として、Arduino と接続先のデバイスの間にレベルシフタを挟むことで High Level を変換するのが一般的です。



3.3 V マイコン搭載ボード

Arduino は基本的に 5 V マイコンが搭載されているため入出力が 5 V であり、High Level が 5 V となっています。よって、3.3 V マイコンが搭載されているボードを使えばレベルシフタを使わなくても High Level を 3.3 V にすることができます。
世の中には Arduino の 3.3 V 版もあるのですが、ここでは Teensy を紹介します。Teensy は Arduino と同じように Arduino IDE を使って Sketch の作成や書き込みが可能です (ただし、Arduino IDE の拡張が必要)。また、基本的には Arduino と同じ Sketch で同じ動作をしてくれます。
Teensy にはバージョンがあり、3.3 V で動作するのは Teensy 3.2 以降となります。詳しい仕様は以下のリンクをご参照ください。
www.pjrc.com

そして、Teensy 4.0 で動作する I2C/SPI ツール がこちらです。
ysin1128.hatenablog.com