小嶋秀樹 | 研究室
日本語 | English
ESP のアナログ端子を増やす

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 との接続 / センサとの接続】

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 程度で動作しているはずです.シリアルプロッタを使えばグラフ表示することもできます.お試しください.

ESP のディジタル端子を増やす

仕込み中です.