5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (35) A-Dコンバータの利用10 I2C ADS1110
■小型基準電源内蔵16ビット
ADS1110は小さなパッケージに入っているので、実装するときに面積が少なくて済みます。基準電圧も電源からではなく内蔵されているので、単独で高い分解能が得られます。
ボード化されたADS1110は、ebayで購入しました(執筆時400円)。Digi-KeyでICは約500円です。
●ADS1110のスペック
- ビット数;16
- チャネル数;1
- 基準電圧;2.048V ±0.05%、ドリフト5ppm/℃
- 電源電圧; 2.7~5.5V
- 消費電流;240µA
- 入力;差動、シングルエンド
- 変換方式;ΔΣ型
- データ・レート;15SPS(16ビット)
- インターフェース;I2C
- I2C転送速度;最大3.4MHz
- スレーブ・アドレス;発注時に指定できる。表面にED0の印字は0x48
- プログラマブル・ゲイン・アンプ;1/2/4/8倍が設定できる
●接続
プルアップ抵抗10kΩがSDA/SCLに入っているので、取り去ります。次のように接続しました。シングルエンドの入力時はVin-をGNDに接続し、Vin+から入力します。
ADS1110 | ラズパイ |
---|---|
SDA | 3番ピン |
SCL | 5番ピン |
GND | 6番ピン |
Vcc | 1番ピン 3.3V |
Vin- | - |
Vin+ | - |
i2cdetect -y 1 で接続を確認しました。スレーブ・アドレスは0x48です。
●レジスタ
◆設定レジスタ デフォルト b10001100
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
ST/DRDY | 0 | 0 | SC | DR1 | DR0 | PGA1 | PGA0 |
SC=0は連続変換、'1'は1回のみの変換。 DR1,DR0はサンプリング・レート。デフォルト15SPSで16ビット。 PGA1,PGA0はアンプの増幅度。'00'=×1、'01'=×2、'10'=×4、'11'=×8。 |
◆出力レジスタ
最上位ビットD15は符号です。
b15 | b14 | b13 | b12 | b11 | b10 | b9 | b8 |
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 |
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
●プログラム
ディファレンシャル入力、PGAアンプは×1の測定です。
#!/usr/bin/env python
import smbus
import time i2c = smbus.SMBus(1)
addr=0x48
Vref=2.048
config = 0b10001100
i2c.write_byte(addr, config)
def sign16(x):
return ( -(x & 0b1000000000000000) | (x & 0b0111111111111111) )
#main while 1: data = i2c.read_i2c_block_data(addr,config,2) data16 = (data[0]<<8 | data[1]) dataDiff = sign16(int(hex(data16),16)) print (round((Vref * dataDiff / 32767),5)) time.sleep(1)
実行結果です。電池式電圧発生器で設定しています。
DMMの読み[V] | 表示値[V] |
---|---|
-0.60572 | -0.60814 |
0.60572 | 0.60827 |
1.2899 | 1.29316 |
2.02784 | 2.03119 |
シングルエンドです。
DMMの読み[V] | 表示値[V] |
---|---|
0.56647 | 0.56652 |
1.50133 | 1.5018 |
2.02952 | 2.02975 |
PGAを8倍(config = 0b10001111)、4倍(config = 0b10001110)の増幅に変更します。電圧は0.0930Vを設定、ディファレンシャル入力です。測定結果は、8倍は0.71533V、4倍は0.35932Vでした。
測定時の室温は18℃でした。
※当初、電圧発生器に据え置き型のアドバンテストTR6142を利用していました。ディファレンシャル入力では、設定した電圧に比べて2%程度の誤差が出ました。シングルエンドでは約1%です。測定中に指でボードを抑えると、電圧誤差はだんだん少なくなり、約1%までに収まりました。このようなバラックで組み立てた状態だと、確認をしていませんが、AC100Vの誘導の影響を受けているのかもしれません。
※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルは、uname -a で確認。4.9.67でした。
※プログラムを仮にads1110.pyと/home/piに保存すると、sudo chmod 755 ads1110.py で実行権を付け、ターミナルから、python ads1110.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、リターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで改行してください。
※I2Cの有効化は、この説明を参照ください。1-Wireと同じく、I2CやSPIもEnableにチェックを入れています。
※DMMはケースレー2000を使いました。