はじめに
この記事では、ADコンバータ ADS1115
を ESP32 で使うやり方をまとめています。
ADS1115 は 16ビット / 4チャンネル の A/D コンバータで、ESP32 と I2C で接続できます。ESP32 内蔵 ADC より分解能を上げたいときや、複数のアナログ入力を安定して読みたいときに使いやすいモジュールです。
この記事で分かることは次の3点です。
- ESP32 と ADS1115 の基本配線
- I2C アドレスの扱い
- 4チャンネル分のアナログ値を読むサンプルコード
先に要点
ESP32ではSCL = GPIO22、SDA = GPIO21に接続すれば試しやすいですADDRをGNDに落とすと、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 を配線します。


電源電圧は 2.0〜5.5V の範囲で動作します。ESP32 では SCL を GPIO22、SDA を GPIO21 へつなぎ、ADDR は GND に落とす構成が試しやすいです。 これでデフォルトの I2C アドレスは 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へインストールしてください。
VS Code x PlatformIO で開発する場合は、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 ライブラリが初期設定をかなり肩代わりしてくれるので、コードはシンプルに書けます。
#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 |
関連記事
- Arduino・ESP32・Raspberry Piで始めるIoT電子工作まとめ
- LANケーブルを自作する方法|RJ45のかしめ方とArduino配線で使うときの注意点
- ESP32へ書き込みエラー・MacBook 2022でconnectできない・自動書き込みに失敗したときの解決方法