5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (36) A-Dコンバータの利用11 I2C LTC2461
■安定な基準電圧源を内蔵
LTC2461は、基準電源を内蔵した16ビットのA-Dコンバータです。60Hzのノッチ・フィルタが実装されているので、商用電源の誘導性ノイズに強くなっています。ディファレンシャル入力はLTC2463です。DIP化ボードは市販されていないようです。基準電圧源が1.25Vなので、入力電圧範囲は狭いですが、分解能はとれます。
●LTC2461の主なスペック
- ビット数;16
- チャネル数;シングル・エンド1チャネル
- 基準電圧;内蔵。1.25V 初期精度0.1%
- 電源電圧; 2.7~5.5V
- 消費電流;動作時2.5mA(5.5V時)
- 変換レート;60もしくは30回/秒
- インターフェース;I2C
- I2C転送速度;最大400kHz
- スレーブ・アドレス;0x14(デフォルト)。A0ピンをVccにつなぐと0x54に変更できる
●DIP化
MSOPパッケージのLTC2461をDigi-Keyから購入しました。リード線のピッチは0.65mmの12ピンです。秋月電子通商のDIP変換ボードにはんだ付けしてから利用しました。はんだ付けは、こちらを参照ください。
マニュアルに従って、Vcc、REFout、Comp端子からは0.1uFの積層セラミック・コンデンサをGND端子に接続しました。スレーブ・アドレス設定のA0ピンはGNDに落とし、0x14に設定しました。REF-端子はGNDへつなぎました。
●接続
ラズパイとは次のように接続し、電源を入れた後、i2cdetect -y 1で確認をしました。
ラズパイのGPIO 接続先 |
LTC2461 | ラズパイのGPIO 接続先 |
|||
---|---|---|---|---|---|
- | REFout | 1番ピン | 12 | Vcc | 1番 3.3V |
- | Comp | 2 | 11 | GND | 6番 GND |
6番 GND | A0 | 3 | 10 | GND | 6番 GND |
6番 GND | GND | 4 | 9 | IN | |
5番 SCL | SCL | 5 | 8 | REF- | 6番 GND |
3番 SDA | SDA | 6 | 7 | GND | 6番 GND |
0x14にありました。複数のLTC2461を利用するときに使う0x77も見えています。
●レジスタ
◆設定関係
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
EN1 | EN0 | SPD | SLP | - | - | - | - |
EN1,EN0が'10'で、次の2ビットが有効になる。 SPD;スピード・ビット。SLP;スリープ・ビット |
◆出力レジスタ
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 |
●プログラム
通常はスリープしていますが、I2Cから読み出しが行われると、新しい変換を開始します。したがって、読み出したデータはひとつ前の古いデータです。設定時に書き込むデータは、EN1とEN2のイネーブル・ビットはデフォルトの’10’、スピード・ビットSPDはデフォルトの60Hzではなくバックグランド・オフセット較正が行われる30Hzの'1'に変更し、リファレンス電圧をスリープ(SLPビット)させないようにデフォルトの'0'のままにしました。下位4ビットはダミーの'f'とし、0xafを書き込みます。
書き込んだ直後に読み出すとLTC2461はビジー状態のため、0.1秒待ちます。
#!/usr/bin/env python
import smbus
import time
i2c = smbus.SMBus(1)
addr=0x14
Vref=1.25
def swap16(x):
return (((x <<8) & 0xff00) | ((x >> 8 ) & 0x00ff))
#main
i2c.write_byte(addr, 0xaf)
time.sleep(0.1)
while 1:
data = i2c.read_word_data(addr,0x01)
data16 = swap16(int(hex(data),16))
print (round((Vref * data16 / 65535 ),5))
time.sleep(1)
2バイト・データの読み出しでは、ダミーの0x01を送っていますが、LTC2461は無視してくれます。
●実行結果
電圧発生器で1.0000Vを設定したときの実行画面です。
※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルは、uname -a で確認。4.9.67でした。
※プログラムを仮にLTC2461.pyと/home/piに保存すると、sudo chmod 755 LTC2461.py で実行権を付け、ターミナルから、python LTC2461.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、リターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで改行してください。
※I2Cの有効化は、この説明を参照ください。1-Wireと同じく、I2CやSPIもEnableにチェックを入れています。
※電圧発生器はアドバンテストTR6142、DMMはケースレー2000を使いました。