サイトロゴ

ADコンバータADS1115の使い方【ESP32・Arduino】

著者画像
Toshihiko Arai

はじめに

この記事ではADコンバータADS1115をesp32で使うやり方を解説します。ADS1115は、分解能16ビットの入力が4チャンネル備わっているADコンバータです。PGAが備わっており、差動入力およびマイナス電圧も読み取ることができます。 Arduinoとの接続はI2Cで行います。ライブラリを使えば驚くほど簡単にアナログ値を読み取ることができます。

つかうもの

この記事でつかうものをご紹介いたします。

ADS1115

今まで数あるADコンバータを試してきましたが、ADS1115が一番おすすめです!I2C通信なので配線がとても楽です。4チャネル16ビットという性能も申し分ないです。プログラマブルゲインがあるので微弱信号でも読み取れます。さらには差分入力やマイナス電位まで測定できるのは魅力的です。

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

ESP32

WayinTopさんから販売されているESP32を使用しました。技適マークも刻印されてますので、安心して国内で使えます。GPIOの役割図は 商品ページ に詳しく掲載されてます。

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

ADコンバータADS1115の使い方

それではさっそく、ADコンバータADS1115の使い方を解説していきます。

ADS1115とESP32の配線図

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

電源電圧は2.0〜5.5Vの範囲で動作します。ADS1115はI2C通信ですので、ESP32の場合はSCLをGPIO22へ、SDAをGPIO21へ繋ぎます。ADDRピンはGNDへショートさせておきます。デフォルトのアドレスは 0x48 ですが、複数のI2Cデバイスでアドレスがバッティングしてしまう場合は、ADDRピンの接続先を次のように変更することでアドレスを変更可能なようです。

I2Cアドレスの変更

ADDR端子の接続先 Address Notes
GND 0x48 default
VDD 0x49
SDA 0x4A
SCL 0x4B

アナログセンサを繋ぐ

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

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

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

下記ライブラリをIDEへインストールしてください。 https://github.com/RobTillaart/ADS1X15

私の場合は VS Code x Platform IOで開発 してますので、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 ライブラリが初期設定を色々やってくれるので、とても簡単にプログラミングできます。

/**
 * @date 2023-3-3
 * @author Toshihiko Arai
 * @copyright https://101010.fun
*/
#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.144V default
1 ±4.096V
2 ±2.048V
4 ±1.024V
8 ±0.512V
16 ±0.256V

関連記事