Skip to main content

Grove- I2C ADC

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

Grove - I2C ADC は、ADC121C021 をベースにした 12 ビット精度の ADC モジュールです。このモジュールは、一定の基準電圧を提供することで、アナログセンサーから収集される値の精度を向上させます。また、アドレスが変更可能であるため、最大で 9 つの I2C ADC を同時に使用することができます。さらに、このモジュールは自動スリープ機能を備えており、電力消費を大幅に削減します。

バージョン

バージョンデフォルト I2C アドレス
Grove - I2C ADC v1.0/v1.10x55
Grove - I2C ADC v1.20x50

特徴

  • 低消費電力
  • 高精度
  • 自動パワーダウンモード
  • アドレス変更可能
tip

Grove モジュールの詳細については、Grove System を参照してください。

仕様


項目典型値単位
動作電圧5.0VDC
解像度12ビット
サンプルレート188.9ksps
寸法40X20mm

対応プラットフォーム


ArduinoRaspberry Pi
caution

上記で対応プラットフォームとして記載されているものは、モジュールのソフトウェアまたは理論的な互換性を示しています。ほとんどの場合、Arduino プラットフォーム向けのソフトウェアライブラリやコード例のみを提供しています。すべての可能な MCU プラットフォーム向けにソフトウェアライブラリやデモコードを提供することはできません。そのため、ユーザー自身でソフトウェアライブラリを作成する必要があります。

ハードウェア概要


J1: Arduino IICインターフェースに接続するために使用され、Grove - I2C ADCの出力インターフェースとして機能します。

J2: アナログセンサーを接続するために使用され、Grove - I2C ADCの入力インターフェースとして機能します。

U1: ADC121C021 IC、12ビットアナログ-デジタルコンバーター

黒い線で囲まれたエリアはIICアドレスを設定するために使用されます。ADDR0とADDR1は出荷時にLに接続されています。基板上で少し改造することで、これらを"H"または浮動状態("H"にも"L"にも接続されていない状態)に変更することができます。詳細はリファレンスを参照してください。

はじめに


Arduinoを使用する場合

Grove - I2C ADCには2つのインターフェースがあります:入力ソケット(J2)と出力ソケット(J1)。アナログセンサーを入力ソケットに接続し、Groveケーブルを介してI2C ADCをArduino/Seeeduinoに接続します。

Grove - ガスセンサーを例に取り、Grove - I2C ADCを使用してセンサーのデータを読み取る方法を学びます。 ハードウェアの接続は以下のようになります:

以下のコードを使用してガスセンサーの値を読み取ることができます。

#include <Wire.h>
 
#define ADDR_ADC121 0x50 // v1.0 & v1.1の場合、I2Cアドレスは0x55
 
#define V_REF 3.00
 
#define REG_ADDR_RESULT 0x00
#define REG_ADDR_ALERT 0x01
#define REG_ADDR_CONFIG 0x02
#define REG_ADDR_LIMITL 0x03
#define REG_ADDR_LIMITH 0x04
#define REG_ADDR_HYST 0x05
#define REG_ADDR_CONVL 0x06
#define REG_ADDR_CONVH 0x07
 
unsigned int getData;
float analogVal=0; // 変換
void init_adc()
{
Wire.beginTransmission(ADDR_ADC121); // デバイスに送信
Wire.write(REG_ADDR_CONFIG); // 設定レジスタ
Wire.write(0x20);
Wire.endTransmission();
}
 
void read_adc() //unsigned int *data
{
 
 
Wire.beginTransmission(ADDR_ADC121); // デバイスに送信
Wire.write(REG_ADDR_RESULT); // 結果を取得
Wire.endTransmission();
 
Wire.requestFrom(ADDR_ADC121, 2); // デバイスから2バイトを要求
delay(1);
if(Wire.available()<=2)
{
getData = (Wire.read()&0x0f)<<8;
getData |= Wire.read();
}
Serial.print("getData:");
Serial.println(getData);
delay(5);
Serial.print("The analog value is:");
Serial.print(getData*V_REF*2/4096);
Serial.println("V");
}
void setup()
{
Serial.begin(9600);
Wire.begin();
init_adc();
}
 
void loop()
{ read_adc();//adcRead);
delay(50);
}

上記のコードでは、Vrefを3.0Vとして定義しています。この値はI2C ADCモジュールによって決定されます。この基準電圧はマイクロコントローラーによって生成されるものよりも正確です。また、VAとGND間の電圧を測定し、その値を上記コードの3.00に置き換えることでさらに正確にすることができます。

コードをアップロードしてください。

その後、シリアルモニターを開き、値を読み取ります:

注意

Grove - I2C ADCのアドレスは変更可能であり、再定義することができます。これには基板上でのハードウェア改造が必要です。同時に複数のI2C ADCを使用する場合は、以下のリファレンス部分の指示に従ってください。同時に使用可能なI2C ADCの最大数は9ですが、Grove - Base Shield V1.2にはI2Cソケットが4つしかありません。4つ以上のI2C ADCを使用する場合は、Grove - I2C Hubを使用してI2Cソケットを増やしてください。

Beaglebone Greenを使用する場合

BBG上でプログラムを編集するには、Cloud9 IDEを使用できます。 Cloud9 IDEに慣れるための簡単な演習として、BeagleBoneの4つのユーザープログラム可能なLEDの1つを点滅させる簡単なアプリケーションを作成するのが良いでしょう。

Cloud9 IDEを初めて使用する場合は、このリンクを参照してください。

ステップ1: Grove - UARTソケットをGrove - GPIOソケットとして設定します。このリンクに従ってください。

ステップ2: 右上の"+"をクリックして新しいファイルを作成します。

ステップ3: 以下のコードを新しいタブにコピー&ペーストします。

from Adafruit_I2C import Adafruit_I2C
import time
 
ADDR_ADC121 = 0x50
 
REG_ADDR_RESULT = 0x00
REG_ADDR_ALERT = 0x01
REG_ADDR_CONFIG = 0x02
REG_ADDR_LIMITL = 0x03
REG_ADDR_LIMITH = 0x04
REG_ADDR_HYST = 0x05
REG_ADDR_CONVL = 0x06
REG_ADDR_CONVH = 0x07
 
i2c = Adafruit_I2C(ADDR_ADC121)
 
class I2cAdc:
def __init__(self):
i2c.write8(REG_ADDR_CONFIG, 0x20)
 
def read_adc(self):
"ADCデータを読み取ります(0-4095)。"
data_list = i2c.readList(REG_ADDR_RESULT, 2)
#print 'data list', data_list
data = ((data_list[0] & 0x0f) << 8 | data_list[1]) & 0xfff
return data
 
if __name__ == '__main__':
# Grove - I2C ADCをBeaglebone GreenのI2C Groveポートに接続します。
adc = I2cAdc()
while True:
print 'sensor value ', adc.read_adc()
time.sleep(.2)

ステップ4: ディスクアイコンをクリックしてファイルを保存し、.py拡張子で名前を付けます。

ステップ5: Grove I2C ADCをBBGのGrove I2Cソケットに接続します。

ステップ6: コードを実行します。ターミナルが2秒ごとにAD値を出力することが確認できます。

リファレンス

I2Cアドレス設定

ADC I2Cには、ADR0とADR1によって決定される7ビットのハードウェアアドレスがあります。ADR0とADR1はデフォルトで基板内でLに接続されていますが、変更することができます。例えば、ナイフを使用してLとADR0の接続を切断する(以下の画像参照)ことで、ADR0の状態を浮動状態(何にも接続されていない状態)にすることができます。そして、この時点でADR0とHをはんだ付けすると、ADR0の値をHに設定することができます。

ハードウェア I2C アドレスと ADR0 および ADR1 の値の関係は、以下の表に示されています。

スレーブアドレス[A6 - A0]ADR0 および ADR1 の入力状態
ADR1ADR0
1010000(0x50)浮動浮動
1010001(0x51)浮動L
1010010(0x52)浮動H
1010100(0x54)L浮動
1010101(デフォルト 0x55)LL
1010110(0x56)LH
1011000(0x58)H浮動
1011001(0x59)HL
1011010(0x5A)HH

I2C ADC は精度をどの程度向上させるのか?

以下は、I2C ADC がアナログセンサーの精度をどの程度向上させるかを示すための実験です。まず、Grove - Gas Sensor(MQ5) を Arduino/Seeeduino のアナログポートを通じて直接収集した値を確認します。

以下のコードをアップロードしてデータを取得します。

    /*
* Grove - Gas Sensor(MQ5)
*
* ガスセンサーは関連するガス濃度を検出します。
* Arduino は analogRead を通じて結果を取得します。ガス濃度は
* 0~1 の範囲で、出力が大きいほどガスが濃いことを示します。
* このデモではセンサーを A0 に接続します。
*
* By: https://www.seeedstudio.com
*/
#define Vref 4.95
void setup() {
Serial.begin(9600);
}

void loop() {
float vol;
int sensorValue = analogRead(A0);
vol=(float)sensorValue/1023*Vref;
Serial.print("センサー値は ");
Serial.println(sensorValue);
Serial.print("アナログ値は ");
Serial.print(vol);
Serial.println("V");
delay(100);
}

結果は以下の通りです:

デフォルトでは、Vref は Arduino によって生成され、理論的には 5V ですが、実際には変動する値であり、最終データに偏差をもたらします。この種の不正確さは、Grove - I2C ADC を使用することで回避されます。なぜなら、Grove - I2C ADC は厳密な 3.0V を Vref として提供するからです。

比較のために、同じ条件下で Grove - I2C ADC を使用した回路で収集されたセンサー値は以下の通りです:

実際の条件にどちらの結果がより近いかを確認するために、センサーの SIG ピンと GND ピン間の電圧をマルチメーターで測定します。

回路図オンラインビューア

リソース


プロジェクト

BeagleBone Green 温度モニターを Artik Cloud に接続
BeagleBone Green で収集した Grove 温度センサーの値を Artik Cloud に公開します。

技術サポート & 製品ディスカッション

弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルをご用意しています。

Loading Comments...