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
- I2Cデータ転送速度;10 kHz~3.4 MHz
- I2Cのスレーブ・アドレス;ADDRピンをGNDにつなぐと0x48、VDDにつなぐと0x49、SDAにつなぐと0x4A、SCLにつなぐと0x4Bに設定できる。ボード上では10kΩでプルダウンされているので、購入時は0x48。SDAとSCL信号は10kΩでプルアップされている。ラズパイのI2Cのバス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には、下記の説明が掲載されています。
|
ラズパイが立ち上がる時に読み込むには、/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