macsbug

Just another WordPress.com site

i2C 16bit ADC 4ch ADS1115 in ESP8266

with 2 comments

i2C 16bit ADC ADS1115 を ESP8266 で動かす。                         2016.02.05
ADS1115 は、16-Bit ADC – 4 Channel with Programmable Gain Amplifier
特徴:広い電源電圧範囲:2.0V ~ 5.5V。低消費電流: 連続モード:150μA。
_ プログラマブルゲインアンプ内蔵。プログラミング可能なコンパレータ。
_ 4本のシングルエンド入力。2本の差動入力。I2Cインターフェイス。
_ 最小±256mVから電源電圧までの入力範囲に対応。
サンプルにcomparator、differential、single endedがあり直ぐ動作が可能。


準備:
ハード:ADS1115 Module:ebay=約339円。OLED:ebay=約600円。ESP8266。
ソフト:ライブラリー:Adafruit_ADS1X15-master
_ adafruit/Adafruit-GFX-Library
_ cmmakerclub/ESP_Adafruit_SSD1306

重要:ライブラリー Adafruit_ADS1015.cpp の修正。
修正内容:ADS1015_REG_CONFIG_DR_1600SPS を削除し
_    ADS1015_REG_CONFIG_DR_3300SPS を追加する。以下のリスト参照の事。
理由:delayMicroseconds() doesn’t work in ADS1115 library
_  ADS1015_REG_CONFIG_DR_1600SPS was changed to ADS1015_REG_CONFIG_DR_3300SPS
ライブラリー Adafruit_ADS1015.cpp の155行と207行を修正します。注:リスト中の右は時は表示の都合で省略。
修正前:2カ所あり。

// Start with default values
  uint16_t config = ADS1015_REG_CONFIG_CQUE_NONE
                    ADS1015_REG_CONFIG_CLAT_NONLAT
                    ADS1015_REG_CONFIG_CPOL_ACTVLOW
                    ADS1015_REG_CONFIG_CMODE_TRAD
                    ADS1015_REG_CONFIG_DR_1600SPS
                    ADS1015_REG_CONFIG_MODE_SINGLE;

修正後:2カ所あり。

// Start with default values
  uint16_t config = ADS1015_REG_CONFIG_CQUE_1CONV
                    ADS1015_REG_CONFIG_CLAT_LATCH
                    ADS1015_REG_CONFIG_CPOL_ACTVLOW
                    ADS1015_REG_CONFIG_CMODE_TRAD
                    //ADS1015_REG_CONFIG_DR_1600SPS
                    ADS1015_REG_CONFIG_DR_3300SPS
                    ADS1015_REG_CONFIG_MODE_CONTIN
                    ADS1015_REG_CONFIG_MODE_CONTIN;

配線:5本。
3.3V ————- OLED_Vcc —- ADS1115_Vcc (電源電圧:2.0~5.5V)
GND ————- OLED_GND — ADS1115_GND、ADS1115_ADDR(0x48)
ESP8266_4 —- OLED_SDA — ADS1115_SDA
ESP8266_5 —- OLED_SCL — ADS1115_SCL


Adafruit_ADS1X15 ライブラリー:以下3つのサンプルは参考になります。
_ comparator。differential。singleended。
_ README.mdには、動作報告が書かれています:ESP8266は OK。

GAIN設定:6種類の設定が可能。
_ 2/3x gain で +-6.144Vdcまで可能。今回は「GAIN_TWOTHIRDS」を選択。
_ 「GAIN_TWOTHIRDS」は、読み込み値の0.1875倍が電圧(mV)になります。
_ 最大電圧以上の測定は、抵抗分割で電圧を下げて測る事ができますね。
_ 16x gain の時は、入力は最大 +-0.256V までで、1bit は、0.0078125mV。

ads.setGain(GAIN_TWOTHIRDS); (default)
GAIN_TWOTHIRDS:2/3x gain +/- 6.144V 1 bit= 0.1875   mV
GAIN_ONE      :  1x gain +/- 4.096V 1 bit= 0.125    mV
GAIN_TWO      :  2x gain +/- 2.048V 1 bit= 0.0625   mV
GAIN_FOUR     :  4x gain +/- 1.024V 1 bit= 0.03125  mV
GAIN_EIGHT    :  8x gain +/- 0.512V 1 bit= 0.015625 mV
GAIN_SIXTEEN  : 16x gain +/- 0.256V 1 bit= 0.0078125mV

データー読み込み:読み込み値に、0.1875/1000 倍にし Vdc にします。
_ 例:float v0 = (ads.readADC_SingleEnded(0) * 0.1875/1000);


メモ:
読み込み速度:約8msec。
_ ライブラリーでは コマンド送信し 8msec 後に データーの読み込みを行っています。
_ よって、この速度以上にはならない為この速度に応じた装置にしましょう。
_ ADS1115 Moduleの価格:ebayでのAdafuruit製は2千円台です。
ADS1115 は、16 bit。ADS1015は、12 bit です。
安定度(精度):ADS1115のスペック(Page_8_Fig19)によるとTotal Error は
_ +-2.0Vdc inputで +-3.3mVdc。16 bit ですが以外と大きいものですね。
_ +2.50000Vdc input による実測では 10mV は安定しているが 1mVは変動しています。
_ よって精度は 10mV です。
入力電圧の注意:一般的にADCは 決められた入力電圧以上を接続すると壊れるそうです。
レイアウト:部品や配線のレイアウトは電源や信号が干渉しない様にする事。
安全策:ADCの電源は単独にLDOを使用した方が良い。


参考:
Texas Instruments:16-Bit Analog-to-Digital Converter with Internal Reference
Texas Instruments  ADS1115
Henry’s Bench:ARDUINO ADS1115 MODULE GETTING STARTED:アドレスの詳細。


感想:
i2Cで手軽に 16bit ADC が使えるのは楽ですね。
16bit の性能を引き出すには、基盤や電源、入力の工夫が必要かと思います。


スケッチ:

#include <Wire.h>
#include <Adafruit_ADS1015.h>               // ADS1015,1115
Adafruit_ADS1115 ads(0x48);                 // 16-bit version
#include <Adafruit_GFX.h>                   // OLED
#include <ESP_Adafruit_SSD1306.h>           // OLED 
Adafruit_SSD1306 display(4);                // OLED Reset

void setup(void) {
  //Serial.begin(115200);
  Wire.begin(4,5);                          // OLED:SDA,SCL
  display.begin(SSD1306_SWITCHCAPVCC,0x3c); // I2C ADDRESS=3c
  display.clearDisplay();                   // Clear the buffer
  display.setTextSize(4);                   // font size 4
  display.setTextColor(WHITE);              //
  display.setCursor(0,0);                   //
  ads.setGain(GAIN_TWOTHIRDS);              // 2/3x gain +/-6.144V
  ads.begin();                              // 1 bit=0.1875mV
}

void loop(void) {
  float v0 = (ads.readADC_SingleEnded(0) * 0.1875/1000); // A0 Read
  display.clearDisplay(); 
  display.setCursor(0,0);
  display.println(v0,3);
  display.display(); 
}

Written by macsbug

2月 4, 2016 @ 11:35 pm

カテゴリー: ESP8266

コメント / トラックバック2件

Subscribe to comments with RSS.

  1. Nice writeup! Thanks for the details.

    Ron

    8月 5, 2016 at 9:07 pm


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。