はじめに

この記事では、ADコンバータ ADS1115ESP32 で使うやり方をまとめています。

ADS111516ビット / 4チャンネル の A/D コンバータで、ESP32I2C で接続できます。ESP32 内蔵 ADC より分解能を上げたいときや、複数のアナログ入力を安定して読みたいときに使いやすいモジュールです。

この記事で分かることは次の3点です。

  • ESP32 と ADS1115 の基本配線
  • I2C アドレスの扱い
  • 4チャンネル分のアナログ値を読むサンプルコード

先に要点

  • ESP32 では SCL = GPIO22SDA = GPIO21 に接続すれば試しやすいです
  • ADDRGND に落とすと、I2C アドレスは 0x48 になります
  • ADS1X15 ライブラリを使うと、4チャンネルの読み取りはかなり簡単です
  • 配線を長く引くなら、I2C の安定性には少し注意が必要です

つかうもの

この記事で使ったものです。

ADS1115

ADS1115 は、I2C で扱える 4チャンネル 16ビットの AD コンバータです。配線が少なくて済み、PGA も使えるので、ESP32 の内蔵 ADC だけでは少し足りないときに便利です。

中華製品は安く買える反面、たまにはんだ不良で正常に動かない場合があります。私も 1ch と 2ch の信号線がショートしていて、トラブルになったことがありました。

ESP32

WayinTopさんから販売されている ESP32 を使用しました。技適マークも刻印されてますので、安心して国内で使えます。

WiFiやBluetooth接続が必要なければ、他のArduinoでも構いません。

ESP32でADS1115を使う手順

それでは、ESP32 で ADS1115 を使う手順を順番に見ていきます。

ADS1115とESP32の配線図

下図の通り、ADS1115 と ESP32 を配線します。

ADS1115とESP32の配線図

ADS1115

電源電圧は 2.0〜5.5V の範囲で動作します。ESP32 では SCLGPIO22SDAGPIO21 へつなぎ、ADDRGND に落とす構成が試しやすいです。 これでデフォルトの I2C アドレスは 0x48 になります。

複数の I2C デバイスでアドレスが重なる場合は、ADDR の接続先を変えることで次のように変更できます。

I2Cアドレスの変更

ADDR端子の接続先AddressNotes
GND0x48default
VDD0x49
SDA0x4A
SCL0x4B

アナログセンサを繋ぐ

A0、A1、A2、A3 にアナログ電圧を出力する信号線を接続します。センサ側の GND と ESP32 の GND は共通にしてください。ADS1115 の良いところは、プラス側だけでなくマイナス電圧も扱える点です。 今回の設定なら、アナログ信号を ±6.144V まで測定できます。

ADS1115ライブラリのインストール

ADS1115 を使ったプログラミングには、RobTillaart/ADS1X15 ライブラリ を使うと楽です。

下記ライブラリをIDEへインストールしてください。

VS Code x PlatformIO で開発する場合は、ADS1X15.hADS1X15.cpp をプロジェクト内へ置いて試しました。ディレクトリ構造は次のようになります。

$ tree
.
├── include
│   └── README
├── lib
│   ├── ADS1115
│   │   ├── ADS1X15.cpp
│   │   ├── ADS1X15.h
│   │   └── examples
│   │       └── demo
│   │           └── demo.ino
│   └── README
├── platformio.ini
└── src
    └── main.cpp

4チャンネルのアナログ値を読むサンプルコード

4チャンネル分のアナログ値を読むサンプルです。ADS1X15 ライブラリが初期設定をかなり肩代わりしてくれるので、コードはシンプルに書けます。

#include <Arduino.h>
//#include <Wire.h>

#include "ADS1X15.h"

ADS1115 ADS(0x48);

void setup() {
    Serial.begin(115200);

    Serial.println(__FILE__);
    Serial.print("ADS1X15_LIB_VERSION: ");
    Serial.println(ADS1X15_LIB_VERSION);
    ADS.begin();
}

void loop() {
    ADS.setGain(0);
    int16_t val_0 = ADS.readADC(0);  
    int16_t val_1 = ADS.readADC(1);  
    int16_t val_2 = ADS.readADC(2);  
    int16_t val_3 = ADS.readADC(3);  

    float f = ADS.toVoltage(1);  // voltage factor
    Serial.println(f, 8);

    Serial.print("\tAnalog0: "); Serial.print(val_0); Serial.print('\t'); Serial.println(val_0 * f, 3);
    Serial.print("\tAnalog1: "); Serial.print(val_1); Serial.print('\t'); Serial.println(val_1 * f, 3);
    Serial.print("\tAnalog2: "); Serial.print(val_2); Serial.print('\t'); Serial.println(val_2 * f, 3);
    Serial.print("\tAnalog3: "); Serial.print(val_3); Serial.print('\t'); Serial.println(val_3 * f, 3);
    Serial.println();

    delay(1000);
}

実行結果

実行すると、次のようにアナログ値と電圧値がシリアルモニタへ出力されます。

0.00018751
        Analog0: 2706   0.507
        Analog1: 4757   0.892
        Analog2: 4828   0.905
        Analog3: 4818   0.903

0.00018751
        Analog0: 2707   0.508
        Analog1: 4758   0.892
        Analog2: 4827   0.905
        Analog3: 4817   0.903

PGAでプログラマブルゲインの設定

ADS1115 には PGA があり、入力信号が小さい場合は適切にゲインを設定することで読み取りやすくできます。

先ほどのサンプルコード内にある ADS.setGain(0); の値を、次のように変更します。

PGAの設定値最大電圧備考
0±6.144Vdefault
1±4.096V
2±2.048V
4±1.024V
8±0.512V
16±0.256V

関連記事

関連アイテム