ADコンバータADS1115の使い方【ESP32・Arduino】
この記事では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でも構いません。こちらの記事で色々な種類の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へインストールしてください。 GitHub - RobTillaart/ADS1X15: Arduino library for ADS1015 = I2C 12 bit ADC and ADS1115 = I2C 16 bit ADC
私の場合は VS Code x Platform IOで開発 してますので、ADS1X15.h と ADS1X15.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 |