5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (5) A-Dコンバータの利用2 ADS1115

16ビット4チャネル入力A-DコンバータADS1115

 前回、アナログ・データをディジタルに変換するために、I2CインターフェースのMCP3424を用いました。ここでは、16ビットA-DコンバータADS1115を利用します。DIP化ボードがadafruitから出ています(ADS1115 16-BIT ADC - 4 CHANNEL WITH PROGRAMMABLE GAIN AMPLIFIER)。スイッチサイエンスから入手しました。12ビットのADS1015をボード化した製品は秋月電子通商で扱っています。

 4チャネル入力です。A0からA3までの入力端子が用意されています。差動入力、シングル入力の両方とも4チャネルです。スレーブ・アドレスはADDRピンを接続する場所により4通りに設定できます。GNDに落とすと1001000 (0x48)です。

ADS1115の主なスペック

  •  ビット数;16
  •  基準電圧;内蔵
  •  電源電圧; 2.0~5.5V
  •  入力;差動(A0-A1、A0-A3、A1-A3、A2-A3)、シングル(A0、A1、A2、A3とGND)
  •  増幅器;プログラマブル前置アンプ内蔵(PGA)フルスケール;±6.144V、±4.096V、±2.048V、±1.024V、±0.512V、±0.256V
  •  変換方式;ΔΣ(デルタ・シグマ)方式
  •  変換速度;8、16、32、64、128、250、475、860SPS 
  •  I2Cデータ転送速度;10 kHz~3.4 MHz
  •  I2Cのスレーブ・アドレス;ADDRピンをGNDにつなぐと0x48、VDDにつなぐと0x49、SDAにつなぐと0x4A、SCLにつなぐと0x4Bに設定できる。ボード上では10kΩでプルダウンされているので、購入時は0x48。SDAとSCL信号は10kΩでプルアップされている。ラズパイのI2Sのバス1で使うときは取り去る。

各種設定をするコンフィグ・レジスタ

 プログラムの最初で、コンフィグ・レジスタを設定します。アドレス・ポインタ・レジスタは0x01です。

  • bit1 OS。'1'で変換開始。デフォルト1
  • bit14、bi13、bit12 チャネル・セレクト。
    000 : AINP = AIN0 and AINN = AIN1 (デフォルト)
    001 : AINP = AIN0 and AINN = AIN3
    010 : AINP = AIN1 and AINN = AIN3
    011 : AINP = AIN2 and AINN = AIN3
    100 : AINP = AIN0 and AINN = GND
    101 : AINP = AIN1 and AINN = GND
    110 : AINP = AIN2 and AINN = GND
    111 : AINP = AIN3 and AINN = GND
  • bit11、bit10、bit9 PGA。
    000 : FSR = ±6.144 V
    001 : FSR = ±4.096 V
    010 : FSR = ±2.048 V (デフォルト)
    011 : FSR = ±1.024 V
    100 : FSR = ±0.512 V
    101 : FSR = ±0.256 V
    110 : FSR = ±0.256 V
    111 : FSR = ±0.256 V
  • bit8 MODE。1;連続、0;ワンショット(デフォルト)
  • bit7、bit6、bit5 サンプルレート。
    000 : 8 SPS
    001 : 16 SPS
    010 : 32 SPS
    011 : 64 SPS
    100 : 128 SPS (デフォルト)
    101 : 250 SPS
    110 : 475 SPS
    111 : 860 SPS
  • bit4 COMP_MODE;コンパレータ。省略
  • bit3 COMP_POL ;コンパレータ。省略
  • bit2 COMP_LAT ;コンパレータ。省略
  • bit1、bit0 COMP_QUE[1:0]  ;コンパレータ。省略(デフォルト3h ディセーブル)
;電源を入れた直後のデフォルト設定値。 変換スタート、差動A0-A1チャネル、フルスケール±2.048V、ワンショット、128SPS、コンパレータは無効;1000010110000011h

 

●読みだしたコードの順番

 読み出すアドレス・ポインタ・レジスタは0x00です。最上位ビットが符号です。

  • 16ビット;2バイト、 D15 ~ D8 (1st data byte) - D7 ~ D0 (2nd data byte) 

I2Cのリピート・スタート・コンディションの問題となるタイミング

 i2cdetect -y 1

で0x48が読み出されるので、スレーブ・アドレスは0x48です。

 i2cget -y 1 0x48 0x00 w

で変換結果のレジスタを読み出しても0x0000なので、正しいデータが読み取れません。

 データシートに掲載されている読み出しのタイムチャートを見ると、最初にスレーブ・アドレスを送り、読み出しレジスタ0x00を書き込み、いったんストップ・コンディションにし、すぐさまスタート・コンディションにしてアドレスを送り、2バイトのレジスタを読み出します。

 しかし、同じようなタイムチャートが掲載されているLM75のように、この部分は本来リピート・スタート・コンディションにすべきところだと思われます。

 リピート・スタート・コンディションは、読み出しレジスタ0x00を書き込みんだAckの期間、SCLがLowの期間にSDAをLowからHighに上げ、そのあとにSCLをHighにし、SCLがHighの期間中にSDAをLowにすることでスタート・コンディションにもっていきます。

 ADS1115は、いったんストップ・コンディションになるため、ラズパイのI2Cライブラリはアドレスを見失ってしまうようです(推測)。

プログラム例 16ビット

 2017年8月現在、RASPBIAN JESSIE WITH DESKTOPのカーネルを確認します。

uname -a
4.9.40

 i2c-toolsも入っています。最初は、このツールを使います。ラズパイとADS1115をI2Cで接続します。エイダフルートのボード上にあるSDAとSCLのプルアップ抵抗は取り去ります。ラズパイの3番と5番にはプルアップ抵抗が入っています。

 Raspberry Piは、最初に、I2Cを利用する設定が必要です。メニューのPreferencesから、Raspberry Pi Configurationを開きます。

 I2CのEnabledにチェックを入れ、再起動します。

ラズパイには最初からドライバが入っている

 現在のOSは、必要なときにデバイスのドライバをロードして働きます。そうすることで、余計なドライバを最初からメモリにロードしなくて済むからです。

 /boot/overlaysのディレクトリにADS1115.dtboというデバイス・ドライバの記述が置いてあります。READMEには、下記の説明が掲載されています。

Name:   ads1115
Info:   Texas Instruments ADS1115 ADC
Load:   dtoverlay=ads1115,<param>[=<val>]
Params: addr                    I2C bus address of device. Set based on how the
                                addr pin is wired. (default=0x48 assumes addr
                                is pulled to GND)
        cha_enable              Enable virtual channel a.
        cha_cfg                 Set the configuration for virtual channel a.
                                (default=4 configures this channel for the
                                voltage at A0 with respect to GND)
        cha_datarate            Set the datarate (samples/sec) for this channel.
                                (default=7 sets 860 sps)
        cha_gain                Set the gain of the Programmable Gain
                                Amplifier for this channel. (Default 1 sets the
                                full scale of the channel to 4.096 Volts)

        Channel parameters can be set for each enabled channel.
        A maximum of 4 channels can be enabled (letters a thru d).
        For more information refer to the device datasheet at:
        http://www.ti.com/lit/ds/symlink/ads1115.pdf


 ラズパイが立ち上がる時に読み込むには、/boot/config.txtに下記の行を追加します。

dtoverlay=ads1115
dtparam=cha_enable,cha_cfg=0

 具体的には、sudo nano /boot/config.txtでエディタを立ち上げ、上記の2行を最後に追加します。CTRL-Oでリターン、CTRL-Xで終了し、rebootします。

 正常に読み込まれていると、lsmodを実行すると、ads1015 3728 0 という行が表示されます。

 すると、A-D変換が常に行われ、その最新のデータは、フォルダ/sys/class/hwmon/hwmon0/deviceに入っています。ファイル名in0_inputの数字0は、

0 : AINp = AIN0, AINn = AIN1
1 : AINp = AIN0, AINn = AIN3
2 : AINp = AIN1, AINn = AIN3
3 : AINp = AIN2, AINn = AIN3
4 : AINp = AIN0, AINn = GND
5 : AINp = AIN1, AINn = GND
6 : AINp = AIN2, AINn = GND
7 : AINp = AIN3, AINn = GND

0に対応しています。したがって差動入力A0-A1に測定する電圧源をつないだときは、in0_inputの内容を読み出します。mVの整数値で表示されます。

cat /sys/class/hwmon/hwmon0/device/in0_input

 ドライバを組み込んだ後、i2cdetect -y 1を実行すると、0x48の位置にUUと表示が出ます。

参考文献;http://www.jumpnowtek.com/rpi/Using-ads1115-ADCs-with-Raspberry-Pis.html

(2017/08/10)訂正;各種設定をするコンバージョン・レジスタ ->各種設定をするコンフィグ・レジスタ 

/boot/config.txtに下記の行を追加します。のところで1行だけの場合は、A0-GNDの設定になるので、2行目を追加します。

dtparam=cha_enable,cha_cfg=0