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

12ビットA-DコンバータADS1015

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

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

ADS1015の主なスペック

  •  ビット数;12
  •  基準電圧;内蔵
  •  電源電圧; 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
  •  変換方式;ΔΣ(デルタ・シグマ)方式
  •  変換速度; : 128、250 、490 、920、1600 、2400 、3300、3300 SPS
  •  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 : 128 SPS
    001 : 250 SPS
    010 : 490 SPS
    011 : 920 SPS
    100 : 1600 SPS (デフォルト)
    101 : 2400 SPS
    110 : 3300 SPS
    111 : 3300 SPS
  • bit4 COMP_MODE;コンパレータ。省略
  • bit3 COMP_POL ;コンパレータ。省略
  • bit2 COMP_LAT ;コンパレータ。省略
  • bit1、bit0 COMP_QUE[1:0]  ;コンパレータ。省略(デフォルト3h ディセーブル)
;電源を入れた直後のデフォルト設定値。 変換スタート、差動A0-A1チャネル、フルスケール±2.048V、ワンショット、1600SPS、コンパレータは無効;1000010110000011h

 

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

 読み出すアドレス・ポインタ・レジスタ(コンバージョン・レジスタ)は0x00です。最上位ビットが符号です。2バイト目のD3、D2、D1、D0は'0'が読み出されます。

  • 12ビット左詰め;2バイト、 D15 ~ D8 (1st data byte) - D7 ~ D4 (2nd data byte) 

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

 i2cdetect -y 1

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

 i2cget -y 1 0x48 0x00 w

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

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

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

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

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

プログラム例 

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

uname -a
4.9.40

 購入したボードは、ピンヘッダをはんだ付けします。

 ピンヘッダをブレッドボードに挿しておくと、作業がしやすいです。

 プルアップ抵抗を、コテ先にはんだを少し盛って、抵抗を温めると、チップ抵抗が簡単に外れます。

 ラズパイとADS1015をI2Cで接続します。電源は1番の3.3Vと6番のGNDをつなぎます。

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

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

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

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

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

Name: ads1015
Info: Overlay for activation of Texas Instruments ADS1015 ADC over I2C
Load: dtoverlay=ads1015,<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. (default=true)
   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=4 sets 1600 sps)
   cha_gain       Set the gain of the Programmable Gain
                       Amplifier for this channel. (default=2 sets the
                       full scale of the channel to 2.048 Volts)

   Channel (ch) 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/ads1015.pdf


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

dtoverlay=ads1015

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

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

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

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

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

cat /sys/class/hwmon/hwmon0/device/in4_input

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

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