1-4.RaspberryPiでI2C(ADS1115の動作)
2020/1/08
ADS1115をRaspberry piで動作させてみた。Pythonで動かそうと思ったのですが、pillowがうまく認識せず対応方法が1日かけてもわからなかったので、あきらめてC言語で作ることにしました。(あとでどちらにしろC言語で作る予定だったので良いが…)
I2Cはレジスタの読み方とかなんとなくわかるのですが、このチップ特有というのかI2Cのアクセスが特有というのか、値が逆転したりとかの意味がよくわかってないのでカットアンドトライで苦労しました。
正直ただ動作確認したい人向けのやり方なので、ドライバとかあるのであればそちらを使用したほうが良いと思います。
●回路図

●動作確認
ADS1115に配線する。I2C動作なので4本配線すればOK。まずは動作確認をするため、下記①②を行う。
①回路が正しく配線できたかを確認する。
②手打ちで値を読み取る。
①
「i2cdetect -y 1」でLCDの返答を確認する。0x48はADS1115。デバイスが見えているので回路は正しい。
@raspberrypi:~/lcd/Raspberry-ssd1306$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
②
手動でAN1の値を読み込む。初期値はそのままでは読み込めないので
@raspberrypi:~/temp$ i2cset -y 1 0x48 0x01 0x85d3 w
@raspberrypi:~/temp$ i2cget -y 1 0x48 0x00 w
0xa02c ←測定結果が 1.428V
8bitの上と下を入れ替える。
0x2ca0
= 11424 なので V=11424 * 62.5[uA] * 2 = 1.428Vになる。
正直なところ、2倍しないといけない理由がわからないのですが、とりあえずプログラム組む前の動作確認としてはこれで十分でしょう…(15bit目がプラスとマイナスの切り分け部分になるから?2の補数とかいうやつだっけ?大学のとき習ったような…よく覚えてない…) 0x01に書き込むレジスタの値を間違えてました…
●プログラムを動作させる。
AIN=1の値を読み込むプログラム。wiringPiをapt-getでインストールする必要がある。
ファイル名:test.c
#include <stdio.h>
#include <stdint.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define DEV_ADDR 0x48
int main(int argc, char **argv) {
int i;
int fd;
int data;
int x,rms;
x=0;
rms=0;
fd = wiringPiI2CSetup(DEV_ADDR);
wiringPiI2CWriteReg16(fd,0x01,0x85d3);
data = wiringPiI2CReadReg16(fd,0x00);
//wiringPiI2CWrite(fd,0x01);
//date = wiringPiI2CRead (fd);
printf("%d\n",data);
x = ((data & 0x00ff00ff) << 8) | ((data >> 8) & 0x00ff00ff);
printf("%d\n",x);
rms = x * 0.0625 * 2;
printf("%d\n",rms);
}
プログラムをコンパイルする。プログラムを動作すると下記の通りになる。プログラムはプラスの値のみしか対応していないのでマイナスの値はプログラムを変える必要があります。
@raspberrypi:~/temp$ cc -o i2ctest test.c -lwiringPi ←コンパイル
@raspberrypi:~/temp$ ./i2ctest ←実行すると
12332 ←読み込み値(0x302C)
11312 ← 逆転の値(0x2C30)
1414 ←電圧値(1414mV)
●上記プログラムの間違えについて(2021/1/14)
上記プログラムの0x01hの0x85d3は0xe3d4にすることで2倍する必要がありませんでした。
0x85d3は0xe3d4は10,9,8,6,5,2,1bitが違います。よく見るとFSRが±4.096 V(125uV)になっており、±2.048 V(62.5uV)の設定と勘違いしていたため、62.5uVで2倍する必要があったというオチでした…
とりあえずこのICにアクセスするにはI2Cの16bit書き込みと読み込みは値を「8bit単位で逆転させる」必要があるという認識だけあれば良いかと思います。(i2c-toolとwiringPiは両方とも逆転させる必要ありました。)
●ADS1115モジュール
・ADS1115搭載 16BitADC 4CH 可変ゲインアンプ付き -SWITCH SCIENCE \2354-
・HiLetgo 2個セット ADS1115 4チャンネル 16ビット I2C ADC モジュール ゲインアンプ Arduino Rpiと互換 \940- (私はこれを買いました。)
[参考]
Raspberry Pi - ラズベリー・パイ でのADS1115動作確認|teratail
Umbrella RaspberryPi ADS1115でK型熱電対を使う (fc2.com)
c - ビットスワップの方法 - スタック・オーバーフロー (stackoverflow.com)
作成日:2021/01/10