개발자/Arduino

아두이노 ADC 모듈 ADS1115 ADS1015

지구빵집 2023. 5. 2. 14:47
반응형

 

 

 

i2c 통신을 이용하여 조도센서, 가변저항 등의 아날로그 신호를 입력받을 수 있는 외장 adc 모듈입니다. i2c 통신이 가능한 MCU에 연결하면 4채널의 아날로그 입력 핀을 사용할 수 있습니다.

 

이 제품의 특징은 ADDR 핀에 VCC, GND, SCL, SDA 핀 중 어떤 핀을 연결하는지에 따라서 i2c 주소를 변경하여 사용할 수 있기 때문에 하나의 MCU에 최대 4개의 모듈을 장착할 수 있는 점과, 게인(Gain)을 조정하여 큰 신호부터 작은 신호까지(최대 범위 : 6.144V, 최소 범위 : 0.256V)를 입력받을 수 있는 점입니다.

 

ads1115와 ads1015는 거의 대부분이 동일하게 제작되어 있지만, ads1115는 해상도가 더 높고, ads1015는 초당 샘플링이 더 높은 것으로 구분이 됩니다. 

 

 

ADS1115와 ADS1015

 

 

Specification

 

  • ads1115 해상도(분해능) : 16bit (0~65535)
  • Programmable Sample Rate : 8~860 Samples/s
  • 동작 전압 : 2.0V ~ 5.5V
  • 동작 전류 : 컨티뉴어스 모드 : 150µA, 싱글 샷 모드 : 자동 셧다운
  • Internal Low-Drift Voltage Reference
  • 내장 오실레이터(발진기)
  • 내장 PGA(Programmable Gain Amplifier) : 최대 x16
  • i2c 인터페이스(i2c 주소 변경 가능)
  • 4채널 신호 입력핀 

 

연결도와 핀 구성

 

 

ADS1115 연결도

 

모듈의 동작을 확인하기 위해서 아날로그 전압을 출력할 수 있는 10k가변저항을 이용한 회로를 사용했습니다. 아래 가변 저항을 연결한 그림을 참고하세요.  

 

 

ADS1115와 가변저항 연결도

 

핀 연결 구성

 

아두이노
ADC 모듈
VCC
VDD
GND
GND
A4
SDA
A5
SCL

 

코드를 입력하기 전에 아두이노 환경에 adc 라이브러리를 설치해야 합니다. adafruit / Adafruit_ADS1X15 라이브러리 주소를 참고하세요. 설치방법 간단하게 알려드리면 위 링크는 Github 링크인데 좌측 code 를 눌러 zip 파일을 다운 받습니다. 그리고 아래 두 번째 이미지의 스케치 - include library 로 가서 add zip library를 선택 후 다운 받은 zip 파일을 선택해주면 됩니다.

 

 

 

 

 

더 간단한 두번째 방법은 아래 이미지에서 처럼 툴 - manage library로 가서 검색해서 설치합니다. 적당한 라이브러리를 설치하는 것을 잊지 마세요. 설치 후 File - Example 메뉴에서 아마도 예제를 발견하실 수 있습니다. 부디~^^ 

 

 

 

 

 

 

ADS1115 예제 소스 코드

 

#include <Wire.h>
#include <Adafruit_ADS1015.h>

//ADDR 핀에 아무것도 연결되어 있지 않을 때 기본 i2c 주소(0x48)를 사용하여 동작합니다.
Adafruit_ADS1115 ads1115; 

//ADDR핀을 이용하여 i2c 주소를 변경하였을 때에는 아래 소스코드를 이용합니다.
//Adafruit_ADS1115 ads1115(0x49);

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Hello!");
  Serial.println("Getting single-ended readings from AIN0..3");
  ads1115.begin();

  //Gain을 조정하여 최대 6.144V의 전압에대한 데이터를 출력하며, 1 bit당 0.1875mV의 전압으로 인식합니다.
  ads1115.setGain(GAIN_TWOTHIRDS); 
  Serial.println("ADC Range: +/- 6.144V (1 bit = 0.1875mV)");

  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
}

void loop(void)
{
  //입력 신호의 데이터를 저장할 변수를 선언합니다.
  float adc0, adc1, adc2, adc3; 

  //각 채널의 입력 신호를 읽고 변수에 저장합니다.
  adc0 = ads1115.readADC_SingleEnded(0); 
  adc1 = ads1115.readADC_SingleEnded(1);
  adc2 = ads1115.readADC_SingleEnded(2);
  adc3 = ads1115.readADC_SingleEnded(3);

  //각 채널에 입력된 신호의 데이터를 출력합니다.
  //신호핀에 아무것도 연결되어 있지 않으면 의미 없는 값이 출력됩니다.
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN0 Voltage : "); Serial.println(adc0*0.1875/1000);
//  Serial.print("AIN1: "); Serial.println(adc1);
//  Serial.print("AIN1 Voltage : "); Serial.println(adc1*0.1875/1000);
//  Serial.print("AIN2: "); Serial.println(adc2);
//  Serial.print("AIN2 Voltage : "); Serial.println(adc2*0.1875/1000);
//  Serial.print("AIN3: "); Serial.println(adc3);
//  Serial.print("AIN3 Voltage : "); Serial.println(adc3*0.1875/1000);
  Serial.println(" ");
  
  delay(1000);
}

 

 

코드 실행 결과는 아래와 같습니다.

 

 

ADA1115 코드 실행 결과

 

ADS1015 사용 예제 소스 코드

 

#include <Wire.h>
#include <Adafruit_ADS1015.h>

//ADDR 핀에 아무것도 연결되어 있지 않을 때 기본 i2c 주소(0x48)를 사용하여 동작합니다.
Adafruit_ADS1015 ads1015; 

//ADDR핀을 이용하여 i2c 주소를 변경하였을 때에는 아래 소스코드를 이용합니다.
//Adafruit_ADS1015 ads1015(0x49);

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Hello!");
  Serial.println("Getting single-ended readings from AIN0..3");
  ads1015.begin();

  //Gain을 조정하여 최대 6.144V의 전압에대한 데이터를 출력하며, 1 bit당 3mV의 전압으로 인식합니다.
  ads1015.setGain(GAIN_TWOTHIRDS); 
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV)");

  //                                                                ADS1015  ADS1115
  //                                                                -------  -------
  // ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV

}

void loop(void)
{
  //입력 신호의 데이터를 저장할 변수를 선언합니다.
  float adc0, adc1, adc2, adc3; 

  //각 채널의 입력 신호를 읽고 변수에 저장합니다.
  adc0 = ads1015.readADC_SingleEnded(0); 
  adc1 = ads1015.readADC_SingleEnded(1);
  adc2 = ads1015.readADC_SingleEnded(2);
  adc3 = ads1015.readADC_SingleEnded(3);

  //각 채널에 입력된 신호의 데이터를 출력합니다.
  //신호핀에 아무것도 연결되어 있지 않으면 의미 없는 값이 출력됩니다.
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN0 Voltage : "); Serial.println(adc0*3/1000);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN1 Voltage : "); Serial.println(adc1*3/1000);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN2 Voltage : "); Serial.println(adc2*3/1000);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.print("AIN3 Voltage : "); Serial.println(adc3*3/1000);
  Serial.println(" ");
  
  delay(1000);
}

 

 

 

 

 

참고

메카솔루션 i2c ADC 모듈 ADS1115와 ADS1015 사용하기  

 

 

 

 

반응형