ESP32-DevKitCでI2C接続が正しくできていることを確認する

Posted on Sun 31 March 2019 in JP

はじめに

I2C接続が必要なデバイスの場合、テスター等で確認することはできないので正しく接続できているか確認するのが面倒です。

ESP-IDFに便利なツール(i2c_tools)があったので試してみます。このツールでは、サンプルプログラムをESP32-DevKitCに転送し、シリアルコンソール上でコマンドを実行することで、I2Cバスに接続されているデバイスの検知や、レジスタの読み書きが簡単にできます。

今回は、温度・湿度・気圧を測定できるセンサーのBME280をESP32-DevKitCにI2Cで接続し、i2c_toolsで動作を確認してみます。

回路図

i2c_toolsのREADME.mdによるとデフォルトのピンアサインは下記のようになっています。 ESP32 I2C MasterがESP32-DevKitC側で、Sensorが接続するデバイス側のピンです。

SDA SCL GND Other VCC
ESP32 I2C Master GPIO18 GPIO19 GND GND 3.3V
Sensor SDA SCL GND WAK VCC

このピンアサインは、ツールをESP32-DevKitCに書き込み後、i2cconfigコマンドで変更することもできますが、今回はデフォルトのピンアサインで接続します。

下記のように接続しました。

ESP-IDFのセットアップとi2c_toolsのビルド・書き込み

ESP-IDFの取得

$ git clone https://github.com/espressif/esp-idf.git

i2c_toolsのビルド設定

$ export IDF_PATH=(git cloneしたesp-idfのディレクトリパスを指定)
$ cd esp-idf/examples/peripherals/i2c/i2c_tools
$ make menuconfig

/dev/ttyUSB0 を /dev/cu.SLAB_USBtoUART

i2c_toolsのビルド・転送

$ make -j4 flash monitor

I2Cバスに接続されているデバイスのアドレスをチェックする

i2cdetectコマンドでI2Cバスに接続されているデバイスのアドレスを取得できます。

The 7-bit device address is 111011x. The 6 MSB bits are fixed. The last bit is changeable by SDO value and can be changed during operation. Connecting SDO to GND results n slave address 1110110 (0x76); connection it to VDDIO results in slave address 1110111 (0x77), which is the same as BMP280’s I²C address. The SDO pin cannot be left loating;

データシート 1 には、SDOにGNDを接続した場合は0x76、VDDIOを接続した場合は0x77のアドレスになると記載があります。 BME280のSDOにGNDを接続しているので、アドレスは0x76で取得できるはずです。

esp32> i2cdetect
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 -- -- -- -- -- -- -- -- --

正常に0x76が取得できています。

レジスタを読む

レジスタを読むには、i2cgetコマンドを使用します。

チップのIDを取得してみます。BME280の場合は0x60が返ってくるはずです。

esp32> i2cget -c 0x76 -r 0xd0 -l 1
0x60

正しく返ってきているのが確認できました。

レジスタに書き込む

今回は使用しませんでしたが、レジスタに書き込むにはi2csetコマンドを使用します。

まとめ

  • ESP32-DevKitCでI2C接続回路が正しく組めているか確認するにはi2c_toolsが便利です
  • i2c_toolsでは、I2Cバスに接続されているデバイスの検知、レジスタの読み書きが可能です