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
- 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 Channel (ch) parameters can be set for each enabled channel.
|
ラズパイが立ち上がる時に読み込むには、/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