ESP-WROOM-02 の TOUT 端子はアナログ入力端子として使えますが,1本しかありませんし,0〜1V のセンシング範囲となっているため,なかなか使いづらいです.そこで,外付けモジュール(秋月電子の「ADS1015使用 12ビット 4チャンネル AD コンバータ」を ESP から i2c 接続によって使う方法を紹介したいと思います.
このモジュールは,下図のように,AD コンバータ IC である ADS1015 に少数の部品を加えた基板です.i2c 接続のための通信線(SDA, SCL)には,あらかじめ 10kΩ のプルアップ抵抗が装着されています.i2c アドレスは ADDR 端子の接続先によって複数の選択肢から選べます.GND に接続した場合(またはオープンの場合)は 0x48,VDD なら 0x49 となります.さらに,ADDR を SDA に接続すれば 0x4a,SCL なら 0x4b となりますが,これら信号線のプルアップ抵抗と ADDR 端子のプルダウン抵抗が拮抗してしまうため,オススメできません.
使用するモジュールが1つだけであれば,ADDR 端子をオープンにして,アドレス 0x48 としてアクセスすればよいでしょう.以下では,そのような使用を想定して説明を進めます.
ESP-WROOM-02 との間は,IO4 を SDA に接続し,IO5 を SCL に接続するという,標準的な i2c の接続方法(下図)に従います.SDA, SCL への接続線には,外付けのプルアップ抵抗は不要です.
センサとの接続は,さまざまな方法が考えられますが,抵抗値が変化するセンサ(FSR など)であれば,固定抵抗 R(たとえば 100kΩ)と直列につなぎ,両端を VDD, GND に接続することでセンサ電圧を発生させ,それをアナログ端子 A0〜3 に入力すればよいでしょう.電圧を発生させるセンサ(温度センサなど)であれば,その出力を直接 A0〜3 に入力してよいでしょう.
ADS1015 には,アンプのゲイン調整や閾値によるアラート出力など,さまざまな機能がありますが,ここでは,ゲインを1倍とし,閾値によるアラート出力は利用しないという,最もベーシックな使い方によるデータの読み取りを解説します.(より高度な使い方については,ADS1015 のデータシートを参照してください.)
#include <Wire.h> // init ADS1015 void ADS1015_init() { // init i2c as a master Wire.begin(); } #define ADS1015_ADDR 0x48 // triger conversion on An void ADS1015_trigger(int n) { // trigger conversion Wire.beginTransmission(ADS1015_ADDR); Wire.write(0x01); // to "config" Wire.write(0xc3 | (n << 4)); // OS=1,MUX=1nn,PGA=001(x1),MODE=1(single) Wire.write(0xe3); // DR=111(3300SPS),00011(no comparator) Wire.endTransmission(); } // read conversion result int ADS1015_read() { short int value; // read out the result Wire.beginTransmission(ADS1015_ADDR); Wire.write(0x00); // to "conversion" Wire.endTransmission(); Wire.requestFrom(ADS1015_ADDR, 2); // read out 2 bytes value = Wire.read() << 8; value |= Wire.read(); // return -2048..+2047 return value / 16; // 0V=0, 4.096V=2047, 3.3V=1649 } // main program int chan; int values[4]; void setup() { // serial for debugging Serial.begin(115200); Serial.println("*** started"); // trigger first conversion (on A0) chan = 0; ADS1015_init(); ADS1015_trigger(chan); } void loop() { // read out the result values[chan] = ADS1015_read(); // trigger next conversion chan = (chan + 1) % 4; // 0,1,2,3,0,1,2,3... ADS1015_trigger(chan); // delay (minimum 0.3ms) delay(10); // output to monitor if (chan == 0) { Serial.print(" "); Serial.print(values[0]); Serial.print(", "); Serial.print(values[1]); Serial.print(", "); Serial.print(values[2]); Serial.print(", "); Serial.print(values[3]); Serial.println(""); } }
赤字の部分が ADS1015 に関する部分です.最初に1回だけ ADS1015_init() を呼び出します.ADS1015_trigger(n) は,An についての AD 変換を起動する関数です.ADS1015_read() は,その結果を −2048〜+2047 の整数値として読み出す関数です.ADS1015_trigger(n) の呼び出しと ADS1015_read() の呼び出しの間には,AD 変換のための時間として,最低 0.3ms の間隔を空ける必要があります.
黒字の部分は,サンプルプログラムです.A0〜3 について AD 変換した結果をシリアルモニタに書き出しています.20Hz 程度で動作しているはずです.シリアルプロッタを使えばグラフ表示することもできます.お試しください.
仕込み中です.